一、redis 选主过程
slave发现自己的master为FAIL,便尝试Failover,成新master。但挂掉master可能有多个slave。Failover经过类似Raft在集群内一致:
1)slave发现自己的master变为FAIL
2)将自己记录集群currentEpoch加1,广播Failover Request信息
3)其他节点收到,只有master响应,判断请求者合法性,并发送FAILOVER_AUTH_ACK,对每一个epoch只发一次ack
4)尝试failover的slave收集FAILOVER_AUTH_ACK,超半数成新Master,广播Pong通知其他集群节点
ps:epoch纪元:用类似 Raft 算法 term(任期)称为 ,给事件增加版本号。currentEpoch (选举) 和 configEpoch(指节点所负责槽位信息)
打开主服务器的持久化,不丢数据
二、选主代码分析
1、slave定期发送ping检测master存活性,master未响应,记为疑似下线。
clusterHandleSlaveFailover执行重新选主核心逻辑
2、clusterHandleSlaveFailover内部通过clusterRequestFailoverAuth方法向集群所有节点发送CLUSTERMSG_TYPE_FAILOVER_AUTH_REQUEST报文,通知slave准备执行failover
超过n/2+1个master的response升为主
3、clusterProcessPacket内部主要处理,选举过程中报文相关解析逻辑CLUSTERMSG_TYPE_FAILOVER_AUTH_REQUEST和CLUSTERMSG_TYPE_FAILOVER_AUTH_ACK报文。
request报文的处理逻辑:如果master就发回ack响应
ack报文的处理逻辑:增加支持投票数failover_auth_count++
https://www.jianshu.com/p/03d87fa84fc4
https://blog.csdn.net/chen_kkw/article/details/82724330
网友评论