参考 https://mp.weixin.qq.com/s/tlocdMlyI4Sx8UxfbuVjTw
https://developer.aliyun.com/article/779564
集群元数据维护机制
模型
算法
Gossip 协议
思想
在一个处于有界网络的集群里,如果每个节点都随机与其他节点交换特定信息,经过足够长的时间后,集群各个节点对该份信息的认知终将收敛到一致。
好处
集群节点的数量增加,每个节点的负载也不会增加很多,几乎是恒定的。这就允许 Redis Cluster 或者 Consul 集群管理的节点规模能横向扩展到数千个
节点间发送的消息类型
- MEET:通过「cluster meet ip port」命令,已有集群的节点会向新的节点发送邀请,加入现有集群,然后新节点就会开始与其他节点进行通信;
- PING:节点按照配置的时间间隔向集群中其他节点发送 ping 消息,消息中带有自己的状态,还有自己维护的集群元数据,和部分其他节点的元数据;
- PONG: 节点用于回应 PING 和 MEET 的消息,结构和 PING 消息类似,也包含自己的状态和其他信息,也可以用于信息广播和更新;
- FAIL: 节点 PING 不通某节点后,会向集群所有节点广播该节点挂掉的消息。其他节点收到消息后标记已下线。
单个节点内维护的元数据
- 【自己视角下的】当前集群状态
- 【自己视角下的】集群中各节点所负责的 slots信息,及其migrate状态
- 【自己视角下的】集群中各节点的master-slave状态
- 【自己视角下的】集群中各节点的存活状态及怀疑Fail状态
故障发现
节点角色
集群模式下,只有主节点(master)才有读写权限和集群槽的维护权限,从节点(slave)只有复制的权限
主观下线
标记怀疑Fail状态
客观下线
故障恢复
参与选主的从节点资格参考维度
- 与故障主节点的断线时间:超过cluster-node-timeout(默认15s) * cluster-slave-validity-factor(默认10),则无资格
- 复制偏移量:offset大的优先级高
选举投票
- 其他主节点发起投票
- > N/2 + 1的从节点胜出
替换主节点
- 胜出的从节点取消复制变成离节点(slaveof no one)
- 执行cluster del slot撤销故障主节点负责的槽
- 执行cluster add slot把这些槽分配给自己
- 向集群广播自己的pong消息,表明完成替换故障主节点