该OPLOG(操作日志)是一个特殊的上限集合,它可将修改存储在数据库中的数据的所有操作的滚动记录。
注意
从MongoDB 4.0开始,与其他有上限的集合不同,oplog可以超出其配置的大小限制,以避免删除
。majority commit point
MongoDB在主数据库上应用数据库操作,然后在主数据库的操作日志中记录该操作。然后,辅助成员将这些操作复制并应用到异步过程中。所有副本集成员在local.oplog.rs
集合中都包含操作日志的副本
,这使他们可以维护数据库的当前状态。
为了促进复制,所有副本集成员都将心跳(ping)发送给所有其他成员。任何二级成员都可以从任何其他成员导入操作日志条目。
oplog中的每个操作都是幂等的。也就是说,oplog操作会产生相同的结果,无论是一次还是多次应用于目标数据集。
首次启动副本集成员时,如果未指定操作日志大小,则MongoDB将创建默认大小的操作日志。[1]
默认操作日志大小取决于存储引擎:
储存引擎 | 默认操作日志大小 | 下界 | 上界 |
---|---|---|---|
内存中存储引擎 | 物理内存的5% | 50兆字节 | 50 GB |
WiredTiger存储引擎 | 可用磁盘空间的5% | 990兆字节 | 50 GB |
默认操作日志大小为192 MB的物理内存或可用磁盘空间,具体取决于存储引擎:
储存引擎 | 默认操作日志大小 |
---|---|
内存中存储引擎 | 192 MB的物理内存 |
WiredTiger存储引擎 | 192 MB的可用磁盘空间 |
在大多数情况下,默认操作日志大小已足够。例如,如果操作日志是可用磁盘空间的5%,并且在24小时的操作中已满,则辅助服务器可以在长达24小时的时间内停止从操作日志中复制条目,而不会过时而无法继续复制。但是,大多数副本集的操作量要少得多,并且它们的oplog可以容纳更多的操作。
在mongod
创建操作日志之前,您可以使用oplogSizeMB
选项指定其大小。首次启动副本集成员后,请使用
replSetResizeOplog
管理命令更改操作日志大小。replSetResizeOplog
使您能够动态调整操作日志的大小,而无需重新启动mongod
进程。
[1] | 从MongoDB 4.0开始,操作日志可以超过其配置的大小限制,以避免删除。majority commit point |
如果您可以预测副本集的工作量类似于以下模式之一,则可能需要创建一个大于默认值的操作日志。相反,如果您的应用程序主要以最少的写操作执行读取,则较小的oplog可能就足够了。
以下工作负载可能需要更大的oplog大小。
如果删除与插入时大致相同的数据量,则数据库在磁盘使用方面不会显着增长,但是操作日志的大小可能会很大。
如果工作量的很大一部分是不增加文档大小的更新,则数据库会记录大量操作,但不会更改磁盘上的数据量。
要查看操作日志状态,包括操作的大小和时间范围,请发出该rs.printReplicationInfo()
方法。有关oplog状态的更多信息,请参阅
检查Oplog的大小。
在各种特殊情况下,对次要操作日志的更新可能会滞后于所需的性能时间。使用
db.getReplicationInfo()
辅助成员和
复制状态
输出来评估当前复制状态并确定是否存在意外复制延迟。
从MongoDB 4.2开始,管理员可以限制主数据库应用其写入的速率,以将延迟保持在可配置的最大值以下。majority
committed
flowControlTargetLagSeconds
默认情况下,流量控制为enabled
。
注意
为了启用流控制,副本集/分片集群必须具有:featureCompatibilityVersion(FCV) of
4.2
并读取关注。也就是说,如果未启用FCV 或禁用了多数读功能,则启用的流控制无效。majority enabled
4.2
有关更多信息,请参见复制延迟。
从版本4.2(也从版本4.0.6开始也可用)开始,副本集的辅助成员现在记录的操作日志条目所花费的时间比应用慢操作阈值长。这些消息是logged
针对REPL
带有文本的组件下的次要
消息
的。applied op: <oplog entry> took
<num>ms
在次要节点上运行缓慢的oplog应用程序日志为:
slowOpSampleRate
; 即所有慢速oplog条目都由辅助日志记录。logLevel
/ systemLog.verbosity
级别(或
systemLog.component.replication.verbosity
级别)的影响;即对于操作日志条目,辅助日志仅记录慢速操作日志条目。增加详细级别不会记录所有操作日志条目。有关设置慢速运行阈值的更多信息,请参见
如果您的MongoDB部署使用
WiredTiger Storage Engine,则不能
从任何副本集成员drop
进行local.oplog.rs
收集。此限制适用于单成员和多成员副本集。如果节点暂时关闭并尝试在重新启动过程中重播oplog,则删除oplog可能导致副本集中的数据不一致。