首页/数据/Redis 进阶速查/哨兵领导者选举(Raft 思路)
主从与哨兵51 条

哨兵领导者选举(Raft 思路)

进入 ODOWN 后,哨兵们请求投票选出领导者执行切换:候选按配置纪元递增请求,获得多数派票者当选,未当选者按 failover-timeout 节流重试。

Redis 进阶速查数据更新于 2026-10-13

领导者是怎么选出来的

主库被判定为客观下线后,哨兵们要选出一个领导者来执行这次故障转移。过程借用 Raft 的思路:发起者把配置纪元加一并向其他哨兵请求投票,谁先拿到多数派票谁当选,落选者等待一段时间后可以再次发起。当选者负责挑选新主库、指挥其余副本改指向,最后把新配置广播出去,其余哨兵据此同步状态。

基本信息

触发条件主库被判定为客观下线
投票依据配置纪元与多数派同意
结果一个领导者执行切换,其余哨兵跟随
重试机制落选者等待一段时间后可重新发起
日志标记投票、当选、尝试切换等事件标记

典型使用场景

  • 切换失败需要判断卡在哪一步,先确认是否选出过领导者
  • 哨兵数量不足或互相不通导致选举反复失败,需要快速定位
  • 演练时验证选举与切换是否按预期完成,记录耗时
  • 排查日志里纪元不断递增的震荡现象
  • 为哨兵集群设计告警时明确哪些事件代表异常

观察选举过程

观察选举过程
grep -iE 'vote-for-leader|new-epoch|switch-master' /var/log/redis/sentinel.log | tail -20
redis-cli -p 26379 SENTINEL MASTERS | grep -E 'name|flags'
redis-cli -p 26379 SENTINEL CKQUORUM mymaster   # 检查是否满足判定所需的票数
redis-cli -p 26379 SENTINEL SENTINELS mymaster  # 哨兵之间是否互相可见

日志标记与含义

标记含义需要关注的情况
纪元更新配置版本号被提升频繁递增说明存在拓扑震荡
投票事件某哨兵投票给某个候选长期无投票记录说明哨兵间不通
尝试切换选举出的领导者开始执行反复出现说明切换未完成
切换完成新主库已确定并广播耗时明显偏长需要复盘
选举是多哨兵之间的自动协调动作,不需要人工干预;反复选举失败通常指向哨兵之间网络不通或哨兵数量不足。
哨兵两两之间也要能互相通信,防火墙只放行应用侧到业务端口的链路是常见漏配,结果就是每个哨兵都只能看到自己。

易错点

  • 哨兵之间端口未互相放行,客观下线后无人响应投票,故障转移永远无法启动
  • 只部署两个哨兵,一台故障就不能凑够多数派,选举名存实亡
  • 把纪元反复递增当作正常现象,忽略背后可能是网络分区引起的拓扑震荡
  • 不检查判定所需票数就上线,quorum 设置过高导致永远无法判定下线

数据来源与参考

  • Redis 官方文档:Sentinel 选举与切换流程
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌