翻译或纠错本页面

修改Oplog大小

On this page

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 membersreplication 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.