关于MongoDB中的oplog

什么是oplog

The oplog (operations log) is a special capped collection that keeps a rolling record of all operations that modify the data stored in your databases.
oplog,操作日志的简称,是local库下一个特殊的固定集合,它保存了与数据库中数据存储相关的所有操作记录。Secondary就是通过查看Primary 的oplog这个集合来进行复制的。每个节点都有oplog,记录这从主节点复制过来的信息,这样每个成员都可以作为同步源给其他节点。

oplog的用处

oplog 可以说是MongoDB Replication的纽带了。
MongoDB在主服务器上应用数据库操作,然后在主服务器的oplog上记录操作。 然后,辅助成员在异步过程中复制并应用这些操作。 所有副本集成员都在local.oplog.rs集合中包含oplog的副本,这允许它们维护数据库的当前状态。

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

oplog中的每个操作都是幂等的。 也就是说,无论是对目标数据集应用一次还是多次,oplog操作都会产生相同的结果。

oplog的大小

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

对于Unix和Windows系统,默认oplog大小取决于所使用的存储引擎

Storage EngineDefault Oplog SizeLower BoundUpper Bound
In-Memory Storage Engine5% of physical memory50 MB50 GB
WiredTiger Storage Engine5% of free disk space990 MB50 GB
MMAPv1 Storage Engine5% of free disk space990 MB50 GB

oplog的大小设置是值得考虑的一个问题:

  • 如果oplog size过大,会浪费存储空间;
  • 如果oplog size过小,老的oplog记录很快就会被覆盖,那么宕机的节点就很容易出现无法同步数据的现象。

影响Oplog大小设置的工作负载

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

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

一次更新多个文档
oplog必须将多个更新转换为单个操作,以保持幂等性。 这可以使用大量的oplog空间,而不会相应增加数据大小或磁盘使用。

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

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

如何查看Oplog状态

要查看oplog状态(包括操作的大小和时间范围),可以使用rs.printReplicationInfo()方法。

在各种异常情况下,对辅助操作系统的更新可能会落后于所需的性能时间。 使用来自辅助成员的db.getReplicationInfo()和复制状态输出来评估当前的复制状态,并确定是否存在任何意外的复制延迟。

oplog数据结构

下面来分析一下oplog中字段的含义,通过下面的命令取出一条oplog:

db.oplog.rs.find().skip(1).limit(1).toArray()

具体的字段定义可以参考下表:

Field NameAliasDetailsOperationsValues
tsTimeSpaceHolds the “Time of the operation” & “incremental id”. For all bulk (insert/remove/update) operations “Time of the operation” remains same and id changes to an incremental value. Default value of the id is 1For All Operations(Time of the operation, incremental id)
h hasha unique ID for each operationFor All OperationsNumberLong(“7202552052460497158”)
tNANAFor All OperationsNumberLong(1)
vversion#versionFor All Operations2
opOperation TypeWrite operations (import/Insert/Delete/Update/)Write Operationsi/d/u
Commands that affect database (Create, Drop: Database/collection)Command OperationsC
Informational OperationNo-OperationN
nsNameSpaceThe database and collection affected by the operationWrite Operations(db_name.collection_name)
Command Operations(db_name.$cmd))
No-OperationBlank
OOperationInfo/Data of the OperationsInitiate Replica Set{“msg” : “initiate set”}
On Electing as Primary{“msg” : “new primary”}
Add Node1 as Secondary{“msg” : “Reconfig Set”, “version”:2}
Add Node2 as Secondary{“msg” : “Reconfig Set”, “version”:3}
Remove Node1 from RepSet{“msg” : “Reconfig Set”, “version”:4}
Create Collection{ “create” : “posts” }
Drop Collection{ “drop” : “posts” }
Drop Database{ “dropDatabase” : 1 }
Insert/Delete a Document{“_id”:1, “Name”:”ABC”}
Set () for update{ “$set” : { “Name” : “MyTest” } }
O2Update OperationHolds the _id of the document to be updatedUpdate Document{ “_id” : 21 }
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页