我们正在使用具有三个节点的 MongoDB 副本集。该数据库相当大,有 2+ 亿条记录,在磁盘上占用 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 的大小,但这需要整个副本集的停机时间。我们可以使用哪些方法而无需停机?