首页/数据/Redis 进阶速查/切换事件与 +switch-master 通知
主从与哨兵51 条

切换事件与 +switch-master 通知

哨兵通过发布订阅频道 __sentinel__:hello 与事件流通知状态变化,客户端关键关注 +switch-master(新主库地址)与 +sdown/-sdown。

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

哨兵事件怎么用

哨兵把状态变化以事件形式发布到自己的发布订阅频道,客户端订阅后能在主库地址变化的第一时间刷新连接,也能把事件接进告警系统。同样的内容会写进哨兵日志,线上排障通常用日志做时间线、用事件做自动联动。

基本信息

订阅方式连接哨兵端口(默认 26379)执行 SUBSCRIBE 或 PSUBSCRIBE
关键事件+switch-master、+sdown、+odown、+failover-end、+new-epoch
哨兵间频道__sentinel__:hello,用于哨兵互相发现
为什么用客户端刷新主库地址、告警联动、演练时间线核对

典型使用场景

  • 客户端刷新主库地址:收到 +switch-master 后重建连接池,减少写入失败窗口
  • 告警联动:把 +odown 与 +switch-master 接入监控,人工介入前先有通知
  • 演练核对:用事件顺序确认切换只选举了一次、有没有反复尝试
  • 排查误判:对比多台哨兵报出的 +sdown 时间,判断是网络分区还是目标真的挂了
  • 确认哨兵间沟通正常:观察 hello 消息是否持续更新,判断是否有哨兵掉队

订阅示例

订阅示例
redis-cli -p 26379 PSUBSCRIBE '*'                 # 排障时订阅全部哨兵事件
redis-cli -p 26379 SUBSCRIBE +switch-master        # 只关心主库切换
# 切换后收到的消息结构:pmessage / 匹配模式 / +switch-master / 'mymaster 旧IP 旧端口 新IP 新端口'
redis-cli -p 26379 PSUBSCRIBE '__sentinel__:hello'  # 观察哨兵之间的问候消息
grep -E 'switch-master|sdown|odown' /var/log/redis/sentinel.log | tail -20   # 日志对照

关键事件读法

事件触发时机处理建议
+sdown / -sdown单台哨兵的主观下线判定与恢复只看一台报 sdown 时先怀疑网络
+odown / -odown达到法定票数的客观下线通常紧接着进入切换流程
+try-failover / +elected-leader开始尝试切换与选出执行切换的哨兵确认只选举了一次
+switch-master新主库地址确定立即刷新客户端连接并更新入口
+failover-end切换流程结束核对其余从库是否已重指向
+new-epoch配置纪元递增用于过滤过期事件,避免重复处理
+switch-master 的消息体是空格分隔的固定字段:主库名、旧地址、旧端口、新地址、新端口,按位置解析即可,不要依赖会变化的文本前缀。
__sentinel__:hello 频道承载哨兵之间的互相发现,消息里包含发送方哨兵地址、运行 id、当前纪元以及它认知的主库地址;客户端也可以借这个频道发现其他哨兵。
事件是异步通知而不是可靠投递:订阅连接断开期间的事件不会补发。关键路径必须以查询结果为准,例如拿到事件后再用 SENTINEL get-master-addr-by-name 确认当前主库地址。

易错点

  • 客户端只连一台哨兵订阅:那台哨兵故障时事件流中断,切换也没人通知,应该轮询或同时连接所有哨兵地址
  • 把 +switch-master 当作切换已完成的信号:它只表示新主地址确定,其余从库可能还没重指向,数据一致性检查要往后放
  • 用字符串前缀匹配事件名来分发:不同版本的事件列表会增补,解析逻辑要允许未知事件并容错处理
  • 哨兵端口对网络开放且允许订阅:拓扑变化会被无关方看到,应做访问控制与网络隔离

数据来源与参考

  • Redis 官方文档:Sentinel 事件与 Pub/Sub 通知说明
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌