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 保留更久;反之容量耗尽时会立即截断。
窗口越界会让滞后成员触发全量初始同步:大库的全量同步会长时间占用网络与磁盘,并放大主节点负载,务必预留冗余窗口。