建议先关注、点赞、收藏后再阅读。
当一个Sentinel进程启动时,它会首先尝试连接已知的Sentinel进程,并与它们进行通信。
Sentinel进程之间会通过发送PING、PONG消息来维持心跳。每个Sentinel进程都会周期性地向其他已知的Sentinel进程发送PING消息,并等待它们的PONG响应。
在收到PING消息时,被请求的Sentinel会检查自身是否已经具备领头Sentinel的条件,如果是,则发送PONG响应。
当一个Sentinel进程在一定时间内未收到来自其他Sentinel的PONG响应时,它将认为其他Sentinel进程已经失去连接,此时,它将尝试进入领头Sentinel选举。
为了进入选举状态,Sentinel进程需满足以下条件:
sentinel monitor <master-name> <ip> <port> <quorum>
命令指定,表示至少需要多少个Sentinel进程认为其他Sentinel进程失去连接)。进入选举状态后,Sentinel进程会向其他已知的Sentinel进程发送SENTINEL is-master-down-by-addr消息,询问它们是否同意领头Sentinel的选举。
收到SENTINEL is-master-down-by-addr消息的其他Sentinel进程会检查是否满足选举的条件,如果符合,则发送SENTINEL ask-for-leader-addr消息进行回应。
发起选举的Sentinel进程会收集所有同意选举并回应了SENTINEL ask-for-leader-addr消息的Sentinel的信息,然后根据特定算法(比如按照优先级或ID排序)选择其中一个成为领头Sentinel。
选举完成后,发起选举的Sentinel进程会收到其他Sentinel的回应,并获取到领头Sentinel的地址。
选举完成后,Sentinel进程将完成以下状态的变化:
新选出的领头Sentinel进程会将自身的ID和IP地址广播给其他Sentinel进程。
其他Sentinel进程收到新领头Sentinel的广播信息后,会更新自己记录的领头Sentinel的信息。
如果一个被选为领头Sentinel的Sentinel进程发现某个master已经下线或无法访问,它将负责进行后续的故障转移操作。
如果一个被选为领头Sentinel的Sentinel进程下线,其他Sentinel进程则会启动新的选举过程,选出新的领头Sentinel。