Redis sentinel基本原理

一、发现探测对象

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间的互连。

image.png

二、探测活性

1. 主观下线

sentinel每1s向他发现的master、slave、其他sentinel发送ping命令。如果在连续down-after-milliseconds都没有收到有效回复,则该sentinel判定该探测对象为主观下线

  • 有效回复:+PONG/-LOADING/-MASTERDOWN

2. 客观下线

当sentinel认为某个探测对象主观下线后,会询问其他sentinel是不是这个探测对象真的下线了。如果超过半数的sentinel都认为该探测对象下线了,则判定为客观下线

image.png

image.png

三、故障转移

被认定为客观下线的探测对象,由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。

image.png

而其探测的Redis实例,则通过sentinelRedisInstance管理。

image.png

slave信息通过上面master sentinelRedisInstance的一个字段管理。

image.png

其他sentinel信息呢?其他sentinel信息是同时都在探测某个Redis实例的其他sentinel,所以应该是sentinelRedisInstance中的一个字段,slave的sentinelRedisInstance也会有sentinel字段。

image.png

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享