一、发现探测对象
1. 发现master
- sentinel启动时通过配置信息感知到master信息(一个sentinel可以检测多个master)
- sentinel会与每个master建立两个连接:命令连接和订阅连接
2. 发现slave
- sentinel通过与master建立的命令连接每10s发送一次info命令,通过info信息发现该master的slave信息
- sentinel会与每个slave建立两个连接:命令连接和订阅连接
3. 发现其他sentinel
- sentinel每2s会向上面发现的master和slave发送publish命令,这样所有与这些master、slave建立订阅连接的sentinel都会收到这个publish信息(包括这个sentinel自身),这样sentinel实现了彼此发现。publish信息包括:本sentinel自身的ip、port信息和他探测的master或者slave的ip、port信息。
- sentinel发现其他sentinel后,会与之建立命令连接。由于sentinel是相互发现的,其实实现了sentinel间的互连。
二、探测活性
1. 主观下线
sentinel每1s向他发现的master、slave、其他sentinel发送ping命令。如果在连续down-after-milliseconds都没有收到有效回复,则该sentinel判定该探测对象为主观下线
。
- 有效回复:+PONG/-LOADING/-MASTERDOWN
2. 客观下线
当sentinel认为某个探测对象主观下线后,会询问其他sentinel是不是这个探测对象真的下线了。如果超过半数的sentinel都认为该探测对象下线了,则判定为客观下线
。
三、故障转移
被认定为客观下线的探测对象,由leader sentinel进行故障切换。
1. leader选举
通过raft方式。raft另写文章。
2. 故障转移
假设master宕了。
- 挑选从服务器作为新的master,执行slaveof no one。
- 过滤掉主观下线的slave
- 过滤掉最近5s内没有回复leader sentinel info命令的从库
- 过滤掉10 * down-after-milliseconds没有跟主进行改过数据同步的(也就是跟master断开了连接)
- 选择优先级最高、复制偏移量最大、run id最小的从库
- 将其他slave改为复制新的master
- 将宕机的master作为新master的从库
四、数据结构
sentinel通过sentinelState管理其发现的master。
而其探测的Redis实例,则通过sentinelRedisInstance管理。
slave信息通过上面master sentinelRedisInstance的一个字段管理。
其他sentinel信息呢?其他sentinel信息是同时都在探测某个Redis实例的其他sentinel,所以应该是sentinelRedisInstance中的一个字段,slave的sentinelRedisInstance也会有sentinel字段。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END