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

时间:2016-11-17 08:35:40

标签: mongodb mongodb-replica-set large-data

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

更换辅助成员上的磁盘后,数据文件夹为空并开始初始同步。通过查看日志,大约需要7个小时来复制记录,然后需要30个小时来构建索引,但这对于oplog来说太多了,因为它包含了在此期间插入/更新的所有记录:

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大小,但这需要整个副本集的停机时间。我们可以在没有停机的情况下使用哪些方法?

1 个答案:

答案 0 :(得分:3)

如果可能,最佳解决方案是使用文件系统快照。

只要oplog文件与其他数据文件位于相同的磁盘空间,您就可以直接对mongod节点进行快照。无需“关闭”或做任何其他主动的事情。

how to make restore with snapshot

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

如果无法使用文件系统快照,那么可以通过其他方式获取工作mongod数据目录的副本,如果可以有停机时间,这很容易。如果你不能有停机时间,你可以随时添加几个(两个)仲裁器并暂时停止其他辅助设备(以获取数据副本dir),当然在此期间你的副本设置基本上是“一个节点RS”。