哨兵配置中sentinel monitor的quorum参数必须为正整数(如2),不能是字符串、浮点数或空格;否则redis-sentinel启动失败并报“Invalid argument 'quorum'”;建议值为⌊N/2⌋+1,且需用--test-conf验证。

哨兵配置文件里 sentinel monitor 的第三个参数必须是整数,不是“1”会直接启动失败
Redis 哨兵靠 sentinel monitor 指令发现主节点,格式是 sentinel monitor <master-name><ip><port><quorum></quorum></port></ip></master-name>。最容易被忽略的是最后一个参数 quorum:它不是“几个哨兵同意就算数”的阈值,而是“触发故障转移所需的最小哨兵投票数”,且必须是正整数(比如 2),不能写成 "1"、1.0 或空格占位。写错会导致 redis-sentinel 启动时直接报错退出,日志里只有一行:Invalid argument 'quorum' for 'sentinel monitor'。
实操建议:
- 检查所有哨兵节点的配置文件,确认
sentinel monitor mymaster 127.0.0.1 6379 2这类语句中第四个字段是无引号、无小数点的纯数字 -
quorum值建议设为 ⌊N/2⌋ + 1(N 是哨兵总数),比如 3 个哨兵就填2,5 个就填3;填太小可能误判,填太大则无法达成共识 - 修改后务必用
redis-sentinel /path/to/sentinel.conf --test-conf验证语法,别直接重启服务
哨兵连不上主从节点?先查 bind 和 protected-mode 是否放行
哨兵进程本身不处理数据,但它需要和主、从 Redis 实例建立 TCP 连接来发 PING、获取 info、发送 SENTINEL failover 命令。常见连不上不是网络问题,而是 Redis 实例没开监听或拒绝外部连接。
实操建议:
- 主从节点的
redis.conf必须设置bind 0.0.0.0(或明确列出哨兵所在 IP),不能只留127.0.0.1;否则哨兵从另一台机器连就会超时 -
protected-mode yes是默认开启的,它会拒绝非本地、未设密码的连接——哨兵默认不带密码连主从,所以要么关掉protected-mode,要么在sentinel.conf里补上sentinel auth-pass <master-name> <password> - 用
redis-cli -h <ip> -p <port> ping手动测试哨兵所在机器能否通主从节点,比看日志更快定位是网络还是配置问题
sentinel down-after-milliseconds 设太短会导致频繁误切主
这个参数定义“哨兵认为主节点下线”的心跳超时时间,单位毫秒。设得太小(比如 500),在网络抖动或主节点短暂 GC 时,多个哨兵可能几乎同时判定主挂了,立刻发起故障转移——结果主节点 2 秒后自己活了,但新主已上线,造成双主、数据丢失。
实操建议:
- 生产环境建议设为
30000(30 秒)起步;如果网络延迟高或主节点负载重,可提到60000 - 必须保证所有哨兵节点配置一致,否则会出现部分哨兵认为主已下线、部分还认为主活着,无法达成
quorum投票 - 配合
sentinel parallel-syncs 1使用:限制每次故障转移时最多几个从节点同时向新主同步,避免新主带宽打满
哨兵自动切换后,客户端连不上新主?关键在 sentinel get-master-addr-by-name
哨兵不改 DNS、不劫持 IP,客户端要拿到新主地址,必须主动问哨兵。很多老项目直接硬编码 127.0.0.1:6379,故障转移后连接老主(此时已是只读从),报 READONLY You can't write against a read only slave. 或直接超时。
实操建议:
- 客户端初始化时不要直连 Redis 地址,而是用哨兵地址(如
127.0.0.1:26379)执行sentinel get-master-addr-by-name mymaster获取当前主节点 IP+端口 - 每 30–60 秒轮询一次该命令,或监听哨兵的
+switch-masterPub/Sub 事件(需客户端支持) - Java 用 Jedis,Python 用 redis-py,都内置了 SentinelConnectionPool,但得确认是否启用了
is_master_down_after_milliseconds等兜底逻辑,别只依赖初始连接
哨兵机制本身不复杂,但每个环节都卡在细节上:配置项类型对不对、网络策略开没开、超时值合不合适、客户端有没有真正走哨兵查主——漏掉任何一环,自动故障转移就变成手动救火。

















