翻译:MongoDB副本集--Oplog
oplog是一个特殊的上限集合,里面记录着你数据库里面的所有操作。
MongoDB在 primary成员中接受相关操作并且把这些操作记录在主服务器的oplog里。然后备份服务器在异步线程中复制且应用这些操作在自己身上。为了维护数据库的当前状态,副本集里的所有成员都有一份oplog的copy,且记录在local.oplog.rs
集合中。
为了复制的便利性,所有副本集成员都与其他成员保持心跳链接,且所有副本集成员都可以将另外成员的oplog完全导入到自己的oplog。
在oplog的每一个操作都是幂等的。也就是说,无论是对目标数据集应用一次或者多次,oplog都会生成相同的结果。
oplog的大小:
The default oplog size depends on the storage engine:
For Unix and Windows systems
Storage Engine | Default Oplog Size | Lower Bound | Upper Bound |
---|---|---|---|
In-Memory Storage Engine | 5% of physical memory | 50 MB | 50 GB |
WiredTiger Storage Engine | 5% of free disk space | 990 MB | 50 GB |
MMAPv1 Storage Engine | 5% of free disk space | 990 MB | 50 GB |
For 64-bit macOS systems
Storage Engine | Default Oplog Size |
---|---|
In-Memory Storage Engine | 192 MB of physical memory |
WiredTiger Storage Engine | 192 MB of free disk space |
MMAPv1 Storage Engine | 192 MB of free disk space |
大多数情况下,默认的oplog大小是够用的。比如,5%的磁盘剩余空间可以记录24小时的操作记录,那么备份服务器就可以24小时内不从oplog里面复制操作记录从而避免数据太旧的问题。然而,大多数的副本集都不会出现这么极端的情况,他们的oplog可以容纳更多的操作。
在mongod建立oplog之前,你可以利用 oplogSizeMB
选项来指定oplog的大小。一旦你已经新建了一个副本集成员,你可以用 replSetResizeOplog
这个命令来改变oplog的大小。 replSetResizeOplog
允许你动态改变oplog的大小而不用重启mongod进程。
可能需要一个更大的oplog大小的负载情况
如果你的副本集可能出现以下情况,你可能需要一个比默认size更大的oplog。相反,如果你只是主要执行查询和小部分写操作,一个更小的oplog可能会更合适。
可能需要一个比默认size更大的oplog的情况:
-
一次过update所有文档
为了维护幂等性,oplog必须将多个操作转换为单个操作。该操作可以用更大size的oplog换取相应的磁盘大小。 -
删除的操作次数等同于插入操作次数
如果你的删除操作约等于你的插入操作次数,数据库不会显著的增加你的磁盘占用,但oplog的大小可以很大很大。 -
大量的就地更新
如果很大一部分的负载是更新操作并且该操作不会增加文档的大小,数据库会记录大量的操作,但不会改变磁盘中的数据量。
oplog的状态
要查看包含大小,时间范围的oplog状态,使用rs.printReplicationInfo()
方法。获取更多的oplog状态的信息,查看 Check the Size of the Oplog
.