目录
五种消息
MEET消息:cluster meet命令,会请求接收者着加入自己所在的集群,所谓的加入,就是两个节点各自创建对方的node实例,并要求通知其余节点新节点的加入
PING消息:心跳检测,1、从所有的列表中随机选出5个,然后向这个5个节点中最长时间没联系的节点发送PING消息;2、如果有节点未联系的时间超过阈值,也会触发PING消息发送,防止饥饿产生。通过这个消息,集群中的所有节点都互相联系成网络;
PONG消息:1、接收到MEET消息和PING消息,需要回复PONG;2、如果需要刷新其他节点中该节点的信息,也需要发送PONG消息
注意:MEET、PING、PONG,发送这个几个消息的时候,会同时挂上自己节点列表中随机选择的两个节点信息,这样达到节点交换集群信息的目的
FAIL消息:节点A判断出节点B下线,则会发送关于节点B下线的FAIL广播消息,所有接收到这个消息的节点,会将节点B置为下线状态
PUBLISH消息:节点收到这个publish命令,会执行这个这个命令,并且广播PUBLISH消息,通知其他节点执行publish消息。
故障检测和转移
1、节点会通过PING消息不断通信,如果某个节点未返回PONG,则标记为“疑似下线”;
2、节点通过PING、PONG消息不断更新节点状态
3、当节点判断出超过半数主节点标示某个节点B下线,则发送FAIL消息,通知其他节点下线节点B
4、当节点B的从节点接收到自己的主节点下线,则开始故障转移
5、从节点广播消息CLUSTERMSG_TYPE_FAILOVER_AUTH_REQUEST,要求有效主节点(有分配槽的主节点)进行投票
6、接收到投票消息的节点,如果自己有投票权,且还没有对其他节点投过票,则返回CLUSTERMSG_TYPE_FAILOVER_AUTH_ACK,表示支持该从节点晋升为主节点
7、从节点统计自己收到的票数是否是否超过半数,超过则晋升为主节点
8、如果一个配置纪元中,没有从节点晋升为主节点,则再次进行投票
9、被选中的节点,会执行slaveof no one,成为主节点
10、新主节点撤销所有旧主节点槽的指派,并将其负责的槽都指派给自己
11、通过PONG消息,通知其他节点更新主节点信息,并更新槽信息
12、新主节点开始执行命令工作
集群结构
通过这样的一个数据结构,每一个实例节点都拥有了一个集群的全貌信息