CLUSTER info:查看集群的状态
CLUSTER NODES:查看所有节点信息
A.节点之间建立连接
CLUSTER MEET [node_ip] [node_port] 复制代码
节点A:127.0.0.1 7000
节点B:127.0.0.1 7001
1.客户端连接上节点A,并在节点A上执行命令CLUSTER MEET 127.0.0.1 7001
,节点A先存储该节点数据。
2.根据该命令,节点A根据命令向节点B发送meet消息。
3.节点B接收到节点A的meet消息后,存储节点A的信息,并回复pong消息证明自己的存在
4.节点A接收到pong的回复消息后,回复ping消息告知节点B已经接收到节点B的回复消息
B.设置槽位
CLUSTER ADDSLOTS [slot1]... 复制代码
当16384个槽位全部分配完毕后,CLUSTER info
查看集群状态为ok
,各节点信息可通过CLUSTER NODES
查看
至此,节点A会将自己所分配的槽位信息通过消息通知其他节点,其他节点同样也会通过消息把自己所分配的槽位通知集群内的节点
C.重新分片
# 把指定的槽位迁移往目标节点 CLUSTER SETSLOT [slot] MIGRATING [node_ip] [node_port] # 把指定的槽位从目标节点导出 CLUSTER SETSLOT [slot] IMPORTING [node_ip] [node_port] 复制代码
无论是新增节点还是删除节点,集群的槽位分配由以上两个命令控制。
在槽位分片的过程中,如果客户端请求通过CRC16(key)到槽位所在的节点,如果这个槽位正好处于迁移过程中,那么当前节点会检查对应的key是否已经被迁移出去。
如果key没有被迁移出去,那么直接处理;
如果key被迁移出去,那么会产生一个ASK错误,告知客户端应该向哪个目标节点请求对应的key;此时客户端需要向目标节点发送ASKING给真正的目标节点请求才能处理成功。否则就会产生MOVED错误
D.故障转移
【节点下线标准】
1.集群中每个节点都会向其他节点发送PING消息,用于检测对方是否在线。
2.一旦某一个节点没有在规定的时间内回复消息,那么就会被暂定为主观下线状态
3.集群中各节点间又会同步节点下线信息,如果在一个集群中,半数以上的主节点都判定某个主节点为疑似下线,那么这个主节点就被标记为【客观下线】
【故障转移过程】
当从节点发现正在复制的主节点已经客观下线后,开始进行故障转移;
1.选举新的主节点。
参与竞争的从节点向所有具有投票权的主节点广播消息,让对方投自己一票,如果获取的票数大于一半的话,那么该从节点就被选举为新的主节点。如果在这轮选举中没有任何从节点得票数能够超过一半,那么重新开始下一轮投票。
2.被选举出来的从节点执行SLAVEOF no one
命令,让自己成为master节点
3.新的master节点会把之前主节点的槽位指向自己
4.最后向集群中广播消息,告知其他节点,自己已经完成了从节点转换为主节点的过程了
消息
【MEET消息】
使用该消息是为了是目标节点加入集群。如果目标节点还有从节点,那么从节点也会加入集群。
【PING消息】
集群中各节点会每隔一秒就会发送ping消息来检查对方是否在线。如果在一定时间内没有得到回复,那么就会标记对方为主观下线状态,当一定数量(超过半数)的节点任务目标节点为主观下线的话,那么就判定该节点为客观下线,进入故障转移阶段。
【pong消息】
用于回复MEET消息或PING消息。在集群故障转移完毕的时候,通过广播PONG消息告知其他节点已经完成故障转移。
【FAIL消息】
当节点A发现节点B在一定时间内没有回复自己的PING消息时,将节点B置为主观下线状态,并向集群广播关于节点B的FAIL消息