面试题:Redis 的哨兵机制是什么?

Redis 的 哨兵机制(Sentinel) 是 Redis 的高可用性解决方案,用于监控主从节点的状态,并在主节点发生故障时自动进行故障转移,确保服务的持续可用性。以下是对其核心原理和功能的详细解析:


1. 核心功能

哨兵机制主要实现以下三个任务:

  1. 监控(Monitoring)
    • 哨兵会周期性地向主节点和从节点发送 PING 命令,检测它们是否在线。
    • 若节点在 down-after-milliseconds 时间内未响应,哨兵会标记该节点为 主观下线(Subjectively Down, SDOWN)
    • 如果多个哨兵(数量 ≥ quorum 配置值)都认为主节点下线,则标记为 客观下线(Objectively Down, ODOWN)
  2. 通知(Notification)
    • 当哨兵检测到主节点或从节点故障时,可通过 API 向管理员或其他应用程序发送通知(如邮件、短信等)。
  3. 自动故障转移(Automatic Failover)
    • 当主节点被判定为客观下线后,哨兵会从从节点中选举一个新主节点,完成主从切换,并更新客户端和从节点的配置,确保服务恢复。

2. 工作原理

(1)哨兵集群的选举机制

  • 基于 Raft 协议的选举
    • 哨兵节点通过 Gossip 协议 交换节点状态信息。
    • 当主节点被判定为客观下线后,哨兵节点会发起 领导者选举
    • 选举条件:
      • 哨兵需获得 多数票(≥ N/2 + 1),其中 N 是哨兵总数。
      • 若哨兵未成功当选,会重新发起选举(默认超时时间 100ms)。

(2)故障转移流程

  1. 筛选候选从节点
    • 排除已下线节点、优先级为 0 的节点。
    • 按以下规则选择新主节点:
      • 优先级最高的从节点(replica-priority 配置项)。
      • 若优先级相同,选择复制偏移量最大的从节点(数据最完整)。
      • 若仍相同,选择 Run ID 最小的从节点。
  2. 执行故障转移
    • 领导者哨兵将选中的从节点升级为新主节点(执行 SLAVEOF NO ONE 命令)。
    • 其他从节点重新指向新主节点(执行 SLAVEOF <new-master-ip> <new-master-port>)。
    • 客户端通过哨兵获取新主节点地址,完成连接切换。
  3. 配置更新
    • 哨兵集群内部同步新主节点信息。
    • 通过发布/订阅机制通知客户端主节点变更(如 +switch-master 事件)。

3. 关键配置参数

参数说明推荐值
sentinel monitor <master-name> <ip> <port> <quorum>监控的主节点信息及判定下线所需的哨兵数quorum 通常设为哨兵数 / 2 + 1(如 3 哨兵设为 2)
sentinel down-after-milliseconds判定节点主观下线的超时时间生产环境建议 5000-10000ms
sentinel failover-timeout故障转移超时时间默认 180000ms(3 分钟)
sentinel parallel-syncs故障转移后同时同步的从节点数不宜过大,避免主节点负载过高(如设为 1)

4. 哨兵模式的优缺点

优点

  • 高可用性:自动故障转移,避免单点故障。
  • 数据冗余:通过主从复制实现数据备份。
  • 读写分离:客户端可将读请求分发到从节点,减轻主节点压力。

缺点

  • 配置复杂:需要部署多个哨兵节点,并合理设置参数。
  • 无法分片:不支持数据分片,受单节点内存限制(需结合 Cluster 模式)。
  • 脑裂风险:若网络分区导致多个哨兵集群误判,可能引发脑裂(需合理配置 quorum 和 down-after-milliseconds)。

5. 适用场景

  • 高可用性要求高的场景:如金融支付、电商秒杀系统。
  • 数据备份与容灾:通过主从复制+哨兵实现数据冗余。
  • 中小规模数据存储:当数据量较小且无需分片时,哨兵模式是理想选择。

6. 实际案例

假设部署 3 个哨兵节点(quorum=2),监控一个主节点和 2 个从节点:

  1. 正常运行:哨兵定期检测主从节点状态。
  2. 主节点故障:哨兵判定主节点下线,选举领导者哨兵。
  3. 故障转移:领导者哨兵将从节点升级为新主节点,其他从节点切换。
  4. 客户端更新:客户端通过哨兵获取新主节点地址,恢复服务。

总结

Redis 哨兵机制通过 监控、选举、故障转移 的闭环流程,解决了主从架构的单点故障问题,显著提升了系统的可用性。

虽然配置稍显复杂,但通过合理设置 quorumdown-after-milliseconds 等参数,可以有效降低脑裂风险,保障服务稳定性。对于高可用性要求较高的业务场景,哨兵机制是一个不可或缺的组件。

THE END
喜欢就支持一下吧
点赞6 分享