首页/数据/NoSQL 速查/复制延迟查看与判断
MongoDB99 条

复制延迟查看与判断

rs.printSecondaryReplicationInfo() 列出各从节点落后主节点的时间;持续增长说明复制链路或负载有问题。

NoSQL 速查数据更新于 2026-10-13

是什么

复制延迟(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 endoplog 覆盖的时间跨度数值小于维护窗口说明 oplog 太小
oplog first/last event timeoplog 中最早与最新条目时间从节点落后量超过该跨度即无法增量追赶
当从节点落后量超过 oplog 窗口,复制会因 OplogStartMissing 中断,增量同步不再可行,必须重新初始同步;这一步要复制全量数据,成本和风险都远高于提前扩充 oplog。
从节点批量并行应用 oplog,但同一文档上的写操作必须串行:一个被高频更新的热点文档会拖慢整条复制链路,此时提升 oplog 大小治标不治本,要先定位热点写入。

易错点

  • 只看瞬时 lag:写入低谷时延迟自然归零,必须看一张时间序列上是否持续爬升,再决定是否告警
  • oplog 按数据量估算而不是按时间窗口估算:oplog 需要覆盖至少一个完整维护周期,否则一次大促后从节点就会掉出窗口
  • 用 secondary 读又期望强一致:延迟窗口内读到的就是旧数据,需要一致性的查询要显式指定 readConcern 与读偏好
  • 大事务、大索引构建在 oplog 中以单条条目应用,写入放大明显,维护期间延迟突增常被误判为网络故障

数据来源与参考

  • MongoDB Manual: Replication Lag
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌