redis学习笔记-redis cluster 故障恢复流程
#redis#
判断节点宕机
* 主观下线:pfail, 断开 > cluster-node-timeout 默认15000ms * 客观下线:fail, cluster-node-timeout*2 时间内, 有超过半数节点pfail, 则标记为fail
从节点资格检查
对宕机的主节点,选择有资格切换的slave节点, 判断条件为从节点最后一次与主节点通信的时间间隔, 如果小于 cluster-node-timeoutcluster-slave-validity-factor(默认为15s10) ,那么就有资格设置从节点的延迟选举时间
对所有从节点进行排序,slave priority, 每个从节点根据自己对master复制数据的offset设置选举时间, offset越大,表明复制数据越多, 选举时间越靠前,优先进行选举从节点发起选举流程
从节点定时任务检测= failover_auth_time (故障选举时间) 后,发起选举流程
- 更新配置纪元
保存在clusterState.failover_auth_epoch 结构体变量里 - 广播选举消息
FAILOVER_AUTH_REQUEST,保证该从节点在一个配置纪元内只能发起一次选举
- 主节点选举投票
只有持有槽的主节点才能处理FAILOVER_AUTH_REQUEST消息, 给从节点投票。当某个从节点收集到N/2 +1 个持有槽的主节点投票时, 从节点可以执行替换故障主节点的操作。
注意事项:
1、故障节点也算在N里面,所以要注意主节点的部署分布问题,有可能从节点一直拿不到N/2+1个选票
2、投票作废。 一个配置纪元代表一次选举周期,开始投票后的cluster-node-timeout*2 时间内,从节点没有获取到足够票数,则本次选举作废,从节点对配置纪元自增并发起下一轮投票
- 替换主节点
收到N/2+1个选票的从节点发起替换主节点操作:
- 当前从节点取消复制,变为主节点
- 执行clusterDelSlot操作撤销故障主节点负责的槽, 并执行clusterAddSlot把这些槽委派给自己
- 向集群广播自己的pong消息,通知集群内所有的节点当前从节点变为乐主节点卡并接管了故障主节点的槽信息