- oplog(操作日志)是一个特殊的固定集合,它保存了修改存储在数据库中数据的所有操作的滚动记录。
- MongoDB在主要成员上应用数据库操作,然后在主要成员的oplog上记录操作。然后,辅助成员在异步过程中复制并应用这些操作。所有副本集成员都在集合中包含oplog的副本
local.oplog.rs
,这允许它们维护数据库的当前状态。 - 为了便于复制,所有副本集成员都会向所有其他成员发送心跳(ping)。任何辅助成员都可以从任何其他成员导入 oplog 条目。
- oplog中的每个操作都是幂等的。也就是说,无论是对目标数据集应用一次还是多次,oplog操作都会产生相同的结果。
如果您可以预测副本集的工作负载类似于以下模式之一,那么您可能希望创建一个大于默认值的oplog。相反,如果您的应用程序主要使用最少量的写入操作执行读取,则较小的oplog可能就足够了。
- 一次更新多个文件 :oplog 必须将多个更新转换为单个操作,以保持幂等性。这可以使用大量的oplog空间,而不会相应增加数据大小或磁盘使用。
- 删除等于与插入相同的数据量 :如果删除的数据大致与插入的数据大致相同,则数据库在磁盘使用中不会显着增长,但操作日志的大小可能非常大。
- 大量的更新:如果工作负载的很大一部分是不会增加文档大小的更新,则数据库会记录大量操作,但不会更改磁盘上的数据量。
rs.printReplicationInfo()
要查看oplog状态(包括操作的大小和时间范围)- 使用
db.getReplicationInfo()
辅助成员和 复制状态 输出来评估当前的复制状态,并确定是否存在任何意外的复制延迟。
-
如果副本集执行身份验证,则必须以具有修改本地数据库权限的用户身份进行身份验证,例如
clusterManager
或clusterAdmin
角色。 -
查看当前副本集的 oplog 大小
#该maxSize字段显示集合大小(以字节为单位)。 use local db.oplog.rs.stats().maxSize
-
更改副本集成员的oplog的大小
#将所需大小(以兆字节为单位)作为size参数传递。指定的大小必须大于990或等于990兆字节。 use local db.adminCommand({replSetResizeOplog:1,size:1000})
-
减小oplog的大小不会 自动回收分配给原始oplog大小的磁盘空间。
use local db.runCommand({"compact":"oplog.rs"})
对于集合中的
compact
命令需要的特殊权限,详细参看官网文档