spring.redis.sentinel.master 和 spring.redis.sentinel.nodes 必须同时准确配置,master 值须与 sentinel.conf 中 sentinel monitor 的第三个参数完全一致(如 mymaster),nodes 必须为应用可直连的哨兵地址(禁用 localhost),多个地址用英文逗号分隔且无空格;密码需分别配置主从密码(spring.redis.password)和哨兵密码(spring.redis.sentinel.password);Lettuce 默认每10秒刷新主节点,故障转移后需确保连接池及时更新。

spring.redis.sentinel.master 和 spring.redis.sentinel.nodes 必须同时存在且值准确,否则应用启动不报错,但运行时会抛出 Cannot connect to sentinel 或连接超时,根本连不上主节点。
spring.redis.sentinel.master 值必须与哨兵实际监控的 master 名称完全一致
这个名称不是你随便定义的,而是来自 sentinel.conf 中 sentinel monitor 指令的第三个参数:
sentinel monitor mymaster 192.168.43.243 6379 2
上面这行里的 mymaster 就是你要填的值。常见错误包括:
- 大小写不匹配(如填成
Mymaster或MYMASTER) - YAML 文件中混入全角空格或不可见字符(尤其缩进后粘贴时)
- 与哨兵日志中
+monitor事件打印的名称不一致(可用redis-cli -p 26379 sentinel masters实时验证)
spring.redis.sentinel.nodes 必须是应用能直连的哨兵地址,禁用 localhost
Spring Boot 启动后会逐个向 nodes 列表发起 TCP 连接,获取当前主节点信息。如果填了 localhost:26379 或 127.0.0.1:26379,而应用部署在另一台机器上,就会尝试连本地——但本地根本没跑哨兵进程。
- 多个地址必须用英文逗号分隔,前后不能有空格:
192.168.43.243:26379,192.168.43.244:26379✅;192.168.43.243:26379 , 192.168.43.244:26379❌ - Docker 环境下注意宿主机网络模式:若用
bridge,需确保哨兵端口已正确映射并可被应用容器访问 - 只填哨兵地址(通常是
26379等端口),不要混入 Redis 主从节点地址(如6379)
密码配置需按层显式声明,不能省略
Redis 主从启用了 requirepass?必须配 spring.redis.password。哨兵本身设了 sentinel auth-pass?则还需配 spring.redis.sentinel.password(Spring Boot 2.3+ 支持)。
- 漏配主从密码 → 连上哨兵后,客户端尝试连新主节点时认证失败,表现为
NOAUTH Authentication required - 漏配哨兵密码 → 客户端无法从哨兵拉取主节点信息,表现为持续超时或
Master node is not reachable - 两个密码不同是合法场景,必须分开配置,不能复用同一个值
配置生效但故障转移后读写异常?检查客户端刷新机制
Lettuce(Spring Boot 2.0+ 默认)会缓存主节点地址,并依赖后台定时任务从哨兵拉取更新。如果故障转移后仍往旧地址发请求,说明刷新没生效或延迟过高。
- 默认刷新间隔是 10 秒(Lettuce 的
refreshPeriod),可通过RedisSentinelConfiguration.setRefreshPeriod()缩短 - 手动触发刷新可用
RedisSentinelConfiguration.getSentinelConfig().getMasterId()验证是否已变更 - 生产环境建议开启 Lettuce 的
discoveryPeriod日志(DEBUG 级别),观察是否频繁重连或丢弃响应
真正容易被忽略的是:配置项写对了,不代表客户端行为就可靠。哨兵返回主节点地址后,Lettuce 是否立刻重建连接、连接池是否及时驱逐旧连接、超时参数是否匹配网络抖动——这些细节不调优,高可用只是纸面承诺。











