redis高可用之哨兵模式

文章目录

  • redis高可用之哨兵模式
    • sentinel会创建连向主从服务器的命令连接和订阅连接
      • 命令连接
      • 订阅连接
    • sentinel故障检测与故障转移
      • 检测主观下线
      • 检测客观下线
      • 选举首领sentinel
      • 故障转移
    • 参考文献

redis高可用之哨兵模式

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

sentinel会创建连向主从服务器的命令连接和订阅连接

​ 对于每个被sentinel监视的主从服务器来说,sentinel会创建两个连向主从服务器的异步连接:命令连接和订阅连接。因为sentinel需要与多个实例创建网络连接,所以使用的是异步连接。

命令连接

  1. sentinel默认会以每10秒一次的频率,通过命令连接向被监视主从服务器发送INFO命令,并通过分析INFO命令的回复来获取服务器的当前信息。
  2. sentinel默认会以每2秒一次的频率,通过命令连接向所有被监视的服务器发送PUBLISH命令

订阅连接

​ 当sentinel与服务器建立起订阅连接后,会通过订阅连接向服务器发送SUBSCRIBE命令。每个与sentinel连接的服务器,sentinel既通过命令连接向服务器的hello频道发送消息,又通过订阅连接从服务器的hello频道接收消息。

​ 对于监视同一个服务器的多个sentinel来说,一个sentinel发送的消息会被其他的sentinel接收到,这些消息用于更新其他sentinel对发送消息的sentinel的认知,也被用于更新其他sentinel对被监视服务器的感知。当一个sentinel通过频道发现另外一个sentinel时,会创建连向这个新的sentinel的命令连接,同时这个新的sentinel也会创建一个连向这个sentinel的连接,最后,监视同一个服务器的sentinel之间会构成一个互相连接的网络。

sentinel故障检测与故障转移

检测主观下线

​ 默认情况下,sentinel会以每秒一次的频率向所有与它创建了命令连接的服务器(主服务器、从服务器、sentinel)发送PING命令,并通过实例返回的PING命令回复来判断实例是否在线。如果一个实例在指定时间内连续向sentinel返回无效回复,那么sentinel会认为该实例处于主观下线状态。

检测客观下线

​ 当sentinel将一个服务器标记为主观下线状态之后,为了确认该服务器是否真的下线了,它会向监视这个服务器的其他sentinel发出询问。当该sentinel从其它sentinel那里接收到足够数量的已下线状态判断后,会将该服务器判定为主观下线,并对该服务器执行故障转移操作。

选举首领sentinel

​ 当一个主服务器被判定为客观下线时,监视这个主服务器的sentinel会选举出一个leader sentinel,由这个leader对下线服务器执行故障转移操作。leader sentinel选举规则和方法如下:

  1. 监视同一个主服务器的所有在线sentinel都有成为leader的资格
  2. 每次进行leader选举后,无论成功与否,所有sentinel的配置纪元(epoch)都自增一次
  3. 在一个配置纪元中,所有sentinel都有一次将某个sentinel设置为局部首领sentinel的机会,且局部首领一旦确定,则在这个配置纪元中就不能再更改
  4. 每个发现主服务器主观下线的sentinel都会要求其它sentinel将自己设置为leader
  5. sentinel设置leader是先到先得,最先向目标sentinel发送设置要求的源sentinel会竞争成功,这个目标sentinel会拒绝之后收到的所有设置要求
  6. 源sentinel接收到目标sentinel的回复之后,检查回复中的epoch和leader_run_id确认leader信息
  7. 如果有某个sentinel被半数以上的sentinel设置为局部leader,那么这个局部leader成功首领sentinel
  8. leader的产生需要得到半数以上的sentinel支持,且每个sentinel在一个epoch里只能选一个局部leader,所以在一个纪元中只会存在一个leader
  9. 如果在指定时间内没有一个sentinel被选举为leader,则各个sentinel在一段时间后再次进行选举,直到选出leader为止

故障转移

​ 在选举出首领sentinel后,由首领sentinel对已下线的主服务器执行故障转移操作,包含以下三个步骤:

  1. 在已下线的主服务所属的从服务器中选出一个从服务器,将该从服务器转换为主服务器
  2. 让已下线的主服务器所属的从服务器改为复制新的主服务器
  3. 将已下线的主服务器转换为从服务器,并复制新的主服务器,这样当这个旧的主服务器上线时就会成为新服务器的从服务器

​ 选择新服务器的规则如下:

  1. 删除已下线或断线的,保证列表中从服务器都是正常在线的
  2. 删除列表中最近5秒内没有回复过首领sentinel的INFO命令的从服务器,保证列表中的从服务器是最近成功通信过的
  3. 删除列表中与已下线主服务器连接断开时间超过指定时限的从服务器,保证列表中的从服务器中保存的数据都是较新的
  4. 首领sentinel依次根据从服务器的优先级(大的优先)、复制偏移量(大的优先)、运行ID(小的优先)选出一个最优的作为新的主服务器

参考文献

redis设计与实现

你可能感兴趣的:(redis)