哨兵节点推荐部署3个,奇数个且不与redis实例混部;quorum值设为哨兵总数一半向上取整,需统一主从及哨兵密码,合理配置down-after-milliseconds和failover-timeout参数,并确保客户端通过sentinel get-master-addr-by-name动态获取主节点地址。

哨兵节点必须用奇数个,且不能和Redis实例混部
哨兵不是“越多越好”,3个是生产环境最稳妥的起点。5个适合跨机房部署,但7个以上会显著拖慢故障判定速度——因为每次客观下线(ODown)都需要多数派达成共识,quorum 值越大,网络抖动时误判风险越高。
常见错误是把 redis-server 和 redis-sentinel 进程跑在同一台机器、甚至同一个 Docker 容器里。一旦该机器宕机,主从+哨兵全挂,高可用就失效了。真实部署中,每个哨兵必须独占物理机或独立容器,且 IP 不同、网络路径不重叠。
-
sentinel monitor mymaster 192.168.1.10 6379 2中的2表示 quorum,3 个哨兵就设为 2;5 个哨兵建议设为 3 - 所有哨兵的
sentinel announce-ip必须填对外可访问的真实 IP,不能写127.0.0.1或0.0.0.0,否则客户端连不上 - 如果用 Docker,每个哨兵容器要显式指定
--network host或自定义 bridge 网络,并确保announce-port和宿主机映射端口一致
主从节点密码必须统一,且哨兵配置里不能漏 auth-pass
Redis 6.x 默认启用 ACL,但哨兵仍依赖老式 requirepass 兼容模式。只要主节点设了密码,所有从节点的 masterauth 和所有哨兵的 sentinel auth-pass 就必须完全一致,否则故障转移时哨兵无法登录从节点执行 slaveof no one。
典型报错是日志里反复出现 Failed to AUTH during SENTINEL FAILOVER 或 NOAUTH Authentication required,本质就是密码没对齐。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 主节点
redis.conf:设置requirepass "p@ssw0rd" - 从节点
redis.conf:必须配masterauth "p@ssw0rd" - 哨兵
sentinel.conf:必须配sentinel auth-pass mymaster "p@ssw0rd" - 切记:
sentinel auth-pass的密码是明文存储在配置文件里的,别用生产环境强密码,建议单独设一个只用于哨兵通信的弱密码
down-after-milliseconds 和 failover-timeout 要按网络质量调
这两个参数直接决定故障转移快慢和误切概率。down-after-milliseconds 太小(比如 1000ms),会在短暂网络抖动时触发主观下线(SDown),进而引发不必要的投票;太大(比如 30000ms),主节点真挂了却迟迟不切换,业务写请求持续超时。
failover-timeout 不是“超时就放弃”,而是整个故障转移流程的最大窗口——包括选主、提升、重配从节点、旧主恢复后降级。设太短(如 5000ms)会导致流程被中止,集群卡在中间态;设太长(如 300s)会让客户端长时间拿不到新主地址。
- 局域网稳定环境:建议
sentinel down-after-milliseconds mymaster 5000,sentinel failover-timeout mymaster 18000 - 跨机房或公网部署:上浮到
10000和60000,并配合增大parallel-syncs避免从节点同步风暴 - 务必检查哨兵日志里是否频繁出现
+sdown→-sdown来回切换,那是网络延迟波动导致的,得调参
客户端连接必须走 SENTINEL GET-MASTER-ADDR-BY-NAME,不能硬编码
哨兵本身不代理请求,它只提供服务发现。客户端每次发写请求前,必须先连任意一个哨兵,执行 SENTINEL GET-MASTER-ADDR-BY-NAME mymaster 拿到当前主节点地址,再连过去。很多团队图省事,在代码里写死 192.168.1.10:6379,结果主节点一换,所有写请求全失败。
更隐蔽的问题是:部分 SDK(比如早期 Jedis)默认不自动刷新主节点地址,需要手动调用 setMaster 或开启 sentinelSupport 开关;Lettuce 则依赖 RedisSentinelConfiguration 初始化时传入哨兵列表。
- 测试方法:手动 kill 主 Redis 进程,等哨兵完成切换后,立刻执行
redis-cli -p 26379 SENTINEL GET-MASTER-ADDR-BY-NAME mymaster,确认返回的是新主 IP 和端口 - Java 客户端必须确保连接池支持 Sentinel 自动发现,否则即使配置了哨兵地址,底层还是连老主节点
- 别信“哨兵会自动重定向”这种说法——Redis 协议本身不支持重定向写请求,客户端必须自己处理










