首页/数据/数据库速查/故障判定与自动切换流程(sdown/odown/选举)
Redis 运维与场景124 条

故障判定与自动切换流程(sdown/odown/选举)

流程:单哨兵主观判定 sdown -> 达到 quorum 后标记 odown -> 选举领头哨兵 -> 挑选较合适的从库提升 -> 重配其它从库与旧主 -> 通知客户端。

数据库速查数据更新于 2026-10-13

哨兵故障切换流程是什么

哨兵的切换是一条完整链路:单个哨兵先在 down-after-milliseconds 内收不到响应,把它标记为主观下线 sdown;当达到 quorum 个哨兵都认为它挂了,才升级为客观下线 odown;接着哨兵之间选举出领头者,由它挑选合适的从库提升为新主,再把其他从库和恢复后的旧主重新指向新主,最后通过 Pub/Sub 事件通知客户端。

基本信息

关键配置down-after-milliseconds / failover-timeout / parallel-syncs / quorum
判定阶段sdown 为单点视角,odown 为达到票数后的客观判定
选举要求需要多数哨兵授权,因此哨兵数量应为奇数
选主顺序replica-priority 小者优先,其次复制 offset 大者,再次 runid 小者
通知方式Pub/Sub 的 +switch-master 等事件

典型使用场景

  • 主库宕机自动切换:把人工介入时间压缩到秒级
  • 故障演练:用停进程或阻塞端口模拟,观察整个切换链路
  • 事件跟踪:订阅 +switch-master 与 +sdown 事件掌握每次变更
  • 误判治理:down-after-milliseconds 设得过小时网络抖动就触发切换
  • 优先级调整:给机器规格高的从库设更小的 replica-priority
  • 切换后核对:确认所有从库都已指向新主,没有节点仍指向旧主

观察切换过程

观察切换过程
redis-cli -p 26379 SENTINEL master mymaster | grep -E 'flags|num-slaves|quorum'
redis-cli -p 26379 INFO sentinel
redis-cli -p 26379 PSUBSCRIBE '+switch-master'   # 订阅主库变更事件
redis-cli -p 26379 PSUBSCRIBE '+sdown' '+odown'  # 订阅下线判定事件
tail -f /var/log/redis/sentinel.log              # 日志里能看到各阶段状态
redis-cli -p 26379 SENTINEL replicas mymaster    # 切换后确认从库列表
redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster   # 客户端取值方式

阶段读法

阶段触发条件动作
sdown单个哨兵在超时时间内无响应仅标记,不触发切换
odown达到 quorum 个哨兵确认下线进入故障转移流程
选举哨兵之间需要多数派授权选出领头哨兵
提升领头哨兵挑从库执行主库提升候选从库变为可写新主
重配其余从库改指向新主旧主恢复后也被降级为从库
从库挑选顺序:replica-priority(小者优先)大于复制 offset 大者,再大于 runid 小者;把重要机器 priority 调小可以影响切换结果。
切换期间存在短暂的写入真空:旧主未隔离时可能仍接受客户端写入,新主则从自己的数据开始服务;应确保应用支持主库变更事件并开启自动重连,必要时配合代理层统一地址入口。

易错点

  • down-after-milliseconds 设得过小,网络抖动频繁触发切换,数据反复同步
  • application 未订阅主库变更事件,切换后仍连旧主直到人工改配置
  • 哨兵数量为偶数或与数据节点同机部署,故障时凑不齐多数派
  • 从库优先级未按机器规格设置,结果把最弱的机器选成新主
  • 旧主网络恢复后未被正确降级,出现两个可写实例造成数据分叉

数据来源与参考

  • Redis 官方文档: 故障切换流程
  • Redis 官方文档: sentinel down-after-milliseconds

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌