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表示同意当前节点成为领导者

posted @ 2020-06-17 16:07  子非鱼且于  阅读(1392)  评论(0编辑  收藏  举报
Live2D