复制延迟从哪里来
复制延迟指从库落后主库的时间或数据量。常见来源有四类:主库到从库的网络带宽不足,写入速率超过链路承载能力;主库出现大命令,例如删除大 key 或清库操作在复制流里形成尖峰;从库自身处理慢,包括慢查询和磁盘写入受阻;以及从库正在做重写或加载快照这类重活。定位时必须同时看两侧——主库侧看到的是偏移差与输出缓冲,从库侧看到的是链路状态与本地负载。
基本信息
| 主库侧观察 | INFO replication 中每个从库的偏移与 lag |
|---|---|
| 从库侧观察 | master_last_io_seconds_ago 与本地负载 |
| 常见根因 | 带宽不足、主库大命令、从库磁盘慢 |
| 缓解方向 | 限速、拆分大 key、扩容带宽或提升从库规格 |
| 风险信号 | 主库为从库维护的输出缓冲持续增长 |
典型使用场景
- 读从库的业务出现读到旧值,需要量化延迟再决定是否回主库读
- 主从切换前确认从库是否已经追平,避免切换后丢数据
- 大 key 治理的依据:确认删除大 key 是否造成了延迟尖峰
- 容量规划:按峰值写入速率评估链路带宽余量
- 告警调优:把延迟阈值与业务能接受的新旧程度对齐
定位命令
定位命令
redis-cli INFO replication | grep -E 'master_repl_offset|slave_repl_offset'
redis-cli -h <从库> INFO replication | grep -E 'master_link_status|master_last_io_seconds_ago'
redis-cli -h <从库> INFO persistence | grep -E 'aof_rewrite_in_progress|rdb_bgsave_in_progress'
redis-cli -h <从库> SLOWLOG GET 10 # 从库自身是否出现慢命令
redis-cli -h <主库> CLIENT LIST | grep -E 'omem' # 输出缓冲占用情况
redis-cli -h <从库> INFO stats | grep -E 'instantaneous_input_kbps' # 实际接收速率观测项读法
| 指标 | 含义 | 异常表现 |
|---|---|---|
| 偏移差 | 主库与从库复制偏移之差 | 持续增大说明从库追不上 |
| master_last_io_seconds_ago | 距上次收到主库数据的秒数 | 数值变大说明数据流卡顿 |
| master_link_status | 复制链路状态 | down 表示链路已经断开 |
| 输出缓冲占用 | 主库为该从库维护的缓冲 | 持续增长说明从库处理不过来 |
延迟告警要结合写入速率来看:低峰期几毫秒的差值可能只是正常的复制往返,缺少速率上下文时,固定阈值很容易变成长期无效告警,最后被值班人员直接忽略。
从库自己也在做快照或 AOF 重写时,复制延迟会明显叠加。排查要同时看从库本地的持久化状态,只看网络与带宽可能找不到真正瓶颈。