“ Redis Cluster Sentinel 工作原理”
Sentinel(哨兵)是Redis的高可用性(high availability)解决方案:
由一个或多个Sentinel实例组成的sentinel系统可以监视任何多个主服务器以及这些主服务器下的从服务器,并在被监视的主服务器下线状态时,自动将下线主服务器下的某个从服务器升级为主服务器,然后由新的主服务器代替已下线的主服务器处理命令请求。
以下用双环图表示:

图1 服务器与Sentinel系统

图2 主服务器下线

图3 故障转移

图4 原理的主服务器降级为从服务器
接下来对Sentinel原理进行详细的说明
一、启动初始化Sentinel
redis-sentinel path/sentinel.conf命令效果一样redis-server path/sentinel.conf --sentinel
当一个Sentinel启动的时候,它需要执行以下步骤:
1、初始化服务器
Sentinel本质上是一个运行在特殊模式下的redis服务器,不同的是启动过程中,普通redis服务器初始化时会加载RDB文件或AOF文件来还原数据库状态,而Sentinel不会加载文件。
2、将普通redis使用的代码替换成Sentinel专用代码
由于代码的替换,sentinel肯定不能跟普通的redis执行的操作一致,也就是说限制了sentinel执行命令,其实是未加载。所以sentinel不能执行SET,DBSIZE,EVALD等命令,只有7个命令可以执行:PING,SENTINEL, INFO,SUBSCRIBE,UNSUBSCRIBE,PSUBSCRIBE.
3、初始化Sentinel状态
4、根据指定的配置文件,初始化Sentinel的监视主服务器列表
Sentinel状态中的masters字典记录了所有被sentinel监视的主服务器的相关信息,其中:
- 字典的键是被监视的主服务器的名字
- 字典的值是被监视的主服务器对应的RedisInstrance结构,这个结构可以包含redis的master,slave,或者一个sentinel
实例的属性非常多,图示:

5、创建联向主服务器的网络连接
初始化最后一步:创建连向被监视主服务器的网络连接,Sentinel将成为主服务器的客户端,它可以向主服务器发送命令,并从回复命令中获取信息
对于每个被监视的主服务器来说,sentinel会创建两个连向主服务器的异步网络连接:
- 一个是命令连接,专门发送命令并接受命令
- 一个是订阅连接,用于订阅主服务器的__sentinel__:hello频道。
为什么是两个连接?
redis目前的发布订阅功能中,被发送的信息不回保存在redis服务器里,如果信息发送时,客户端不在线或断线,那么客户端就会丢失这条信息。因此sentinel必须用一个订阅连接来接受该频道信息
另一方面,除了订阅频道外,sentinel必须向主服务器发送命令,进行通信,所以sentinel必须创建命令连接
因为sentinel需要与多个实例创建多个网络连接,所以sentinel使用的异步连接
小结
- redis是运行在特殊模式下redis服务器,它使用了与普通模式下不同的命令表,所有sentinel模式能够使用的命令与普通redis服务器能够使用的命令不同。
- Sentinel会读入用户指定的配置,为每个要被监视的主服务器创建相应的实例结构,并创建连向主服务器的命令连接和订阅连接,其中命令连接用于向主服务器发送命令请求,订阅连接则会接受指定频道的信息。
- Sentinel通过向主服务器发送INFO命令来获得主服务器下所有从服务器的地址信息,并未这些从服务器创建相应的实例结构,以及连向这些从服务器的命令连接和订阅连接。
- 在一般情况下,sentinel以每10s一次的频率想被监视的主服务器和从服务器发送INFO命令,当主服务器处于下线状态,或者sentinel正在对主服务器进行故障转移操作时,sentinel会向从服务器发送INFO命令的频率为1s一次。
- 对于监视同一个主服务器和从服务器对的多个sentinel来说,他们会以每2s的频率,通过向被监视的服务器的__sentinel__:hello频道发送消息来向其他sentinel宣告自己的存在。
- 每个sentinel也会从__sentinel__:hello频道中接受其他sentinel发来的消息,并根据这些消息为其他的sentinel创建相应的实例结构。以及命令连接。
- sentinel只会与主服务器和从服务器创建命令连接和订阅连接,sentinel与sentinel之间则只创建命令连接
- sentinel以每秒一次的频率想实例(master,slave,其他sentinel)发送PING命令,并根据实例对PING命令的回复来判断实例是否在线,当一个实例在指定的时长中连续向sentinel发送无效回复时,sentinel会将这个实例判断为主观下线。
- 当sentinel将一个主服务器判断为主观下线时,他会向同样监视这个主服务器的其他sentinel进行询问,看他们是否同意这个主服务器已经进入主观下线状态。
- 当sentinel收集到足够多的主观下线投票之后,它会将主服务器判断为客观下线,并发起一次针对主服务器的故障转移操。
sentinel系统选举领头sentinel的方式是对Raft算法的领头选举方法的实现。
欢迎长按下图关注公众号小璇坨坨
十年积累倾囊相授




