Redis哨兵的感知策略
哨兵
Redis中的哨兵方案是通过在系统中的多个哨兵节点构成的哨兵网络检测该网络覆盖范围内的主从服务器状态。 为的就是能够当主节点离线时,可以及时感知并控制从节点进行选举以产生新的主节点。
三层同步
哨兵首先与主服务器创建连接。
哨兵会创建两个连向主服务器的异步连接:1. 命令链接 :专门向主服务器发送命令,并接收命令的回复2.订阅链接:订阅主服务器的sentinel:hello频道
对于每个同哨兵链接的服务器,哨兵通过命令链接向服务器的snetinel:hello频道发送信息,通过订阅从服务器的snetinel:hello频道接收信息。
命令链接:哨兵->>服务器
订阅链接: 服务器->>哨兵
第一层同步:
哨兵默认以10秒一次的频率通过命令链接向主服务器发送INFO命令,主服务器接收到后,将自身以及自己从服务器的信息发送给哨兵,其中包含主服务器与从服务器的信息。哨兵对表单进行更新处理。
并且当哨兵发现新的从服务器时,会与新的从服务器建立命令链接和订阅链接。并以10秒一次的频率通过命令链接向从服务器发送INFO命令。
信息被保存至哨兵的字典中
第二层同步:
哨兵默认情况以2秒一次的频率通过命令链接向所有被监视的主服务器和从服务器发送信息。
信息包含以下内容
第三层同步:
因为会存在多个哨兵链接到同一个主服务器的情况。在此情况下单个哨兵通过命令链接发送INFO至主服务器后,主服务器的snetinel:hello频道的返回信息会被多个哨兵订阅接收。因此哨兵之间存在相互感知。
哨兵除了监视主从服务器也同时对链接在共同主服务器上的其他哨兵进行监视。因此当当前哨兵检测到有其他哨兵存在时,不仅会在字典中加入其他哨兵的信息。同时创建连向该哨兵的命令链接(哨兵间只通过命令链接通信)
第三层同步是哨兵间的同步,为的是检测哨兵是否在线。
哨兵默认以每秒一次的频率向所有与他创建了命令链接的实例(主从服务器、其他哨兵)发送PING命令,通过返回的PING恢复来判断对方是否在线。
判断是否在线包含两种方式:主观下线、客观下线
主观下线:定义一个最长等待时间,超过该时间没有收到回复就判定为主观下线
客观下线:收集其他哨兵的返回信息,超过半数的认为哨兵A下线的话,哨兵A则在该哨兵内被判为客观下线
注意:每个哨兵对其他哨兵是否下线的判断尺度不同。因此可能存在信息不一致
A:2ms B:4ms C:6ms -->尺度不同
故障转移
通过选举出领头哨兵,领头哨兵决定如何转移。