2022-12-07 Redis Cluster (2) 故障转移

参考 https://mp.weixin.qq.com/s/tlocdMlyI4Sx8UxfbuVjTw
https://developer.aliyun.com/article/779564

集群元数据维护机制

模型

redis的维护模型.png

算法

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状态


主观下线.png

客观下线

客观下线.jpg

故障恢复

参与选主的从节点资格参考维度

  • 与故障主节点的断线时间:超过cluster-node-timeout(默认15s) * cluster-slave-validity-factor(默认10),则无资格
  • 复制偏移量:offset大的优先级高

选举投票

  • 其他主节点发起投票
  • > N/2 + 1的从节点胜出

替换主节点

  • 胜出的从节点取消复制变成离节点(slaveof no one)
  • 执行cluster del slot撤销故障主节点负责的槽
  • 执行cluster add slot把这些槽分配给自己
  • 向集群广播自己的pong消息,表明完成替换故障主节点

你可能感兴趣的:(2022-12-07 Redis Cluster (2) 故障转移)