是什么
复制延迟(replication lag)指从节点已应用的 oplog 时间点落后主节点最新写入多少秒。rs.printSecondaryReplicationInfo() 把它按成员列出来,rs.printReplicationInfo() 则给出 oplog 能覆盖多长时间。延迟本身是最终一致的正常表现,关键在于它是否持续增长、是否逼近 oplog 窗口上限。
基本信息
| 查看延迟 | rs.printSecondaryReplicationInfo() |
|---|---|
| 查看 oplog 窗口 | rs.printReplicationInfo()、db.getReplicationInfo() |
| 健康区间 | 稳定在秒级且不持续增长 |
| 危险信号 | 延迟单调上升,或接近 oplog 的首末事件时间跨度 |
| 关联配置 | readPreference=secondary、writeConcern=majority、replSetResizeOplog |
典型使用场景
- 读扩展前的评估:把读请求分给从节点前,先确认延迟稳定在可接受范围
- 维护窗口判断:滚动升级、重建索引前看延迟是否已追平,避免带延迟操作
- 误操作兜底:配合延迟节点,在数据被误删或误更新后从滞后副本取回原值
- 容量规划:写入高峰期观察延迟峰值,判断 oplog 大小是否需要扩容
- 告警基线:把 lag 作为常规监控项,比堆机器更早发现热点文档与慢盘
查看与判断
查看与判断
rs.printReplicationInfo() # oplog 首末事件时间与可覆盖时长
rs.printSecondaryReplicationInfo() # 每个从节点落后主节点的秒数
rs.status().members.forEach(m => m.stateStr === "SECONDARY" && print(m.name, m.optimeDate)) # 逐节点看同步点
rs.conf().settings.getLastErrorModes # 与写入确认相关的配置
rs.status().members[0].lastCommittedOpTime # 已提交多数的最新位点输出逐列读法
| 输出项 | 含义 | 异常表现 |
|---|---|---|
| syncedTo | 从节点已应用的最新 oplog 时间戳 | 长时间不发生位移说明卡住或断连 |
| behind the primary | 落后主节点的秒数 | 持续增长、不回落才是故障 |
| log length start to end | oplog 覆盖的时间跨度 | 数值小于维护窗口说明 oplog 太小 |
| oplog first/last event time | oplog 中最早与最新条目时间 | 从节点落后量超过该跨度即无法增量追赶 |
当从节点落后量超过 oplog 窗口,复制会因 OplogStartMissing 中断,增量同步不再可行,必须重新初始同步;这一步要复制全量数据,成本和风险都远高于提前扩充 oplog。
从节点批量并行应用 oplog,但同一文档上的写操作必须串行:一个被高频更新的热点文档会拖慢整条复制链路,此时提升 oplog 大小治标不治本,要先定位热点写入。