Redis哨兵领导者、主节点选举、故障转移
一、哨兵实现原理:三个定时任务,也回答了三个问题:
问题一:sentinel没有配置从节点信息如何知道从节点信息的?
1、每隔10秒,sentinel进行向主节点发送info命令,用于发现新的slave节点
问题二、如何加入新的sentinel的
2、每隔2秒,向redis数据节点_sentinel_:hello频道发送本sentinel节点的信息和对主节点的判断:这是进行对主节点进行客观下线和领导者选举的重要依据;也是发现新sentinel节点的重要依据
问题三:如何判断一个节点的需要主观下线的?
3、每隔1秒每个sentinel对其他的redis节点(master,slave,sentinel)执行ping操作,对于master来说
若超过down-after-milliseconds内没有回复,就对该节点进行主观下线并询问其他的Sentinel节点是否可以客观下线
二、对redis节点失败达成共识
主观下线:每隔1秒每个sentinel对其他的redis节点(master,slave,sentinel)执行ping操作,若超过down-after-milliseconds内没有回复,就对该节点进行主观下线,每个sentinel节点对redis节点失败的“偏见”
客观下线:当sentinel主观下线的节点是主节点时,sentinel会通过命令sentinel is-master-down-by-addr来询问其sentinel对主节点的判断,如果超过quorum个数就认为主节点需要客观下线, 所有sentinel节点对redis节点失败达成共识
三、选举sentinel领导者 使用的raft算法(https://raft.github.io),大致思路:
1、每个做主观下线的sentinel节点像其他sentinel节点发送命令,要求将自己设置为领导者
2、接收到的sentinel可以同意或者拒绝
3、如果该sentinel节点发现自己的票数已经超过半数并且超过了quorum
4、如果此过程选举出了多个领导者,那么将等待一段时重新进行选举
四、主节点选举:选举出可以代替主节点的slave从节点
1、选择健康状态从节点(排除主观下线、断线),排除5秒钟没有心跳的、排除主节点失联超过10*down-after-millisecends
2、选择slave-priority高的从节点优先级列表
4、选择偏移量大的
5、选择runid小的
五、进行故障转移
1、sentinel的领导者从slave中选举出合适的从节点进行故障转移
2、对选取的slave执行slave of no one
3、更新应用程序端的链接到新的主节点
4、对其他从节点变更master为新的节点
5、修复原来的master并将其设置为新master的slave
六、:sentinel is-master-down-by-addr命令
1、当前sentinel节点如果判断主节点是主观下线之后会向其他sentinel发送此命令询问其他节点对主节点的判断
sentinel is-master-down-by-addr ip port epoch runid
入参:runid会传“*” 标识要询问目标sentinel是否主观下线主节点 epoch传入当前纪元
返回参数:down_state:返回目标的判断,1是下线 0是不下线
leader_runid:返回“*”
2、当进行领导者选举时每个判断客观下线的sentinel都会向其他sentinel发送此命令
sentinel is-master-down-by-addr ip port epoch runid
入参:runid是当前sentinel的runid,标识希望目标节点同意自己成为领导者
返回参数:leader_runid 返回具体的runid表示同意当前节点成为领导者