sentinel master 返回扁平化键值对,需重点检查 flags(含 master 且不含 s_down/o_down)、role-reported(必须为 master)及 last-ok-ping-reply 延迟,连错端口或配置缺失会导致空响应或报错。

SENTINEL MASTER 返回字段含义不清晰,容易误判主库是否正常
直接执行 SENTINEL MASTER <master-name></master-name> 是最快速确认主库当前状态的方式,但返回的是一个扁平化的键值对列表(如 flags、num-slaves、role-reported),不是布尔值或简单 “up/down”,很多人看到 flags:master 就以为一切正常,其实未必。
关键要看这三项:
-
flags中是否含master且不含s_down或o_down—— 含任一 down 标志说明哨兵已判定异常 -
role-reported必须为master,否则表示该节点自报身份与哨兵认知不一致(常见于网络分区后未及时同步) -
is-master-down-by-addr字段虽不在SENTINEL MASTER输出中,但它的值影响flags;需配合SENTINEL SENTINELS <master-name></master-name>查看其他哨兵的投票状态
为什么连上哨兵执行 SENTINEL MASTER 却返回空或报错
这不是 Redis Server 命令,必须连接到哨兵节点(sentinel.conf 启动的那个端口,默认 26379),而不是主库或从库的 6379。连错端口会直接返回 (error) ERR unknown command `SENTINEL` 或静默无响应。
常见误操作:
- 用
redis-cli -p 6379连主库后执行SENTINEL MASTER mymaster→ 报错 - 哨兵配置里没写
sentinel monitor mymaster 127.0.0.1 6379 2→ 返回空结果(哨兵根本不认识这个 master 名) - master 名大小写敏感,
mymaster和MyMaster被视为两个不同实例
SENTINEL MASTER 的输出延迟和刷新机制
哨兵不会实时轮询主库,而是按 sentinel down-after-milliseconds 配置(默认 30000ms)周期性发 PING。所以 SENTINEL MASTER 显示的 last-ping-sent 和 last-ok-ping-reply 时间差若接近或超过该阈值,就已在预警边缘。
实际监控建议:
- 不要依赖单次
SENTINEL MASTER判断故障,应结合SENTINEL MASTER mymaster | grep 'flags\|last-ok-ping-reply'做定时巡检 - 如果
last-ok-ping-reply超过 35 秒未更新,且flags出现s_down,基本可确认主库失联 - 注意
quorum值:只有 ≥quorum个哨兵同时标记主库为s_down,才会触发客观下线(o_down)并尝试故障转移
用 shell 脚本自动化检查主库健康状态
生产环境别靠人肉敲命令,一个轻量脚本就能把关键信号提取出来:
#!/bin/bash MASTER_NAME="mymaster" SENTINEL_ADDR="127.0.0.1:26379" <p>output=$(redis-cli -h 127.0.0.1 -p 26379 SENTINEL MASTER "$MASTER_NAME" 2>/dev/null) if [ -z "$output" ]; then echo "ERROR: no response from sentinel or unknown master name" exit 1 fi</p><p>flags=$(echo "$output" | grep "^flags:" | cut -d' ' -f2) last_ok=$(echo "$output" | grep "^last-ok-ping-reply:" | cut -d' ' -f2) role=$(echo "$output" | grep "^role-reported:" | cut -d' ' -f2)</p><p>if [[ "$flags" == <em>"s_down"</em> ]] || [[ "$flags" == <em>"o_down"</em> ]] || [[ "$role" != "master" ]]; then echo "ALERT: master unhealthy — flags=$flags, role=$role, last_ok=$last_ok" exit 2 fi</p><p>echo "OK: master active, last reply $last_ok ms ago"</p>
真正容易被忽略的是:这个脚本必须跑在能直连哨兵节点的机器上,且 redis-cli 版本需 ≥ 3.2(旧版对哨兵命令支持不全)。另外,last-ok-ping-reply 是毫秒单位,不是时间戳 —— 别拿它去算绝对时间。











