|
这样,哨兵节点就能从info命令中自动获取到从节点信息,因此那些后续才加入的从节点信息不需要显式配置就能自动感知。

向__sentinel__:hello频道同步信息
每隔2秒,每个哨兵节点将会向Redis数据节点的__sentinel__:hello频道同步自身得到的主节点信息以及当前哨兵节点的信息,由于其他哨兵节点也订阅了这个频道,因此实际上这个操作可以交换哨兵节点之间关于主节点以及哨兵节点的信息。
这一操作实际上完成了两件事情: * 发现新的哨兵节点:如果有新的哨兵节点加入,此时保存下来这个新哨兵节点的信息,后续与该哨兵节点建立连接。 * 交换主节点的状态信息,作为后续客观判断主节点下线的依据。

向数据节点做心跳探测
每隔1秒,每个哨兵节点向主、从数据节点以及其他sentinel节点发送ping命令做心跳探测,这个心跳探测是后续主观判断数据节点下线的依据。

主观下线和客观下线
主观下线
上面三个监控任务中的第三个探测心跳任务,如果在配置的down-after-milliseconds之后没有收到有效回复,那么就认为该数据节点“主观下线(sdown)”。

为什么称为“主观下线”?因为在一个分布式系统中,有多个机器在一起联动工作,网络可能出现各种状况,仅凭一个节点的判断还不足以认为一个数据节点下线了,这就需要后面的“客观下线”。
客观下线
当一个哨兵节点认为主节点主观下线时,该哨兵节点需要通过”sentinel is-master-down-by addr”命令向其他哨兵节点咨询该主节点是否下线了,如果有超过半数的哨兵节点都回答了下线,此时认为主节点“客观下线”。

选举哨兵领导者
当主节点客观下线时,需要选举出一个哨兵节点做为哨兵领导者,以完成后续选出新的主节点的工作。
这个选举的大体思路是:
-
每个哨兵节点通过向其他哨兵节点发送”sentinel is-master-down-by addr”命令来申请成为哨兵领导者。
-
而每个哨兵节点在收到一个”sentinel is-master-down-by addr”命令时,只允许给第一个节点投票,其他节点的该命令都会被拒绝。
-
如果一个哨兵节点收到了半数以上的同意票,则成为哨兵领导者。
-
如果前面三步在一定时间内都没有选出一个哨兵领导者,将重新开始下一次选举。
可以看到,这个选举领导者的流程很像raft中选举leader的流程。

选出新的主节点
在剩下的Redis从节点中,按照以下顺序来选择新的主节点:
-
过滤掉“不健康”的数据节点:比如主观下线、断线的从节点、五秒内没有回复过哨兵节点ping命令的节点、与主节点失联的从节点。
-
选择slave-priority(从节点优先级)最高的从节点,如果存在则返回不存在则继续后面的流程。
-
选择复制偏移量最大的从节点,这意味着这个从节点上面的数据最完整,如果存在则返回不存在则继续后面的流程。
-
到了这里,所有剩余从节点的状态都是一样的,选择runid最小的从节点。

提升新的主节点
选择了新的主节点之后,还需要最后的流程让该节点成为新的主节点:
-
哨兵领导者向上一步选出的从节点发出“slaveof no one”命令,让该节点成为主节点。
-
哨兵领导者向剩余的从节点发送命令,让它们成为新主节点的从节点。
-
哨兵节点集合会将原来的主节点更新为从节点,当其恢复之后命令它去复制新的主节点的数据。

如果过程中哨兵领导者失效怎么办?
原文地址:
https://www.codedump.info/post/20190409-redis-sentinel/
参考阅读:
【编辑推荐】
- 微软开源分散式身份识别工具 ION
- 19款超好用的免费数据挖掘工具大汇总!
- 多名中国开发者入选 FFmpeg 决策委员会
- 开发者回忆:PHP 早已不是十年前的模样
- 开源倡导者担忧被微软垄断开源系统工具
【责任编辑:张燕妮 TEL:(010)68476606】
点赞 0 (编辑:92站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|