You need to enable JavaScript to run this app.
文档中心
文档数据库 MongoDB 版

文档数据库 MongoDB 版

复制全文
下载 pdf
最佳实践
oplog 相关参数设置指南
复制全文
下载 pdf
oplog 相关参数设置指南
文档数据库 MongoDB 版提供了 oplog 大小和 oplog 保留时间相关参数,oplog 相关参数设置不合理,可能会导致 oplog 被覆盖,从而影响 MongoDB 的主从复制和按时间点恢复数据等功能。本文介绍如何配置合理的 oplog 相关参数供您参考。
功能介绍
oplog(Operation log)是 MongoDB 中一个特殊的有界集合(capped collection),是 MongoDB 中实现复制功能的基本机制,会将数据库上已执行所有写操作(如插入、更新、删除等)按时间顺序记录在 local.oplog.rs 集合中。更多关于 oplog 的详情,请参见 Replica-set-oplog
oplog 大小
文档数据库 MongoDB 版提供了 replication.oplogSizeMB 参数来指定 oplog 的大小。该参数支持动态和静态两种取值方式,其中:
  • 动态取值:即 Default,系统会将实例 10% 的最大可用存储空间用于记录 oplog。
说明
  • 例如,实例的最大可用存储空间为 20 GiB,且 replication.oplogSizeMB 设置为 Default,那么当前实例中可用于记录 oplog 的空间为 2 GiB。更多关于该参数的详情,请参见 replication.oplogSizeMB
  • 如果您变更了实例配置导致实例最大可用存储空间改变,那么 replication.oplogSizeMB 的实际取值也会改变。关于实例最大可用存储空间的更多详情,请参见查看实例信息
  • 为保证实例性能,建议 oplog 大小不要超过实例最大可用存储空间的 30%,若需要的 oplog 大小超过该值,建议扩容实例存储空间。实例变配的具体操作步骤,请参见副本集实例变配变更分片集群实例配置
  • 静态取值:2048~实例最大可用存储空间的 90%。单位:MiB。
说明
  • 实例或节点规格不同,该参数的静态取值范围也会不同,具体数值以控制台为准。例如,实例的最大可用存储空间为 60 GiB,那么控制台上的静态取值范围为 2048~55296。
  • 您可以通过配置 replication.oplogSizeMB 参数来调整 oplog 大小,该参数调整后无需重启实例即可生效。参数修改方法,请参见修改实例参数
您可以通过 mongo shell 或 mongosh 等客户端工具连接 MongoDB 实例后,执行以下命令来查看 oplog 大小以及 oplog 窗口期。
说明
  • 如需查看分片集群的 oplog 大小,请使用分片集群中的 Shard 连接地址进行查看。关于连接地址的更多详情,请参见查看连接地址
rs.printReplicationInfo()
示例结果如下。
configured oplog size: 2048MB
log length start to end: 13015382secs (3615.38hrs)
oplog first event time: Fri Oct 18 2024 19:41:03 GMT+0800 (CST)
oplog last event time: Tue Mar 18 2025 11:04:05 GMT+0800 (CST)
now: Tue Mar 18 2025 11:04:05 GMT+0800 (CST)
在上述示例中,oplog 大小为 2048MB,oplog 窗口期约为 3615 小时。
oplog 最短保留期
文档数据库 MongoDB 版提供了 oplog 最短保留期参数 oplogMinRetentionHours,设置该参数后可以确保 MongoDB 实例的 oplog 保留窗最小值也不会少于该参数值。
说明
  • 仅 MongoDB 4.4 及之后的版本支持该参数,关于该参数的更多详情,请参见 oplogMinRetentionHours
  • 如需调整 oplog 最短保留期,您可以在 MongoDB 控制台上修改 oplogMinRetentionHours 参数。该参数调整后无需重启实例即可生效。参数修改方法,请参见修改实例参数
  • 文档数据库 MongoDB 支持对 oplog 保留窗设置事件告警规则,如果 oplog 可用时间过短,那么能保留的 oplog 记录有限,在主从复制时延增大、从库重建等场景下,因缺失所需 oplog 导致主从复制失败的风险会增加,进而影响实例可用性和数据可靠性。更多详情,请参见事件监控
文档数据库 MongoDB 版实例的 oplog 清理规则会受到 oplog 大小和最短保留期的控制,具体清理规则请参见下表。
参数设置场景
oplog 清理规则
oplog 清理示例
未设置 oplogMinRetentionHours 参数
oplogMinRetentionHours 参数的默认值为 0,表示不设置 oplog 最短保留期,此时 oplog 的清理规则由 oplog 大小 replication.oplogSizeMB 参数单独控制。
例如,MongoDB 实例创建成功后,均未手动修改 oplogMinRetentionHoursreplication.oplogSizeMB 的默认值,即不设置 oplog 最短保留期,且 oplog size 的存储空间为实例 10% 的最大可用存储空间。那么系统将在 oplog size 超出实例 10% 的最大可用存储空间后被自动清理。
已设置 oplogMinRetentionHours 参数
此时 oplog 清理规则会同时受到 oplog 大小和最短保留期参数的控制。当同时满足如下条件时,MongoDB 会开始清理 oplog:
  • oplog 集合的实际大小已超过 replication.oplogSizeMB 参数所配置的 oplog 大小。
  • oplog 记录的时间戳已超出 oplogMinRetentionHours 参数所配置的 oplog 窗口期。
例如,MongoDB 实例创建成功后,已根据业务需要设置了 oplog 最短保留期为 40 小时,oplog size 仍采用默认动态取值(即实例 10% 的最大可用存储空间)。
在实例初始化还未写入过多数据时,oplog 集合的实际大小还未达到 replication.oplogSizeMB 参数所配置的上限,而 oplogMinRetentionHours 参数配置的 oplog 窗口期通常会比实际所需要的 oplog 窗口期大很多,因此 oplog 集合大小仅由 replication.oplogSizeMB 参数单独控制。
随着业务发展,当 oplog 集合的实际大小已超出 replication.oplogSizeMB 参数值后,oplog 大小将受到 oplog 最短保留期的限制,若 oplog 生成速度较快,oplog 集合的实际大小可能会远远超过 replication.oplogSizeMB 所配置的参数值。
设置指南
通用场景设置指南
您可以参照下表根据自身业务特征适当增加或减少 oplog size。
说明
  • 通常情况下,建议只通过修改 replication.oplogSizeMB 参数来确保有足够的 oplog 窗口。
  • 文档数据库 MongoDB 版中 replication.oplogSizeMB 参数默认采用动态取值方式,即系统会将实例 10% 的最大可用存储空间用于记录 oplog。通常情况下,您仅需要保持默认值即可,如果您变更了实例配置导致实例最大可用存储空间改变,那么 replication.oplogSizeMB 的实际取值也会自动改变。
  • 无论是设置 MongoDB 实例的 oplog 大小或是 oplog 最短保留期参数,最好确保 oplog 的窗口期在 24 小时以上
oplog size 调整建议
适用的业务特征
适当增加 oplog size
业务存在较多的增删改操作,例如批量更新、频繁插入删除、或原地大量更新操作。
酌情减少 oplog size
业务中增删改操作较少,主要将 MongoDB 数据库用于存储冷数据。
特殊场景设置指南
变配重启等场景需关注的相关配置
新增或重启从节点后,需要依赖 oplog 中的记录来确定这些节点能否成为副本集中正常工作的节点。这些节点可能会在某些情况下(例如网络延迟、丢包、中断,从节点磁盘吞吐达到瓶颈,writeConcern 使用了 {w:1} 且写入负载较大)出现延迟,无法从同步源中找到所期望的 oplog 记录,此时就会出现 too stale to catch up 报错,且节点状态也会变为 RECOVERING 异常状态,最终导致主从节点复制失败。
注意
在执行变配或重启等操作前,强烈建议重点关注 MongoDB 实例中从节点延迟的情况,以及实例的 oplog 窗口期是否能够满足要求,避免因从节点延迟过大导致节点进入异常状态无法恢复。当从节点的延迟不断增加时,请及时提交工单联系技术支持协助解决。
您可以通过如下任意一种方式查看从节点延迟情况。
查看方式
操作步骤
结果示例
方式一:通过 MongoDB 控制台查看
您可以登录 MongoDB 控制台后,在实例详情页签的节点信息区域,通过节点列表中的主从延时字段来查看节点的延迟情况。实例信息的查看方法,请参见查看实例信息
您可以参考下图中的主从延时字段来查看节点的延迟情况。
从上述截图中可以看到,实例中的其他节点与主节点均没有延迟。
您可以在 MongoDB 控制台监控告警页签下,通过主备延时指标来查看节点的延迟情况。监控指标查看方法,请参见查看监控数据
您可以参考下图中的主备延时指标来查看节点的延迟情况。
从上述截图中可以看到,实例中的其他节点与主节点均没有延迟。
方式二:通过客户端工具查看
您可以通过 mongo shell 或 mongosh 等客户端工具连接 MongoDB 实例后,执行以下命令来查看从节点延迟情况。
说明
  • 如需查看分片集群的主从节点延迟情况,请使用分片集群中的 Shard 连接地址进行查看。关于连接地址的更多详情,请参见查看连接地址
rs.printSecondaryReplicationInfo()
您可以根据命令返回结果中的 behind the primary 信息查看从节点的延迟情况。示例结果如下。
source: mongo-replica-****-0.mongons.****:27017
syncedTo: Thu Mar 13 2025 15:29:40 GMT+0800 (CST)
5 secs (0 hrs) behind the primary
source: mongo-replica-****-0.mongons.****:27017
syncedTo: Thu Mar 13 2025 15:29:45 GMT+0800 (CST)
0 secs (0 hrs) behind the primary
source: readonly-mongo-replica-****-0.mongons.****:27017
syncedTo: Thu Mar 13 2025 15:29:45 GMT+0800 (CST)
0 secs (0 hrs) behind the primary
在上述示例中,第一个从节点存在 5 秒延迟(5 secs (0 hrs) behind the primary),另外两个从节点不存在延迟(0 secs (0 hrs) behind the primary)。
避免日志备份空洞的相关配置建议
文档数据库 MongoDB 版默认开启自动备份功能,备份对象包括数据库数据和 oplog 日志。针对日志备份,系统会以每分钟 1 次的频率,自动进行 oplog 日志的流式备份,无需配置。更多详情,请参见备份恢复
MongoDB 支持通过回放日志备份文件中的 oplog 来按时间点恢复实例数据。但在某些数据同步、导入或测试场景(例如,使用 DTS、mongoShake 或其他工具同步/导入大量数据,短期内批量插入或更新大量数据,对数据进行压力测试)下,实例的写入速度会很快,若此时设置的 oplog size 较小或 oplog 最短保留期太短时,可能会出现 oplog 覆盖旧操作记录的速度过快,日志备份无法跟上 oplog 覆盖速度而导致日志备份空洞的情况。
您可以通过 oplog 大小以及 oplog 窗口来估算 oplog 生成速度。例如某 MongoDB 实例的 oplog 大小为 1800 GiB,oplog 窗口为 25h(即 1500min),那么 oplog 生成速度大约为 1.2 GiB/min。根据文档数据库 MongoDB 版实例过往使用经验,当 oplog 生成速度超过 10 GiB/min 后,出现日志备份空洞的概率会大大增加。
为避免或减少日志备份空洞的产生,你可以参考如下建议对数据库进行优化:
  • 适当限制同步或导入工具的写入并发度、批次大小等。
  • writeConcern 设置为 {w:"majority"},而不是 {w:1}
  • 使用分片集群实例或者增加分片数,通过将数据分散到多个分片来降低单个分片上的 oplog 生成速度。
  • 根据业务特点和需要适当调大 oplog 大小或者 oplog 最短保留期,为日志备份提供更多的缓冲时间,以便日志备份在业务低峰期有足够的时间去追赶之前落后的 oplog 记录。
相关监控告警配置
在根据上述设置指南对 oplog 相关参数进行了合理配置后,强烈建议您同时根据业务需求为 MongoDB 设置如下相关监控告警配置。
说明
  • 查看 MongoDB 实例的监控数据的具体操作步骤,请参见查看监控数据
  • 为 MongoDB 实例创建告警策略的具体操作步骤,请参见设置告警
  • 关于 MongoDB 支持的事件监控详情,请参见事件监控
监控告警项
建议的监控告警规则
监控指标告警
主备延时
建议重点关注 MongoDB 实例中主备延时监控指标,避免因从节点延迟过大导致节点进入异常状态无法恢复。
您可以针对主备延时监控指标配置一条的云监控告警,建议告警阈值设置为 10 秒以上。
磁盘空间使用率
设置 oplog 最短保留期参数后,建议您密切关注实例的磁盘空间使用率监控指标,避免在 oplog 生成速度较快时,oplog 占用过多磁盘空间导致实例性能下降的风险。
您可以针对磁盘空间使用率指标配置一条云监控告警,建议告警阈值设置为 75%。
事件告警
oplog 保留窗不足
文档数据库 MongoDB 版支持对实例 oplog 保留窗进行事件监控告警。当 oplog 可用时间不足时会触发相应告警,帮助您及时发现不合理的 oplog 相关设置,防止主从同步异常、无法按时间点恢复数据等问题的出现。
当您收到相关监控告警后,请参见文档中的优化建议进行处理。更多详情,请参见收到实例 oplog 保留窗过小的事件监控告警后该如何处理
最近更新时间:2026.02.13 14:08:24
这个页面对您有帮助吗?
有用
有用
无用
无用