首页/数据/Redis 进阶速查/客户端接入哨兵的模式
主从与哨兵51 条

客户端接入哨兵的模式

客户端连接哨兵列表(而非单台哨兵)查询主库地址,并在切换事件/查询变化后刷新连接池;多数主流客户端库内置哨兵支持。

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

客户端如何发现主库

在哨兵方案里,客户端不应写死主库地址,而是配置一组哨兵地址,由哨兵帮忙定位当前主库。标准做法是:连接哨兵列表,用 SENTINEL GET-MASTER-ADDR-BY-NAME 拿到主库的 ip 与端口,再连主库;同时订阅哨兵的事件频道监听 +switch-master,或在连接出错后重新查询,以便在主库变更后刷新连接池。主流客户端库大多内置哨兵模式,手写实现容易漏掉事件订阅与连接重建这两个环节。

基本信息

输入哨兵地址列表 + master 名称 + 认证信息
查询命令SENTINEL GET-MASTER-ADDR-BY-NAME
感知方式订阅 +switch-master,或周期性重新查询
前置要求所用客户端库支持哨兵模式
冗余至少配置两台以上哨兵地址

典型使用场景

  • 使用哨兵做高可用的业务系统接入 Redis,避免单点地址
  • 切换期间快速恢复:连接失败后重新查询主库并重建连接池
  • 就绪探针与健康检查:把「能查到主库且能连通」作为检查项
  • 多语言技术栈统一接入方式,避免各语言各写一套发现逻辑
  • 切换演练时验证客户端从感知到恢复的实际耗时

接入与验证

接入与验证
# 客户端配置(伪代码):
# sentinel_nodes: [10.0.0.31:26379, 10.0.0.32:26379, 10.0.0.33:26379]
# master_name: mymaster
redis-cli -p 26379 SENTINEL GET-MASTER-ADDR-BY-NAME mymaster  # 确认能查到主库
redis-cli -p 26379 SUBSCRIBE +switch-master                   # 验证事件是否可达
redis-cli -p 26379 SENTINEL SENTINELS mymaster                # 确认哨兵之间已互相发现

接入检查项

检查项期望状态常见问题
哨兵地址数量至少两台只配一台,哨兵故障后无法发现主库
主库查询结果能返回 ip 与端口名称拼错时返回空值而不是报错
事件订阅能收到 +switch-master只靠周期轮询,切换感知慢
连接池旧连接能被淘汰半死连接长期占用,请求间歇失败
客户端缓存主库地址是必要的,但缓存必须有失效手段:收到切换事件、连接报只读错误(READONLY)或被重定向时,都应触发一次重新查询,重新建立到新主库的连接。

易错点

  • 只配置一台哨兵地址,那台哨兵故障时客户端无法重新发现主库,高可用在客户端侧失效
  • 切换后旧连接产生的错误没有被识别,连接池里长期留着指向旧主库的半死连接
  • 把哨兵端口 26379 与数据端口 6379 配混,握手阶段就直接失败
  • 客户端长期硬编码主库地址且没有刷新机制,主库变更后持续路由到旧地址

数据来源与参考

  • Redis 官方文档:Sentinel 客户端指引
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌