首页/数据/数据库速查/客户端接入哨兵(发现与重连)
Redis 运维与场景124 条

客户端接入哨兵(发现与重连)

客户端先询问哨兵当前主地址再建连,并订阅 +switch-master 或轮询探测;主流客户端库(Jedis/Lettuce/redis-py)均内置哨兵支持。

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

客户端接入哨兵

哨兵负责选出新主库,但客户端不会自动知道切换结果:客户端要先向哨兵询问当前主库地址再建连,并在后续订阅切换事件或轮询探测。主流客户端库(Jedis、Lettuce、redis-py、go-redis)都内置哨兵支持,直接用封装好的接口即可。

基本信息

哨兵默认端口26379
主库发现SENTINEL get-master-addr-by-name 主库名
切换事件订阅 +switch-master,或 +sdown 与 +odown
客户端要求连接池要能在切换后重建,不能只重连旧地址
超时设置单次探测超时建议 1 秒以内,避免故障时请求堆积

典型使用场景

  • 业务接入哨兵高可用:应用只配置哨兵地址列表与主库名,不需要硬编码主库 IP
  • 故障切换后自动恢复:客户端收到切换事件后刷新主库地址并重建连接池
  • 多语言混布:各语言客户端都按同一套哨兵地址列表配置,便于统一运维
  • 灰度验证切换链路:用订阅事件观察切换是否被客户端正确感知
  • 排障:手工询问哨兵主库地址,与客户端实际连接目标做比对

接入与校验

接入与校验
# Python:哨兵地址列表 + 主库名,读写分别取连接
from redis.sentinel import Sentinel
sentinel = Sentinel([('10.0.0.21', 26379),
                     ('10.0.0.22', 26379),
                     ('10.0.0.23', 26379)], socket_timeout=1)
master = sentinel.master_for('mymaster', socket_timeout=0.5, password='***')
slave = sentinel.slave_for('mymaster', socket_timeout=0.5, password='***')
master.set('k', 'v')          # 写走当前主库
print(slave.get('k'))         # 读走当前从库

命令行校验

命令行校验
redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster
redis-cli -p 26379 SENTINEL masters          # 所有被监控主库概览
redis-cli -p 26379 SENTINEL sentinels mymaster   # 其余哨兵节点
redis-cli -p 26379 PSUBSCRIBE +switch-master     # 观察切换事件

事件与含义

事件含义客户端动作
+switch-master切换完成,新旧地址同时给出刷新主库地址并重建连接池
+sdown某个哨兵认为节点主观下线暂不动作,等待是否升级为客观下线
+odown达到票数判定客观下线准备应对切换,避免大量写入重试
+promoted-slave从库被提升为新主库确认新主库可写后恢复写入
客户端要处理「连接被重置」这类异常:切换瞬间旧主库变成从库,写入会失败一次,重试前必须重新向哨兵要地址。
哨兵地址列表要配置全部节点:只配一个哨兵时,该哨兵宕机客户端就连不上,高可用形同虚设。

易错点

  • 客户端不订阅切换事件也不重查地址:切换后持续连旧主库并报错,业务长时间不可恢复
  • 连接池超时设置过长(如数十秒):故障期间请求全部堆积,恢复瞬间形成雪崩
  • 只配置一个哨兵地址:哨兵本身成为单点,失去高可用意义
  • 硬编码主库 IP:切换后必须改配置发版才能恢复,违背使用哨兵的初衷

数据来源与参考

  • Redis 官方文档: Sentinel 客户端指南
  • redis-py 文档: Sentinel

相关工具

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