副本集 Oplog

在本页面

oplog(操作日志)是一个特殊的capped collection,它会记录所有修改数据库中存储的数据的操作的滚动记录。 MongoDB 在primary上应用数据库操作,然后在主数据库的操作日志中记录该操作。然后,secondary成员在异步过程中复制并应用这些操作。所有副本集成员都在local.oplog.rs集合中包含操作日志的副本,这使它们可以维护数据库的当前状态。

为了促进复制,所有副本集成员都将心跳(ping)发送给所有其他成员。任何secondary成员都可以从任何其他成员导入 oplog 条目。

操作日志中的每个操作均为idempotent。也就是说,oplog 操作会产生相同的结果,无论是一次还是多次应用于目标数据集。

Oplog Size

首次启动副本集成员时,MongoDB 将创建默认大小的操作日志。

  • 对于 Unix 和 Windows 系统

    • 默认操作日志大小取决于存储引擎:
Storage Engine默认操作日志大小Lower BoundUpper Bound
内存中存储引擎物理内存的 5%50 MB50 GB
WiredTiger 存储引擎5%的可用磁盘空间990 MB50 GB
MMAPv1 存储引擎5%的可用磁盘空间990 MB50 GB
  • 对于 64 位 macOS 系统

    • 默认操作日志大小为 192 MB 的物理内存或可用磁盘空间,具体取决于存储引擎:
Storage Engine默认操作日志大小
内存中存储引擎192 MB 的物理内存
WiredTiger 存储引擎192 MB 的可用磁盘空间
MMAPv1 存储引擎192 MB 的可用磁盘空间

在大多数情况下,默认操作日志大小已足够。例如,如果操作日志是可用磁盘空间的 5%,并且在 24 小时的操作中已满,则辅助服务器可以在长达 24 小时的时间内停止从操作日志中复制条目,而不会过时而无法 continue 复制。但是,大多数副本集的操作量要低得多,并且它们的 oplog 可以容纳更多的操作。

mongod创建操作日志之前,您可以使用oplogSizeMB选项指定其大小。首次启动副本集成员后,请使用replSetResizeOplogManagement 命令来更改操作日志大小。 replSetResizeOplog使您可以动态调整操作日志的大小,而无需重新启动mongod进程。

可能需要较大 Oplog 大小的工作负载

如果您可以预测副本集的工作量类似于以下模式之一,则可能需要创建一个大于默认值的操作日志。相反,如果您的应用程序主要以最少的写操作执行读取,则较小的 oplog 可能就足够了。

以下工作负载可能需要更大的 oplog 大小。

一次更新多个文档

操作日志必须将多个更新转换为单独的操作,以维护idempotency。这会占用大量操作日志空间,而不会相应增加数据大小或磁盘使用量。

删除等于插入的数据量

如果删除的数据量与插入的数据量大致相同,则数据库在磁盘使用方面不会显着增长,但是操作日志的大小可能会很大。

就地更新数量

如果工作量的很大一部分是不增加文档大小的更新,则数据库会记录大量操作,但不会更改磁盘上的数据量。

Oplog Status

要查看操作日志状态,包括操作的大小和时间范围,请发出rs.printReplicationInfo()方法。有关 oplog 状态的更多信息,请参见检查操作日志的大小

在各种特殊情况下,对secondary's操作日志的更新可能会滞后于所需的性能时间。使用辅助成员中的db.getReplicationInfo()replication status输出来评估当前复制状态并确定是否存在意外复制延迟。

有关更多信息,请参见Replication Lag

Oplog 申请缓慢

对于从版本 3.6.11 开始的 MongoDB 3.6 部署,现在,副本集的辅助成员记录的操作日志条目所花费的时间超过了应用慢操作阈值的时间。这些消息是REPL组件下带有文本applied op: <oplog entry> took <num>ms的第二级的logged

2018-11-16T12:31:35.886-0500 I REPL   [repl writer worker 13] applied op: command { ... }, took 112ms

在次要节点上运行缓慢的 oplog 应用程序日志为:

有关设置慢速运行阈值的更多信息,请参见