真延迟需观察主从offset差值是否持续扩大且从库slave_repl_offset长时间不动;sync状态、慢命令阻塞、repl-backlog过小、网络丢包或swap启用等均会导致offset异常。

怎么看主从 offset 差值是否真延迟
直接比 INFO replication 里的 master_repl_offset 和 slave_repl_offset 不够——差值大只说明“还没追上”,不等于“正在掉队”。关键看这个差值是否持续扩大,且从库的 slave_repl_offset 长时间不动。
操作步骤:
- 在主节点执行:
redis-cli INFO replication | grep master_repl_offset,记下数值(如 123456789) - 在从节点执行:
redis-cli INFO replication | grep slave_repl_offset,记下数值(如 123450000) - 等 5 秒再查一次,如果差值从 6789 变成 12789,且
slave_repl_offset没变,才是真实同步滞后
注意:slave_repl_offset 为 0 或远低于主库,可能只是处于 SYNC 状态(全量同步中),这是正常过程,不算延迟。
为什么 redis_replication_master_last_io_seconds_ago 总是 0
这个指标值为 0 表示从节点最近 1 秒内和主节点有心跳交互,但它不是延迟本身,只是“最后一次通信过去多久”。网络通畅 ≠ 数据已应用。
常见误判场景:
- 主节点写入快、从节点 CPU 高或执行大 key 命令(如
HGETALL、EVAL),导致复制线程卡住,slave_repl_offset停滞,但master_last_io_seconds_ago仍为 0 - 从节点启用了
lua-time-limit但设为 0(禁用超时),Lua 脚本无限运行,彻底堵死 repl thread
真正反映 lag 的是 redis_replication_offset 差值,必须同时采集主、从节点的该指标并做减法。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
如何用 Prometheus 正确计算主从 offset 差值
Prometheus 里不能直接用 redis_replication_offset 相减,必须确保 label 对齐,否则 PromQL 无法匹配。
正确做法:
- 每个 redis_exporter 启动时加参数打标:
--redis.label="role=master"(主节点)和--redis.label="role=slave"(从节点) - PromQL 写法:
redis_replication_offset{role="master"} - redis_replication_offset{role="slave"} - 如果没打 role label,可用
instance=~".*:6379"硬匹配,但易出错,不推荐
错误配置典型表现:Prometheus 查询返回空结果或 no data,检查 curl http://slave:9121/metrics | grep redis_replication_offset 是否能拿到指标。
排查时最容易被忽略的点
很多人盯着 lag 字段(INFO replication 中的 lag=0 或 lag=1),但它只反映心跳延迟,不是数据同步延迟。真正卡住的地方往往藏在从节点内部:
-
INFO commandstats里cmdstat_hgetall或cmdstat_eval的calls异常高,说明慢命令积压 -
redis-cli --latency -h slave_ip显示 P99 > 100ms,基本确认从节点响应毛刺严重 - 从节点
used_memory_rss / used_memory(即mem_fragmentation_ratio)> 2.0,内存碎片过高也会拖慢命令执行
offset 差值在涨,但 lag 一直是 0 或 1,十有八九是这些内部瓶颈,而不是网络问题。










