REPLICATION 来设置从节点,当服务器接收到该命令之后,该节点让自己成为指定节点的从节点,并且开始对主节点进行复制:
接收到该命令的节点首先会在clusterState.nodes字典中找到node_id所对应的clusterNode结构,并将自己的clusterState.myself.slaveof指针指向这个结构,记录当前节点正在复制的主节点。然后节点修改clusterState.myself.flags属性,关闭原本的REDIS_NODE_MASTER标识,打开REDIS_NODE_SLAVE标识,表示该节点已经变成了从节点。根据clusterState.myself.slaveof指向的clusterNode结构保存的ip地址和端口号,对主节点进行复制,相当于对从节点发送了SLAVEOF 命令。
故障检测 集群中每个节点都会定期向集群中其它节点发送PING消息,以此来检查对方是否在线,如果接收PING消息的结点在规定的时间内没有返回PONG消息,那么发送PING消息的节点会将接收消息的PING节点标记为疑似下线(PFAIL),修改节点对应的clusterNode结构的flags属性,打开REDIS_NODE_PFAIL标识。之后节点A会把节点B的疑似下线消息传播给集群中其它节点,当结点C通过消息获知节点B进入疑似下线状态时,把节点A发送的节点B的下线报告记录到B对应的clusterNode结构的fail_reports链表中。当一个集群中半数以上负责处理槽的主节点都将某个主节x点报告为疑似下线时,那么这个主节点将会被标记为下线(FAIL),并发送一条节点x的FAIL消息通知其它主节点主节点x已下线。
故障转移 当集群检测到故障之后,进行故障转移,故障转移步骤:
从下线的主节点中的从节点中推选一个新的主节点,和Sentinel选举领头类似,采用Raft算法。被选中的从节点执行SLAVEOF no one命令,成为新的主节点。新的主节点撤销所有堆已下线主节点的槽指派,并将这些槽全部指派给自己。新的主节点向集群中广播一条PONG消息,通知其它节点本节点已经由从节点变成了主节点。新的主节点开始接收和自己负责处理的槽有关的命令,故障转移完成。
集群消息 集群中节点消息主要有五种:
MEET:将消息接收这添加到集群中。PING:集群中每隔一秒会从已知节点列表中随机选出五个节点,然后对这五个中最长时间没有发送过PING消息的节点发送PING消息,以此来检测节点是否在线。此外,节点A最后以此收到节点B发送的PONG消息的时间距离当前时间超过了节点A的cluster-node-timeout选项设置时长的一半,那么节点A也会向节点B发送PING消息,防止节点A因为长时间没有随机选中节点B作为PING消息的发送对象而导致节点B的信息更新滞后。PONG:MEET和PING的回复消息。另外一个节点也可以通过PONG消息通知集群中其它节点本节点已经由从节点升级成了主节点。FAIL:当一个主节点A判断另一个主节点B已经进入FAIL状态时,节点A会向集群广播一条关于B的FAIL消息,所有收到该消息的节点都会把B标记为已下线。这时不使用Gossip协议的原因是Gossip协议会有延迟需要一段时间才能传播至整个集群,而当结点已下线时需要尽快完成故障转移。PUBLISH:当结点收到一个PUBLISH命令时,节点会执行该命令,并向集群广播一条PUBLISH消息,所有接收到这条PUBLISH消息额节点都会执行相同的命令。
|