修改Oplog大小¶
The oplog exists internally as a capped collection, so you cannot modify its size in the course of normal operations. In most cases the default oplog size is an acceptable size; however, in some situations you may need a larger or smaller oplog. For example, you might need to change the oplog size if your applications perform large numbers of multi-updates or deletes in short periods of time.
本教程表述了如何为oplog扩容。更多有关oplog大小的信息,请参见 Oplog大小 。有关oplog大小将如何影响 delayed members 和 replication lag 请参见 延时节点 。
概述¶
为了修改oplog大小,我们需要以此为复制集中的每个节点进行维护。该过程需要:停止 mongod 进程,并以非单节点方式启动,修改oplog大小,再重启该节点。
重要
请确保我们从复制集的从节点开始维护,并最后维护主节点。
流程¶
以单节点模式重启节点。
小技巧
Always use rs.stepDown() to force the primary to become a secondary, before stopping the server. This facilitates a more efficient election process.
重新以我们希望的大小建立oplog,并保留旧的oplog的条目作为查询条件(with an old oplog entry as a seed)。
以复制集节点的形式重启 mongod 实例。
在其他端口上以单节点模式重启从节点¶
关闭一个非主节点的 mongod 实例。比如,通过 db.shutdownServer() 命令来关闭:
db.shutdownServer()
在其他端口上以单节点模式(不包含 --replSet 参数)重新启动该 mongod 实例 。命令如下:
mongod --port 37017 --dbpath /srv/mongodb
复制现有的Oplog(选做)¶
我们可以选择备份该节点现有的oplog来以防万一,命令如下:
mongodump --db local --collection 'oplog.rs' --port 37017
以新的大小和Seed Entry重建oplog¶
保存oplog中最新的条目。例如,连接进入 mongo 窗口,并通过如下命令进入 local 数据库:
use local
在 mongo 窗口中,我们可以使用如下命令来设置 db :
db = db.getSiblingDB('local')
通过删除 temp 表来确保其是空的:
db.temp.drop()
使用 natural order 排序来找到oplog中最后一条数据,并通过 db.collection.save() 命令插入temp表中:
db.temp.save( db.oplog.rs.find( { }, { ts: 1, h: 1 } ).sort( {$natural : -1} ).limit(1).next() )
通过如下命令来查看oplog的入口:
db.temp.find()
删除已存在的Oplog¶
通过如下命令在 local 数据库中删除老的 oplog.rs 集合:
db = db.getSiblingDB('local')
db.oplog.rs.drop()
会返回 true
建立新的Oplog¶
通过 create 命令来建立新的oplog(新的大小)。 指定 size (单位为bytes)。下面的命令会建立一个 大小为 2 * 1024 * 1024 * 1024 也就是2G的oplog:
db.runCommand( { create: "oplog.rs", capped: true, size: (2 * 1024 * 1024 * 1024) } )
成功后会返回如下内容:
{ "ok" : 1 }
将就Oplog的最后的条目插入新的Oplog中¶
将之前存好的老的oplog的最新的条目插入新的oplog中。例如:
db.oplog.rs.save( db.temp.findOne() )
通过如下命令来确认:
db.oplog.rs.find()
重启节点¶
以复制集模式重启 mongod 实例,如:
db.shutdownServer()
mongod --replSet rs0 --dbpath /srv/mongodb
该复制集将会恢复并会在其成为主节点之前 “catch up” 数据。
重复该操作在所有节点上¶
重复该操作在所有我们希望修改oplog大小的机器上。最后再在主节点上进行该操作。
修改主节点的Oplog大小¶
To finish the rolling maintenance operation, step down the primary with the rs.stepDown() method and repeat the oplog resizing procedure above.