哨兵Sentinel是Redis的一种高可用解决方案,由一个或多个Sentinel实例组成的Sentinel系统可以监控多个主服务器,以及这些主服务器的从服务器,并且在被监视的主服务器下线时,将下线服务器的某个从服务器升级为新的主服务器。
1、Sentinel服务器创建和初始化
启动Sentinel
$ redis-server /usr/local/redis-6.0.16/sentinel-26379.conf --sentinel
Sentinel启动之后,初始化的时候会建立两个连接
- 命令连接:用于向主服务器发送命令,并接收回复
- 订阅连接:用于订阅主服务器的_sentinal_:hello频道
2、获取主服务器信息(INFO命令)
Sentinel每10秒会向主服务器及其从服务器发送INFO命令,以获取:
- 主服务器本身的信息,run_id、role等;
- 主服务器下的所有从服务器信息,Sentinel根据这些信息自动发现从服务器;
3、获取从服务器信息(INFO命令)
Sentinel发现从服务器后,会创建连接到从服务器的命令连接和订阅连接,连接创建之后,Sentinel每10秒会从服务器发送INFO命令,得到从服务器的信息。
4、向主从服务器发送信息(PUBLISH _sentinal_:hello发布)
Sentinel每2秒,向所有被监视的主服务器和从服务器发送命令:
PUBLISH _sentinal_:hello "<s_ip>,<s_port>,<s_runid>,<s_epoch>,<m_name>,<m_ip>,<m_port>,<m_epoch>"
5、接收来自主从服务器的频道信息(SUBSCRIBE _sentinal_:hello订阅)
Sentinel与一个主服务器或者从服务器建立连接之后,会通过订阅连接向这台服务器发送以下命令:
SUBSCRIBE _sentinal_:hello
当Sentinel从_sentinal_:hello频道接受到信息时,Sentinel根据其中的信息更新保存的实例结构。
6、检测下线状态
Sentinel每秒1次,向与它建立命令连接的所有实例发送PING命令,根据实例返回的PING命令回复来判断是否下线。
如果一个实例没有在配置文件设置的down-after-milliseconds毫秒内连续发送有效回复(指 +PONG、-LONDING、-MASTERDOWN 回复),则该Sentinel判断这个实例主观下线。
注意:多个Sentinel设置的主观下线时长可能不同。
当一台主服务器被Sentinel判断为主观下线之后,Sentinel会向同样监视这台主服务器的其他Sentinel询问,其他Sentinel收到询问后会判断这台服务器是否下线,然后把判断结果返回给源Sentinel。
当认为主服务器下线的Sentinel数量超过配置文件中设置的quorum参数的值,则该Sentinel就会认为服务器进入客观下线状态。
如下配置,代表当有两个Sentinel认为主服务器主观下线时,这台主服务器进入客观下线状态:
sentinel monitor <master-name> <ip> <redis-port> <quorum>
sentinel monitor mymaster 127.0.0.1 6379 2
7、选举领头Sentinel
当一个主服务器被判断为客观下线时,监视这个下线主服务器的各个Sentinel会协商选举出一个领头Sentinel,并由领头Sentinel对下线主服务器执行故障转移操作。
8、故障转移
- 在已下线主服务器的所有从服务器中,选择一个优先级最高的、复制偏移量最大的从属服务器作为新的主服务器;
- 让已下线主服务器的其他从属服务器复制新的主服务器;
- 将已下线的主服务器设置为新主服务器的重述服务器;