首页/数据/NoSQL 速查/oplog 窗口与容量评估
MongoDB99 条

oplog 窗口与容量评估

oplog 记录主节点全部写操作供从节点复制;其时间窗口决定“从节点断开后能追赶多久”,过小会触发全量同步。

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

oplog 与保留窗口

oplog 是副本集主节点上的操作日志(local 库的固定集合),记录所有写操作供从节点拉取重放,也是变更流的数据来源。它的容量决定保留窗口,也就是「从节点或变更流消费者断开后还能追赶多久」:窗口按写入量而非时间消耗,写高峰会把一个看起来够大的 oplog 迅速压缩到小时级,窗口一旦越过就从节点只能做全量初始同步。

基本信息

存放位置local.oplog.rs(副本集成员各自保留一份)
查看窗口rs.printReplicationInfo() 输出已用时间与首末操作时间
查看容量db.getSiblingDB("local").oplog.rs.stats().maxSize
在线调整db.adminCommand({ replSetResizeOplog: 1, size: 20 * 1024 * 1024 * 1024 })
最短保留4.4 起可设置 oplogMinRetentionHours,按时间下限保留
规划口径按峰值写入量乘以期望的重试与维护窗口时长估算容量

典型使用场景

  • 计划维护停机前,确认 oplog 窗口是否覆盖预计的停机时长
  • 新增从节点前评估能否增量追平,还是必然走全量同步
  • 变更流消费者故障恢复后,判断中断位点是否还在窗口内
  • 写高峰来临前按业务写入量复核 oplog 容量
  • 跨机房链路抖动导致复制延迟时,评估追上来的可能性

查看与调整窗口

查看与调整窗口
// 看当前窗口:已用时间、首末操作时间、可容纳的写入时长
rs.printReplicationInfo()

// 看配置容量(字节)与实际占用
printjson(db.getSiblingDB("local").oplog.rs.stats().maxSize)
printjson(db.getSiblingDB("local").oplog.rs.stats().storageSize)

// 在线扩容,无需重启成员(对当前主节点执行即可)
// db.adminCommand({ replSetResizeOplog: 1, size: 20 * 1024 * 1024 * 1024 })

// 设置最短保留时间(4.4 起),容量与时间两个条件先满足者生效
// db.adminCommand({ setParameter: 1, oplogMinRetentionHours: 48 })

指标读法

指标含义判读要点
configured oplog size配置容量是上限而非保证:写入量大时窗口按容量耗尽
log length首末操作的时间跨度这就是从节点能追赶的最大时长
oplog 实际占用当前使用字节数长期贴近上限说明容量偏小
复制延迟(从节点)从节点落后主节点的时间持续为正且不收敛时要立刻介入
oplogMinRetentionHours时间下限保留设得过大在写量小时会占更多磁盘
时间窗口与容量窗口是两个约束,取更严的那个:即使容量还富余,设置了最短保留时间也会让 oplog 保留更久;反之容量耗尽时会立即截断。
窗口越界会让滞后成员触发全量初始同步:大库的全量同步会长时间占用网络与磁盘,并放大主节点负载,务必预留冗余窗口。

易错点

  • 按「还能停多久」凭感觉判断窗口:应看 log length 的实际时间跨度,写高峰时它可能只有几小时
  • 以为调整 oplog 必须停机重建:现代版本可用 replSetResizeOplog 在线调整,误判会造成无谓的维护窗口
  • 在从节点上看窗口做评估:窗口由主节点写入决定,评估应落在当前主节点上
  • 给 oplog 设置最小保留时间后不监控磁盘:写量下降时按时间保留的数据会占用更多空间,需要同步关注容量

数据来源与参考

  • MongoDB Manual: Replica Set Oplog
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌