mongoDBクラスタにrestoreする時の高速化テクニック

developers.cyberagent.co.jp

真新しいmongoDBクラスタにデータをrestoreする時に高速化テクニックとして、メンテナンス開始前にバックアップデータ等を一度restoreしてmongoDBクラスタを暖気しておく方法があります。

mongoDBの大規模なクラスタに巨大なデータをrestoreすると非常に時間がかかります。例えば800GBのdumpデータをrestoreすると丸一日以上かかってしまいますが、流石にメンテナンスで丸一日サービスを止めたくはないでしょう。

mongoDBはinsertしたデータを一旦プライマリシャードに保存し、データが増えると自動的に他のシャードにデータが分散されていくのですが、このチャンク移動の負荷がかなり大きいのです。

そこで事前にバックアップの本番データをdump、新クラスタにrestoreしてチャンク移動の完了を待ち、ドキュメントの保存先のシャードが決定された状態にします。この状態でデータをremove(dropするとシャーディングの情報も消えてしまうのでremove)してrestoreすると、プライマリシャードを経由せず、最初から適切なシャードに分散してinsertされます。これでチャンク移動の負荷がなくなるので restore の所要時間は1/3 〜 1/4程度に短縮されます。

本番稼働中のDBに対して新規コレクションを追加する時も、あらかじめダミーデータを少しずつ入れて暖気しておくと、新機能のリリース直後のDB負荷が下がるのでおすすめです。