Redis(设计与实现):46---Sentinel之检测服务器、Sentinel下线状态(down-after-milliseconds、quorum、is-master-down-by-addr)

罗蓁蓁

关注

阅读 16

2022-04-02


一、检测主观下线状态

  • 在默认情况下,Sentinel会​以每秒一次的频率​向所有与它创建了命令连接的实例(​包括主服务器、从服务器、其他Sentinel在内​)发送​PING命令​,并通过实例返回的PING命令回复来判断实例是否在线


图示

  • 下图展示的例子中,带箭头的连线显示了Sentinel1和Sentinel2是如何向实例发送PING命令的:
  • Sentinel1将向Sentinel2、主服务器master、从服务器slave1和slave2发送PING命令
  • Sentinel2将向Sentinel1、主服务器master、从服务器slave1和slave2发送PING命令

Redis(设计与实现):46---Sentinel之检测服务器、Sentinel下线状态(down-after-milliseconds、quorum、is-master-down-by-addr)_服务器


  • 实例对PING命令的回复可以分为以下两种情况:
  • 有效回复:​实例返回+PONG、-LOADING、-MASTERDOWN三种回复的其中一种
  • 无效回复:​实例返回除+PONG、-LOADING、-MASTERDOWN三种回复之外的其他 回复,或者在指定时限内没有返回任何回复


down-after-milliseconds选项、flags属性

  • Sentinel配置文件中的down-after-milliseconds选项​指定了Sentinel判断实例进入主观下线所需的时间长度:​如果一个实例在down-after-milliseconds毫秒内,连续向Sentinel返回无效回复,那么Sentinel会修改这个实例所对应的实例结构,在结构的flags属性中打开​SRI_S_DOWN标识​,以此来表示这个实例已经进入主观下线状态
  • 演示案例:​以上图展示的情况为例子,如果配置文件指定Sentinel1的​down-after-milliseconds选项的值为50000毫秒​,那么当主服务器master连续50000毫秒都向Sentinel1​返回无效回复时​, Sentinel1就会将master标记为主观下线,并在master所对应的实例结构的flags属性中打开SRI_S_DOWN标识,如下图所示

Redis(设计与实现):46---Sentinel之检测服务器、Sentinel下线状态(down-after-milliseconds、quorum、is-master-down-by-addr)_下线状态_02



注意事项:

Redis(设计与实现):46---Sentinel之检测服务器、Sentinel下线状态(down-after-milliseconds、quorum、is-master-down-by-addr)_服务器_03

Redis(设计与实现):46---Sentinel之检测服务器、Sentinel下线状态(down-after-milliseconds、quorum、is-master-down-by-addr)_服务器_04


二、检测客观下线状态

  • 当Sentinel将一个主服务器判断为主观下线之后,为了确认这个主服务器是否真的下线 了,它会​向同样监视这一主服务器的其他Sentinel进行询问​,看它们是否也认为主服务器已经进入了下线状态(可以是主观下线或者客观下线)。当Sentinel从其他Sentinel那里​接收到足够数量的已下线判断之后​,Sentinel就会将从服务器判定为客观下线,并对主服务器​执行故障转移操作


发送SENTINEL is-master-down-by-addr命令

  • Sentinel使用下面的命令询问其他Sentinel是否同意主服务器已下线:

SENTINEL is-master-down-byaddr <ip> <port> <current_epoch> <runid>

  • 参数的含义如下:

Redis(设计与实现):46---Sentinel之检测服务器、Sentinel下线状态(down-after-milliseconds、quorum、is-master-down-by-addr)_quorum_05

  • 演示案例:​如果被Sentinel判断为主观下线的主服务器的IP为127.0.0.1,端口号为6379, 并且Sentinel当前的配置纪元为0,那么Sentinel将向其他Sentinel发送以下命令:

SENTINEL is-master-down-by-addr 127.0.0.1 6379 0 *



接收SENTINEL is-master-down-by-addr命令

  • 当一个Sentinel(目标Sentinel)​接收到另一个Sentinel​(源Sentinel)发来的SENTINEL ismaster-down-by命令时,目标Sentinel会​分析并取出命令请求中包含的各个参数​,并根据其中的主服务器IP和端口号,​检查主服务器是否已下线​,然后向源Sentinel​返回一条​包含三个参数的Multi Bulk回复作为SENTINEL is-master-down-by命令的回复:

1) <down_state>
2) <leader_runid>
3) <leader_epoch>

  • 回复的含义如下:

Redis(设计与实现):46---Sentinel之检测服务器、Sentinel下线状态(down-after-milliseconds、quorum、is-master-down-by-addr)_quorum_06

  • 演示案例:​如果一个Sentinel返回以下回复作为SENTINEL is-master-down-by-addr命令的回复,那么说明Sentinel也同意主服务器已下线:

1) 1
2) *
3) 0



接收SENTINEL is-master-down-by-addr命令的回复

  • 根据其他Sentinel发回的SENTINEL is-master-down-by-addr命令回复,Sentinel将​统计其他Sentinel同意主服务器已下线的数量​,当这一​数量达到配置指定的判断客观下线所需的数量时​,Sentinel会将主服务器实例结构​flags属性的SRI_O_DOWN标识​打开,表示主服务器已经进入客观下线状态,如下图所示

Redis(设计与实现):46---Sentinel之检测服务器、Sentinel下线状态(down-after-milliseconds、quorum、is-master-down-by-addr)_quorum_07



quorum参数

Redis(设计与实现):46---Sentinel之检测服务器、Sentinel下线状态(down-after-milliseconds、quorum、is-master-down-by-addr)_下线状态_08

Redis(设计与实现):46---Sentinel之检测服务器、Sentinel下线状态(down-after-milliseconds、quorum、is-master-down-by-addr)_服务器_09



精彩评论(0)

0 0 举报