前言:
Redis集群是Redis提供的分布式数据库方案,集群通过分片(sharding)来进行数据共享,并提供复制和故障转移功能。
这里讲一下集群的节点、槽指派、命令执行、重新分片、转向、故障转移、消息等。
1.节点
一个redis集群由多个节点(node)组成,
CLUSTER MEET <ip> <port> 握手 把ip:port指定的节点添加到当前节点所在的集群
1.1.1节点启动
2.槽指派
redis集群通过分片的方式保存数据库中的键值对:集群的整个数据库分为16384个槽,每个键都是这些槽中的其中一个
这些槽属于集群中不同的节点,节点的clusterState.slots数组会保存自己负责的槽
当16384个槽都有节点在处理时,集群处于上线状态(ok),只要有任何一个槽没有得到处理,集群处于下线状态(fail)
3.在集群中执行命令
在集群上线状态下,客户端可以向集群发送数据命令了。
计算键属于哪个槽:
CRC16(key) & 16383 保证全部落在0-16383上的16384个槽上。
节点数据库的实现:
集群节点和单机服务器在数据库方面的唯一区别是:
节点只能使用0号数据库,单机Redis服务器没有该限制
4.重新分片
Redis集群的重新分片操作可以将任意数量已经指派给某个节点(源节点)的槽改为指派给另一个节点(目标节点),并且相关槽所属的键值对也会从源节点移动到目标节点。重新分片操作可以在线(online)进行,集群不需要下线。(比如对redis集群添加一个节点,对数据进行重新分片操作)
5.ASK错误
例如:假设节点7002正在向节点7003迁移槽16198,这个槽包含“is” 和“love ”两个键,其中键“is”还留在节点7002,而键“love”已经被迁移到节点7003。
如果向7002发送关于键“is“ 的命令,会直接被节点7002执行:
127.0.0.1:7002> GET "is"
"you get the key 'is'"
而如果向7002发送关于键“love“ 的命令,那么客户端会先被转向节点7003,然后再次执行命令:
127.0.0.1:7002> GET "love"
-> Redirected to slot [16198] located at 127.0.0.1:7003
"you get the key 'is'"
127.0.0.1: 7003>
ASK错误和MOVED错误的区别:
6.复制和故障转移:
将7004,7005两个节点添加到集群里面,这两个节点可设定为节点7000的从节点
7.消息
集群中各个节点通过发送消息来进行通信。
节点发送的消息分为以下5种: