文档菜单
文档首页
/
MongoDB 手册
/

副本集Oplog

本页面内容

  • Oplog大小
  • 可能需要更大Oplog大小的负载
  • Oplog状态
  • 缓慢的Oplog应用
  • Oplog收集行为

操作日志(oplog)是一个特殊的受限集合,它持续记录所有修改数据库中存储数据的操作。如果写入操作没有修改任何数据或失败,则不会创建oplog条目。

与其他受限集合不同,oplog可以超出其配置的大小限制,以避免删除majority commit point

MongoDB首先在主节点上应用数据库操作,然后记录主节点的oplog。然后副节点成员异步复制并应用这些操作。所有副本集成员都包含oplog的副本,位于local.oplog.rs集合中,这允许它们维护数据库的当前状态。

为了便于复制,所有副本集成员向所有其他成员发送心跳(ping)。任何副节点成员都可以从任何其他成员导入oplog条目。

oplog中的每个操作都是幂等的。也就是说,oplog操作在将它们应用到目标数据集一次或多次时会产生相同的结果。

当你第一次启动副本集成员时,如果没有指定oplog大小,MongoDB会创建一个默认大小的oplog。

对于Unix和Windows系统

默认的oplog大小取决于存储引擎

存储引擎
默认Oplog大小
空闲磁盘空间的5%
物理内存的5%

默认oplog大小有以下限制

  • 最小oplog大小为990 MB。如果基于您的存储引擎,空闲磁盘空间或物理内存的5%小于990 MB,则默认oplog大小为990 MB。

  • 默认的最大oplog大小为50 GB。如果空闲磁盘空间或物理内存的5%(根据您的存储引擎适用)大于50 GB,则默认oplog大小为50 GB。

对于64位macOS系统

默认oplog大小为存储引擎根据空闲磁盘空间或物理内存的192 MB

存储引擎
默认Oplog大小
192 MB的空闲磁盘空间
192 MB的物理内存

在大多数情况下,默认oplog大小足够。例如,如果一个oplog是空闲磁盘空间的5%,并在24小时的操作中填满,那么从oplog中停止复制条目最多24小时,而不会变得太陈旧以至于无法继续复制。然而,大多数副本集的操作量要低得多,它们的oplog可以存储更多的操作。

mongod创建oplog之前,您可以使用oplogSizeMB选项来指定其大小。[蒙古语](/docs/manual/reference/program/mongod/#mongodb-binary-bin.mongod)。一旦您第一次启动副本集成员,请使用replSetResizeOplog管理命令来更改oplog大小。replSetResizeOplog允许您在不重新启动mongod进程的情况下动态调整oplog大小。

您可以为保留oplog条目指定最小小时数,其中mongod仅在以下两个条件都满足的情况下删除oplog条目

  • oplog已达到最大配置大小.

  • oplog条目根据主机系统时钟比配置的小时数旧。

默认情况下,MongoDB不设置最小oplog保留期,并自动截断oplog,从最旧的条目开始,以维护配置的最大oplog大小。

要在启动mongod时配置最小oplog保留期,请执行以下操作之一

  • storage.oplogMinRetentionHours设置添加到mongod 配置文件

    -或-

  • 添加--oplogMinRetentionHours命令行选项。

要在运行中的 mongod 上配置最小 oplog 保留期,请使用 replSetResizeOplog。在 mongod 运行时设置最小 oplog 保留期将覆盖启动时设置的任何值。您必须更新相应的配置文件设置或命令行选项,以便通过服务器重启持久化这些更改。

oplog 条目都有时间戳。oplog 窗口是 oplog 中最新和最旧时间戳之间的时间差。如果辅助节点与主节点失去连接,如果连接在 oplog 窗口内恢复,它只能通过 复制 来再次同步。

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

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

oplog必须将多更新转换成单个操作,以保持幂等性。这可以在不增加数据大小或磁盘使用量的情况下,占用大量的oplog空间。

如果您删除的数据量与插入的数据量大致相等,数据库的磁盘使用量不会显著增加,但操作日志的大小可能相当大。

如果工作负载中很大一部分是更新操作,且这些更新操作不会增加文档的大小,数据库将记录大量操作,但不会改变磁盘上的数据量。

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

在各种异常情况下,次级副本的oplog更新可能落后于期望的性能时间。使用db.getReplicationInfo()从次级成员和复制状态输出评估当前的复制状态,并确定是否存在意外的复制延迟。

管理员可以通过限制主节点应用写入的速度来限制,目标是保持大多数已提交的延迟在一个可配置的最大值flowControlTargetLagSeconds

默认情况下,流量控制是启用的。

注意

要启用流量控制,副本集/分片集群必须具有:功能兼容版本(fCV)4.2和读取关注大多数已启用。也就是说,如果fCV不是4.2或者如果读取关注大多数被禁用,则启用流量控制没有任何效果。

有关更多信息,请参阅复制延迟

副本集的二级成员会记录应用时间超过慢速操作阈值的 oplog 条目。这些消息在 logged 中以 REPL 组件的形式记录,文本为 applied op: <oplog entry> took <num>ms

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

二级上的慢速 oplog 应用记录是

有关设置慢操作阈值的更多信息,请参阅

如果您使用的MongoDB部署采用了WiredTiger存储引擎,则您不能从任何副本集成员中删除local.oplog.rs集合。您也不能从单独的MongoDB实例中删除local.oplog.rs集合。mongod需要oplog以实现复制和节点故障恢复。

从MongoDB 5.0版本开始,在运行副本集的集群上,不再能够手动对oplog执行写操作。在作为独立实例运行时执行对oplog的写操作,应仅遵循MongoDB支持团队的指导。

返回

复制