
# 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. 通过[容量预估](https://support.huaweicloud.com/usermanual-dds/dds_03_0263.html)功能查看磁盘空间分布，以了解Oplog的大小。
   图1查看磁盘空间分布   
   ![](https://support.huaweicloud.com/bestpractice-dds/zh-cn_image_0000002568011796.png "点击放大") 
2. 连接数据库查看Oplog大小。
   - 连接数据库请参考[连接DDS实例](https://support.huaweicloud.com/usermanual-dds/dds_03_0306.html)。
   
   - 执行以下命令查看配置的Oplog大小和时间窗口。
     ```
     rs.printReplicationInfo()
     ```
     执行后回显如下：其中，configured oplog size 表示Oplog的配置总大小，log length start to end 代表Oplog的窗口大小。
     图2执行结果   
     ![](https://support.huaweicloud.com/bestpractice-dds/zh-cn_image_0000002567852150.png "点击放大") 
   
   - 执行以下命令，可查看Oplog实际占用的存储大小（默认单位为bytes）。
     ```
     db.getSiblingDB("local").oplog.rs.stats().storageSize
     ```
     
    
![](https://support.huaweicloud.com/bestpractice-dds/public_sys-resources/note_3.0-zh-cn.png)
DDS集群实例无法通过dds mongos查询Shard节点的Oplog大小，建议优先使用[容量预估](https://support.huaweicloud.com/usermanual-dds/dds_03_0263.html)功能，或通过申请Shard节点地址直接查看Oplog大小（申请Shard节点地址请参考"[申请Shard和Config节点的地址](https://support.huaweicloud.com/usermanual-dds/dds_02_0100.html)"，查看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节点将丢失主节点的最新操作记录，导致无法通过复制追平主节点。
  解决方案：
  - 优化备份策略，将备份任务调度至业务写入低峰期执行。请参考[设置自动备份策略](https://support.huaweicloud.com/usermanual-dds/zh-cn_topic_backup_restore.html)。
  
  - 请调整Oplog的大小，以确保备份耗时不超过Oplog的保留时间。请参考[容量规划建议]。
  
  - 开启CBR快照备份，以缩短hidden节点锁库的时间。如需开启请参考[设置自动备份策略](https://support.huaweicloud.com/usermanual-dds/zh-cn_topic_backup_restore.html)。
    

- 增备备份 当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实例参数](https://support.huaweicloud.com/usermanual-dds/zh-cn_topic_configuration.html)的步骤进行。
  ![](https://support.huaweicloud.com/bestpractice-dds/public_sys-resources/caution_3.0-zh-cn.png)
  - 调整oplogSizePercent参数需确保磁盘空间足够容纳新的Oplog大小。
    
- 当磁盘空间不足且无法通过调整"oplogSizePercent"进行扩容时，请对该实例进行磁盘扩容。详情请参考[扩容磁盘](https://support.huaweicloud.com/usermanual-dds/zh-cn_topic_increase_storage.html)。
 
