回答
一旦确认主节点客观下线,就需要进行故障转移。这个时候各个 Sentinel 之间会进行一次选举,选出一个领导者来负责这次的故障转移流程。
Sentinel 之间通过发送 RAFT
的投票协议消息来选举领导者。每个 Sentinel 节点都会给某一个请求它进行投票的 Sentinel 节点投票,但在整个选举过程中,每个 Sentinel 只能投一次票。通常情况下,第一个请求投票的 Sentinel 会获得同意。
如果某个Sentinel
节点发现自己得到的票数已经超过半数且超过 <quorum>
,那么它就成为领导者。
如果这个过程中有多个 Sentinel
成为领导者,那么将等待一段时间重新进行选择,直到有且只有一个 Sentinel
节点成为领导者为止。
扩展
假如有 A
、B
、C
、D
四个节点构成 Sentinel 集群。假如 A
率先完成客观下线,则 A
会向 B
、C
、D
发出成为领导者的申请,由于 B
、C
、D
没有同意过其他 Sentinel 节点,所以会将投票给 A
,A
得到三票。B
则向 A
、C
、D
发起申请,由于 C
、D
已经同意了 A
,所以会拒绝,但是他会得到 A
的同意,所以 B
得到一票,同理 C
、D
得到零票,如下图:
节点 | 得到的票数 |
---|---|
A | B 、C、D |
B | A |
C | |
D |
所以 A 会成为领导者,进行故障转移工作。一般来说,哨兵 leader选择的过程很快,谁先完成客观下线,一般就能成为领导者。