文档首页/ 文档数据库服务 DDS/ 最佳实践/ Oplog容量规划与优化
更新时间:2026-05-27 GMT+08:00
分享

Oplog容量规划与优化

操作场景

本文旨在指导合理配置DDS Oplog参数并规避相关风险,避免因Oplog设置不当导致主从复制异常或时间点恢复受限,从而保障系统稳定性与数据恢复能力。

Oplog基本信息

  • Oplog(operations log,操作日志)是副本集复制的核心机制。在集群实例中,shard和config本质上也是副本集,因此同样依赖各自的oplog来记录和传播数据变更。Oplog是一个特殊的capped collection,其行为类似环形缓冲区,用于持续记录所有会修改数据的操作。当空间满时,最早的记录会被新记录覆盖。主节点先执行写操作,再将这些操作写入自己的Oplog;而从节点会异步拉取并在本地回放,从而保持数据一致。如果写操作未真正修改任何数据或操作失败,通常不会产生Oplog条目。
  • 在新创建的实例中,Oplog默认占用磁盘空间的10%。当需要进行磁盘扩容时,如果原Oplog大小小于100GB,则会将其调整为新大小(取磁盘空间 × oplogSizePercent 与100GB中的较小值);如果原Oplog大小大于等于100GB,则保持不变。
  • Oplog存储在local.oplog.rs 中,且其中的操作是幂等的,即同一条记录应用一次或多次,最终结果都应保持一致。
  • Oplog空间增长的速度与系统处理写请求的速度基本相当。若单次操作影响到多个文档,同样会产生多条对应的Oplog记录。
  • Oplog的可用时间指的是Oplog表中最旧和最新记录之间的时间间隔。主从复制依赖于这个时间窗口,只有当同步源的Oplog时间窗口中包含期望的Oplog记录时,从节点才能正常执行同步操作。

查看Oplog大小

以下是查看Oplog大小的两种方式:

  1. 通过容量预估功能查看磁盘空间分布,以了解Oplog的大小。
    图1 查看磁盘空间分布
  2. 连接数据库查看Oplog大小。
    • 连接数据库请参考连接DDS实例
    • 执行以下命令查看配置的Oplog大小和时间窗口。
      rs.printReplicationInfo()
      执行后回显如下:其中,configured oplog size 表示Oplog的配置总大小,log length start to end 代表Oplog的窗口大小。
      图2 执行结果
    • 执行以下命令,可查看Oplog实际占用的存储大小(默认单位为bytes)。
      db.getSiblingDB("local").oplog.rs.stats().storageSize

DDS集群实例无法通过dds mongos查询Shard节点的Oplog大小,建议优先使用容量预估功能,或通过申请Shard节点地址直接查看Oplog大小(申请Shard节点地址请参考"申请Shard和Config节点的地址",查看Oplog大小请参考2)。

Oplog消耗场景分析

在副本集中,Oplog(操作日志)的容量规划需要结合业务特征和系统监控数据综合决策。以下业务模式可能导致Oplog快速消耗:

表1 导致Oplog快速消耗的业务模式

场景

说明

批量更新

单次批量操作会被拆解为多个文档级的更新记录,导致Oplog条目数量呈指数级增长。例如:更新1000条文档会生成1000条Oplog记录,从而显著加速Oplog空间的消耗。

高频插入/删除交替

即使数据量并未实际增长,插入和删除操作仍会独立记录在Oplog中。例如:每秒1000次“插入-删除”循环将产生2000条Oplog条目,从而形成持续的写入压力。

原地更新密集型业务

同一文档的频繁重复更新(如状态字段变更)虽然不会增加存储空间,但每次更新都会生成独立的Oplog条目。例如:每秒100次的文档更新将直接导致Oplog写入速率提升100倍。

高并发写入

当业务存在高频写入操作(如每秒数千次的插入/更新/删除)时,Oplog的写入速率将显著增加。由于Oplog是按时间顺序记录所有写操作的环形缓冲区,因此写入量越大,Oplog的消耗速度越快。

备份策略

  • 全量备份

    Hidden节点在备份期间无法同步数据。当备份耗时超过Oplog窗口时,Hidden节点将丢失主节点的最新操作记录,导致无法通过复制追平主节点。

    解决方案:
    • 优化备份策略,将备份任务调度至业务写入低峰期执行。请参考设置自动备份策略
    • 请调整Oplog的大小,以确保备份耗时不超过Oplog的保留时间。请参考容量规划建议
    • 开启CBR快照备份,以缩短hidden节点锁库的时间。如需开启请参考设置自动备份策略
  • 增备备份

    当Oplog的增量生成速度超过250GB/h(或75MB/s)时,增量备份速度可能无法及时跟上Oplog操作日志的产生速度,从而导致部分恢复时间点不可选。例如:若某实例的Oplog大小为20GB,窗口为1小时,则可粗略估算其Oplog生成速度为20GB/h。

    为了避免写入速度过快导致的增量备份问题,您可以采取以下优化措施:
    • 控制写入并发:合理控制写入线程的并发数量,避免因短时间内产生大量数据写入而给系统带来过大的压力。
    • 调整写入关注级别:将writeConcern从{w:1}修改为{w:"majority"},以确保数据在大多数节点上确认后再返回,从而提高数据的可靠性和一致性。
    • 优化数据分布:当使用副本集实例时,可考虑迁移至分片集群。通过将数据分布到不同分片,能够充分利用各分片节点的存储空间和计算性能,从而提升整体系统的写入效率与扩展性。

容量规划建议

容量规划需要基于以下两个核心维度进行综合决策:

维度

说明

Oplog生成速度

某实例的Oplog存储大小为20GB,且存储窗口为1小时,则可粗略估算其Oplog生成速度为20GB/h。

备份时长

根据数据量预估备份耗时。备份时长与实例的数据量相关,平均备份速率为60MB/s,建议备份耗时不超过Oplog窗口的60%。

当需要扩容Oplog时,可以采用如下方式:

  • 在磁盘空间充足的情况下,如果Oplog占比不足,可以通过调整参数组中的 “oplogSizePercent” 参数来增大Oplog的大小。具体操作可参考修改DDS实例参数的步骤进行。
    • 调整oplogSizePercent参数需确保磁盘空间足够容纳新的Oplog大小。
  • 当磁盘空间不足且无法通过调整“oplogSizePercent”进行扩容时,请对该实例进行磁盘扩容。详情请参考扩容磁盘

相关文档