标签搜索

目 录CONTENT

文章目录

Redis高可用方案 之 哨兵模式(Sentinel)

沙漠渔
2022-08-29 00:02:46 / 0 评论 / 0 点赞 / 1,225 阅读 / 2,097 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-08-29,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

1、什么是哨兵模式?

哨兵模式(Sentinel)是Redis提供了高可用方案。由一个或者多个Sentinel实例组成的监控系统,可以监控多个主服务器以及其从服务器运行状态,当被监视的主服务器节点下线的时候会从从服务器自动选出新的节点继续承担服务。

如下图表示一个Sentinel模式下的组织结构图
oZz8pK.png

其描述了 Sentinel 监控了四台Redis实例,其中server1担任主服务器,sever2-4担任从服务器并复制server1的数据。那么当server1因故障下线的时候,Sentinel会从server2-4中选举出新的Master,当server1恢复的时候,server1的角色会变成从服务器。

Sentinel 是Redis的一种特殊运行状态,相比于RedisServer,RedisSentinel的参数以及命令表都有所区别。

2、Sentinel 与服务器的交互

当Sentinel 与服务器连接的时候会创建两个连接,一个是命令连接,用于Sentinel实例与Redis服务器交互;另外会创建一个订阅链接会定义Redis实例的 __sentinel:hello__ 频道用于保障命令连接的数据不会丢失。

2.1 Sentinel获取服务器信息

  • 对于主服务器,Sentinel 会每隔10S向被监控的主服务器发送INFO 命令,通过主服务器的返回数据分析出,主服务器的信息以及从服务器的信息
  • 当Sentinel发现从服务器的时候,Sentinel会为这个新的从服务器创建命令连接订阅连接。同样的,Sentinel 也会每隔10S向从服务器发送INFO命令,通过从服务器返回的数据分析出从服务器的数据以及其复制的主服务器信息。

2.2 接收主服务器信息和从服务器信息

当Sentinel与服务器连接之后会向服务器执行订阅频道命令SUBSCRIBE __sentinel:hello_ 实现订阅。此订阅一致会连接,直到Sentinel与服务断开连接。也就是说 Sentinel会通过命令连接发送命令,也会通过订阅 __sentinel:hello_获取到相应的数据,即如下所示:
hGDBSR.png

同时监控同一个服务器的多个Sentinel 实例来说,此种方式也会达到 Sentinel互相感知的目的。如 Sentinel1向服务器发送命令,数据可能被其他Sentinel实例接收,当被接受的实例发现命令的发送方非自己的时候,就会连接对应的Sentinel,从而达到会向感知的目的。

2UHkDm.png

3、服务器的下线与故障转移流程

Sentinel实例每隔一定时间会向其所有的连接(包括主服务器,从服务器以及其他Sentinel实例)发送PING命令,通过返回的数据判断服务器是否可用。当实例返回PONG、LOADING 、MASTERDOWN的时候则认为服务可用,返回其他或者超时这任务服务不可用。

若超过一定的时间(配置项down-after-milliseconds) 时候,则此Sentinel服务判断该服务器已经下线,我们称之为主观下线

当一个服务器主观认为某个服务器下线的时候,他会向其他Sentinel实例发送命令SENTINEL is-master-down-by-addr [ip] [port] [x] [runid] 咨询该服务是否已下线,若接收到足够多的反馈认为该服务已下线,则Sentinel会判定该服务器主观下线,开始对服务器执行故障转移操作。

当一个主服务被判断为客观下线的之后,监控这个下线的Sentinel会发起一次选举,选举另一个领头的Sentinel,该Sentinel会对该服务器执行故障转移操作。

Sentinel 选举领头的算法是 Raft算法的实现,关于这一点读者可自行查询相关资料,了解其详细流程。

故障转移的流程为:

  1. 从该主服务器(这里称之为M)的所有从服务器中选择出一个作为新的主服务器,通过命令SLAVEOF no one 设置为主服务器,该服务器称之为NM
  2. 将其他从服务器和已下线的主服务器M的主服务器设置为NM,即 salveof [NM.host] [NM.port]
0
广告 广告

评论区