Redis哨兵模式实现原理

哨兵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、故障转移

  • 在已下线主服务器的所有从服务器中,选择一个优先级最高的、复制偏移量最大的从属服务器作为新的主服务器;
  • 让已下线主服务器的其他从属服务器复制新的主服务器;
  • 将已下线的主服务器设置为新主服务器的重述服务器;
# Redis 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×