深入检出 Redis Cluster ④:故障转移

1. 故障发现

概述: 通过 ping/pong 消息实现故障发现,不需要 sentinel
主观下线 流程:
ping 超时则认为主观下线
image.png
客观下线 流程:
半数以上持有槽的主节点都标记某节点主观下线时
image.png
image.png

2. 故障转移

概述: 发现故障后,故障节点的从节点替代主节点工作
流程:

  • 检查从节点资格: 每个从节点检查与其故障的主节点的断线时间,若超过 》cluster-node-timeout * cluster-slave-validity-factor 则取消资格

    cluster-node-timeout 默认为 15s,cluster-slave-validity-factor 默认为 10

  • 偏移量优先: 偏移量更小的从节点延迟选举时间越小,越能更快开始选举,获得的票数也越多

image.png

  • 开始选举: 每个主节点对从节点投票

image.png

  • 替换主节点: 选举成功的从节点变为主节点
  • 替换槽: 执行 clusterDelSlot 撤销故障主节点的槽,并执行 clusterAddSlot 把相应的槽分配给选出的从节点
  • 通知集群: 向集群广播自己的 pong 消息,表明已替换故障主节点