解析Redis中的哨兵模式,聊聊搭建和执行流程

高手们,我想请说明下,解析Redis中的哨兵模式,聊聊搭建和执行流程
最新回答
中分一哥腰不好

2026-10-22 10:53:26

Redis哨兵模式解析

一、哨兵模式搭建步骤
哨兵模式通过多个Sentinel实例监控Redis主从集群,实现故障自动转移。搭建流程如下:

  1. 复制配置文件:复制默认的sentinel.conf文件,生成多个配置文件(如sentinel-26379.conf、sentinel-26380.conf),每个文件对应一个Sentinel实例。
  2. 修改配置参数:

    端口设置:修改port参数为不同端口(如26379、26380)。

    后台运行:将daemonize从no改为yes。

    监控主节点:配置sentinel monitor <master-name> <ip> <port> <quorum>,指定主节点名称、IP、端口及法定人数(如quorum=2表示至少2个Sentinel认为主节点下线时触发故障转移)。

    认证密码:若Redis启用密码,需通过sentinel auth-pass <master-name> <password>设置统一密码。

    下线判定时间:调整sentinel down-after-milliseconds <master-name> <milliseconds>(如3000毫秒),定义主观下线时间阈值。

    并行同步数:通过sentinel parallel-syncs <master-name> <numslaves>(如numslaves=1)限制故障转移时同步的从节点数量。

    故障转移超时:设置sentinel failover-timeout <master-name> <milliseconds>(如80000毫秒),控制故障转移操作的最大耗时。

  3. 启动Redis主从节点:分别启动主节点和从节点的Redis服务。
  4. 启动Sentinel实例:通过命令(如./redis-sentinel sentinel-26379.conf)启动所有Sentinel实例。
  5. 验证状态:使用redis-cli -p 26379 sentinel master <master-name>查看监控状态,确认集群正常运行。

二、执行流程

  1. 初始化与连接建立:Sentinel启动后创建两个连接:

    命令连接:向主节点发送命令并接收响应。

    订阅连接:订阅主节点的__sentinel__:hello频道,接收其他Sentinel信息。

  2. 信息收集:

    主节点信息:每10秒发送INFO命令,获取主节点及其从节点列表。

    从节点信息:对新发现的从节点建立命令和订阅连接,同样每10秒发送INFO命令更新状态。

  3. 消息广播:每2秒通过__sentinel__:hello频道发送自身信息(如IP、端口、运行ID)及主节点状态。
  4. 主观下线检测:每秒向所有实例(主、从、其他Sentinel)发送PING命令,若实例在down-after-milliseconds时间内无有效响应(如超时或返回错误),则标记为主观下线(SDown)。
  5. 客观下线判定:当Sentinel发现主节点主观下线后,向其他Sentinel发送SENTINEL is-master-down-by-addr命令,若超过quorum数量的Sentinel同意,则判定主节点客观下线(ODown)。
  6. Leader选举:通过Raft协议选举Leader Sentinel:

    状态转换:未投票的Sentinel转为Candidate,增加任期(epoch),发起投票请求。

    投票规则:其他Sentinel根据epoch判断是否投票,若Candidate获得超半数且超过quorum的票数,则成为Leader。

  7. 故障转移:

    选择新主节点:从健康的从节点中筛选优先级最高、复制偏移量最大、运行ID最小的节点。

    升级主节点:Leader Sentinel将选中的从节点升级为主节点,并让其他从节点复制新主节点。

    更新配置:修改所有节点的配置文件(如replicaof指向新主节点),并通知客户端新主节点地址。

三、关键机制

  • Raft协议:确保Leader选举的一致性,通过随机超时时间避免分裂投票。
  • 数据安全:故障转移时限制并行同步的从节点数量,避免数据不一致。
  • 自动恢复:原主节点恢复后,默认作为新主节点的从节点运行,需手动调整配置以重新成为主节点。

哨兵模式通过自动化监控和故障转移,显著提升了Redis集群的可用性,适用于对数据一致性要求较高的场景。