MongoDB 在大型数据库上进行初始同步

MongoDB initial sync on a large database

我们正在使用具有三个节点的 MongoDB 副本集。数据库非常大,有 2+ 亿条记录,占用磁盘 700GB(WiredTiger MongoDB 引擎)。主要是在文档上执行插入(每天数百万次),然后进行读取和更新。

更换次要成员上的磁盘后,数据文件夹为空,初始同步开始。通过查看日志,复制记录大约需要 7 个小时,然后构建索引需要 30 个小时,但这对于 oplog 来说太多了,无法同时包含 inserted/updated 的所有记录:

2016-11-16T23:32:03.503+0100 E REPL     [rsBackgroundSync] too stale to catch up -- entering maintenance mode
2016-11-16T23:32:03.503+0100 I REPL     [rsBackgroundSync] our last optime : (term: 46, timestamp: Nov 15 10:03:15:8c)
2016-11-16T23:32:03.503+0100 I REPL     [rsBackgroundSync] oldest available is (term: 46, timestamp: Nov 15 17:37:57:30)
2016-11-16T23:32:03.503+0100 I REPL     [rsBackgroundSync] See http://dochub.mongodb.org/core/resyncingaverystalereplicasetmember

首先我们重新启动了这个成员并开始了重新同步:

2016-11-16T23:47:22.974+0100 I REPL     [rsSync] initial sync pending
2016-11-16T23:47:22.974+0100 I REPL     [ReplicationExecutor] syncing from: x3:27017
2016-11-16T23:47:23.219+0100 I REPL     [rsSync] initial sync drop all databases
2016-11-16T23:47:23.219+0100 I STORAGE  [rsSync] dropAllDatabasesExceptLocal 5
2016-11-16T23:53:09.014+0100 I REPL     [rsSync] initial sync clone all databases

通过查看数据文件夹,所有文件都被删除了,而且它们开始变大。但大约 8 小时后,它几乎没有重新同步 5% 的数据库。

使用什么方法进行如此大的同步?

我们想增加 oplog 的大小,但这需要整个副本集的停机时间。我们可以在不停机的情况下使用哪些方法?

最好的解决方案是尽可能使用文件系统快照。

您可以直接对 mongod 节点进行快照,只要 oplog 文件与其余数据文件位于相同的磁盘空间即可。不需要 "shutdown" 或做任何其他主动的事情。

how to make restore with snapshot

然后你只需将这些文件复制到新节点数据目录并启动 mongod。

如果文件系统快照是不可能的,那么一些其他的方法来复制工作的 mongod 数据目录,如果你可以有停机时间,这很容易。如果您不能停机,您总是可以添加几个(两个)仲裁器并暂时停止另一个辅助服务器(以获取数据目录的副本),当然在此期间您的副本集基本上是 "one node RS".