Redis 的 哨兵机制(Sentinel) 是 Redis 的高可用性解决方案,用于监控主从节点的状态,并在主节点发生故障时自动进行故障转移,确保服务的持续可用性。以下是对其核心原理和功能的详细解析:
1. 核心功能
哨兵机制主要实现以下三个任务:
- 监控(Monitoring)
- 哨兵会周期性地向主节点和从节点发送 PING 命令,检测它们是否在线。
- 若节点在
down-after-milliseconds
时间内未响应,哨兵会标记该节点为 主观下线(Subjectively Down, SDOWN)。 - 如果多个哨兵(数量 ≥
quorum
配置值)都认为主节点下线,则标记为 客观下线(Objectively Down, ODOWN)。
- 通知(Notification)
- 当哨兵检测到主节点或从节点故障时,可通过 API 向管理员或其他应用程序发送通知(如邮件、短信等)。
- 自动故障转移(Automatic Failover)
- 当主节点被判定为客观下线后,哨兵会从从节点中选举一个新主节点,完成主从切换,并更新客户端和从节点的配置,确保服务恢复。
2. 工作原理
(1)哨兵集群的选举机制
- 基于 Raft 协议的选举:
- 哨兵节点通过 Gossip 协议 交换节点状态信息。
- 当主节点被判定为客观下线后,哨兵节点会发起 领导者选举。
- 选举条件:
- 哨兵需获得 多数票(≥ N/2 + 1),其中
N
是哨兵总数。 - 若哨兵未成功当选,会重新发起选举(默认超时时间 100ms)。
- 哨兵需获得 多数票(≥ N/2 + 1),其中
(2)故障转移流程
- 筛选候选从节点
- 排除已下线节点、优先级为 0 的节点。
- 按以下规则选择新主节点:
- 优先级最高的从节点(
replica-priority
配置项)。 - 若优先级相同,选择复制偏移量最大的从节点(数据最完整)。
- 若仍相同,选择 Run ID 最小的从节点。
- 优先级最高的从节点(
- 执行故障转移
- 领导者哨兵将选中的从节点升级为新主节点(执行
SLAVEOF NO ONE
命令)。 - 其他从节点重新指向新主节点(执行
SLAVEOF <new-master-ip> <new-master-port>
)。 - 客户端通过哨兵获取新主节点地址,完成连接切换。
- 领导者哨兵将选中的从节点升级为新主节点(执行
- 配置更新
- 哨兵集群内部同步新主节点信息。
- 通过发布/订阅机制通知客户端主节点变更(如
+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 个从节点:
- 正常运行:哨兵定期检测主从节点状态。
- 主节点故障:哨兵判定主节点下线,选举领导者哨兵。
- 故障转移:领导者哨兵将从节点升级为新主节点,其他从节点切换。
- 客户端更新:客户端通过哨兵获取新主节点地址,恢复服务。
总结
Redis 哨兵机制通过 监控、选举、故障转移 的闭环流程,解决了主从架构的单点故障问题,显著提升了系统的可用性。
虽然配置稍显复杂,但通过合理设置 quorum
、down-after-milliseconds
等参数,可以有效降低脑裂风险,保障服务稳定性。对于高可用性要求较高的业务场景,哨兵机制是一个不可或缺的组件。
THE END