3つのノードを持つMongoDBレプリカセットを使用しています。データベースは2億以上のレコードで、ディスク(WiredTiger MongoDBエンジン)で700GBを占めています。ほとんどの場合、文書には挿入物(1日に数百万回)が読み込まれ、更新されます。大規模データベース上の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のサイズを増やすことを考えましたが、それはレプリカセット全体のダウンタイムを必要とします。ダウンタイムを発生させずにどのような方法で使用できますか?
これはGoogle Compute Engineでホストされているため、次の手順でスナップショットを使用することができました。1)2つのアービターが追加されました。 2)健全なセカンダリおよびフリーズファイルシステムをシャットダウンする。 3)スナップショットを作成し、健全な状態を解凍してオンラインに戻す。 4)このスナップショットイメージで新しいディスクを作成し、それを「不健全な」サーバーにマウントしました。 5)はデータファイルをコピーしました(ディスク全体を置き換えることはできましたが)。 6)MongoDBを起動し、アービタを削除し、新しいディスクをアンマウントしました。すべてを完了するのに約2時間かかった。 – ssasa