Sentinel (哨兵)是Redis的高可用性解决方案:由一个或多个sentinel实例组成的sentinel系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求。

   第八章 Sentinel_发送消息                    第八章 Sentinel_发送消息_02

         第八章 Sentinel_服务器_03          第八章 Sentinel_redis_04

  • Sentinel只是一个运行在特殊模式下的Redis服务器,它使用了和普通模式不同的命令表,所以sentinel模式能够使用的命令和普通Redis服务器能够使用的命令不同。

 

  第八章 Sentinel_redis_05       第八章 Sentinel_服务器_06

 

  • Sentinel会读入用户指定的配置文件,为每个要被监视的主服务器创建相应的实例结构,并创建连向主服务器的命令连接和订阅连接,其中命令连接用于向主服务器发送命令请求,而订阅连接用于接收指定频道的消息
  • Sentinel通过向主服务器发送INFO命令来获得主服务器属下所有从服务器的地址信息,并为这些从服务器创建相应的实例结构,以及连向这些从服务器的命令连接和订阅连接
  • 在一般情况下,Sentinel以每十秒一次的频率向被监视的主服务器和从服务器发送INFO命令,当主服务器处于下线状态,或者Sentinel正在对主服务器进行故障转移操作时,Sentinel向从服务器发送INFO命令的频率会改为每秒一次
  • 对于监视同一个主服务器和从服务器的多个Sentinel来说,它们会以每两秒一次的频率,通过向被监视服务器的_sentinel_:hello频道发送消息来向其他Sentinel宣告自己的存在
  • 每个Sentinel也会从_sentinel_:hello频道中接收其他Sentinel发来的消息,并根据这些信息为其他Sentinel创建相应的实例结构,以及命令连接
  • Sentinel只会与主服务器和从服务器创建命令连接和订阅连接,Sentinel与Sentinel之间则只创建命令连接
  • Sentinel以每秒一次的频率向实例(包括主服务器、从服务器、其他Sentinel)发送PING命令,并根据实例对PING命令的回复来判断实例是否在线,当一个实例在指定的时长中连接向Sentinel发送无效回复时,Sentinel会将这个实例判断为主观下线
  • 当Sentinel将一个主服务器判断为主观下线时,它会向同样监视这个主服务器的其他Sentinel进行询问,看它们是否同意这个主服务器已经进入主观下线状态
  • 当一个Sentinel收集到足够多的主观下线投票后,它会将主服务器判断为客观下线,并发起针对主服务器的故障转移操作
  • 每个发现主服务器客观下线的Sentinel都会通过向其他Sentinel发送SENTINEL is-master-down-by-addr命令要求其他Sentinel将自己设置为局部领头Sentinel,设置局部领头Sentinel的规则是先到先得。如果某个Sentinel被半数以上的Sentinel设置成了局部领头Sentinel,那么这个Sentinel成为领头Sentinel,如果在给定时限内,没有选出,将在一段时间后再次进行选举。

  如果选举新的主服务器?

  领头的Sentinel会将已下线主服务器的所有从服务器保存到一个列表里面,然后按以下规则进行过滤:

  1) 删除列表中所有处于下线或者断线状态的从服务器

  2) 删除列表中所有最近五秒内没有回复过领头Sentinel的INFO命令的从服务器

  3) 删除所有与已下线主服务器连接断开超过down-after-milliseconds * 10毫秒的从服务器

  之后,领头Sentinel将根据从服务器的优先级,对列表中剩余的从服务器进行排序,并选出其中优先级最高的从服务器。

  如果存在多个具有相同最高优先级的从服务器,那么领头Sentinel将选择从服务器中复制偏移量最大的。