副本集Oplog
操作日志(oplog)是一个特殊的受限集合,它持续记录所有修改数据库中存储数据的操作。如果写入操作没有修改任何数据或失败,则不会创建oplog条目。
与其他受限集合不同,oplog可以超出其配置的大小限制,以避免删除majority commit point
。
MongoDB首先在主节点上应用数据库操作,然后记录主节点的oplog。然后副节点成员异步复制并应用这些操作。所有副本集成员都包含oplog的副本,位于local.oplog.rs
集合中,这允许它们维护数据库的当前状态。
为了便于复制,所有副本集成员向所有其他成员发送心跳(ping)。任何副节点成员都可以从任何其他成员导入oplog条目。
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保留期
您可以为保留oplog条目指定最小小时数,其中mongod
仅在以下两个条件都满足的情况下删除oplog条目
oplog已达到最大配置大小.
oplog条目根据主机系统时钟比配置的小时数旧。
默认情况下,MongoDB不设置最小oplog保留期,并自动截断oplog,从最旧的条目开始,以维护配置的最大oplog大小。
要在启动mongod
时配置最小oplog保留期,请执行以下操作之一
要在运行中的 mongod
上配置最小 oplog 保留期,请使用 replSetResizeOplog
。在 mongod
运行时设置最小 oplog 保留期将覆盖启动时设置的任何值。您必须更新相应的配置文件设置或命令行选项,以便通过服务器重启持久化这些更改。
Oplog 窗口
oplog 条目都有时间戳。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 应用
副本集的二级成员会记录应用时间超过慢速操作阈值的 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 应用记录是
不受
logLevel
/systemLog.verbosity
级别(或systemLog.component.replication.verbosity
级别)的影响;即对于 oplog 条目,二级仅记录慢速 oplog 条目。提高详细程度级别不会记录所有 oplog 条目。不被 profiler 捕获,也不受分析级别的影响。
有关设置慢操作阈值的更多信息,请参阅
Oplog 集合行为
如果您使用的MongoDB部署采用了WiredTiger存储引擎,则您不能从任何副本集成员中删除local.oplog.rs
集合。您也不能从单独的MongoDB实例中删除local.oplog.rs
集合。mongod
需要oplog以实现复制和节点故障恢复。
从MongoDB 5.0版本开始,在运行副本集的集群上,不再能够手动对oplog
执行写操作。在作为独立实例运行时执行对oplog的写操作,应仅遵循MongoDB支持团队的指导。