はじめに
本連載ではこれまでMongoDBの機能面に着目してきましたが、今回から数回に分けてMongoDBの非機能面を紹介します。非機能面の中でも、今回はMongoDBの運用に欠かせないバックアップについて説明します。なお、MongoDBは最新バージョンの2.4を対象としています。
コマンド表記について
$ : コマンドラインで実行するコマンド
MongoDBのバックアップの概要
MongoDBをバックアップするには、データそのもののバックアップと、コンフィグオプションのバックアップが必要です。
コンフィグオプションは、mongodの起動引数かコンフィグファイルで指定します。どちらの場合も、mongod起動シェルやコンフィグファイルなどのファイルをコピーするだけでバックアップ可能ですので、今回の記事では割愛します。
データのバックアップには一般的にフルバックアップと差分バックアップを組み合わせて使用しますが、MongoDBに差分バックアップの機能はありません。したがって、今回はフルバックアップとリストアの方法について紹介します。
[参考]
差分バックアップはヒューマンエラーによるデータ障害から復旧する目的でとられることがありますが、その目的にはMongoDBの遅延レプリケーションという機能が該当します。遅延レプリケーションについては、公式サイトを参照してください。
MongoDBでフルバックアップを行うには、以下の2通りの方法があります。
- データファイルをコピーする方法
- mongodumpを利用する方法
データファイルをコピーする方法
データファイルをコピーする方法は、データの変換が無いためとても手軽で高速ですが、その間データベースを停止するか、ロックしておく必要があります。多くの場合は、レプリカセットのセカンダリに対してこの方法でバックアップを取ります。もちろん、その際はOplogの溢れが発生しないように注意しなければなりません。Oplogのサイズを変更する方法は、公式サイトを参照してください。
mongodumpを利用する方法
mongodumpを利用する方法では、オンラインバックアップが可能です。また、データをバイナリ(BSON)形式でダンプするため、データの変換に時間がかかる代わりに、ファイルサイズを比較的小さく抑えられる利点があります。ただし、インデックスはダンプされずにリストア時に再構築されるため、大きなインデックスがある場合にはリストアに時間がかかることに注意してください。
データファイルをコピーする方法を試してみよう
まずは、データファイルをコピーする方法でフルバックアップとリストアを試してみましょう。データディレクトリへのパスは、デフォルトで/data/dbです。コンフィグオプションでdbpathを指定している場合は、それがデータディレクトリへのパスです。今回はデータディレクトリがデフォルトのまま/data/dbであるとして進めます。
バックアップ
mongodを停止し、データファイルをディレクトリごとコピーします。
これでフルバックアップが完了しました。何の問題も無くmongodを再開することができます。
それでは、データベースを停止せずに、ロックを使ってバックアップする方法も試してみましょう。
これでデータベースをロックしました。次に、データファイルをディレクトリごとコピーします。
最後にロックを解除します。
これでデータベースを停止せずにバックアップを取得することができました。
リストア
まず、mongodを停止して古いデータディレクトリを削除します。
リストアするには、コピーしておいたデータディレクトリを再配置するだけでOKです。
これでリストアが完了しました。mongodを起動しましょう。以下のような表示が出て起動できない場合、古いロックファイルを削除してください。
これでリストアが完了しました。
mongodumpを利用する方法を試してみよう
では次に、mongodumpでのフルバックアップとリストアを試してみましょう。
バックアップ
mongodを起動したままの状態で、mongodumpを実行します。
すると、カレントディレクトリにdumpディレクトリが作成され、その中にデータベースごとのダンプファイルが保存されます。
[参考]
--outオプションを指定することで、ダンプファイルの保存先を変更することができます。
リストア
mongodumpを使ってバックアップした場合は、mongorestoreを使ってリストアします。ただし、mongorestoreはデータのinsertしか行いませんので、注意が必要です。すなわち、データベースを完全にリストアしたい場合は、一度mongodを停止して古いデータディレクトリを削除するか、mongodを起動したまま全てのデータベースを削除してからmongorestoreを実行する必要があります。
今回は、一度mongodを停止して古いデータディレクトリを削除してからmongorestoreを実行する方法を試してみます。mongodを停止し、以下のコマンドを実行してください。
/data/dbディレクトリを作成して、mongodを起動します。
mongodを起動したままの状態で、mongorestoreを実行します。引数には、ダンプファイルへのパスを指定します。
これでリストアが完了しました。
mongodumpのオプション
mongodumpには複数のオプションがあります。ここでは、代表的なものをとりあげて紹介します。
コレクション単位でのバックアップ
--dbオプションでバックアップ対象のデータベースを指定し、さらに--collectionオプションで、バックアップ対象をコレクション単位で絞り込むことができます。
クエリ指定でのバックアップ
-qオプションで、バックアップ対象のデータをクエリで指定することができます。
リモートバックアップ
mongodumpを使用して、リモートマシン上で稼働しているMongoDBのバックアップをとることが可能です。実際の運用では、ハードウェア障害に備えて、ダンプファイルは別のマシン上に置いておく方が良いでしょう。
たとえば、ホスト名mongo.example.comの37017ポートで動作している認証有りのmongodのダンプファイルを取得するには、以下のように指定します。
これ以外のオプションについては、公式サイトのmongodumpのページをご参照ください。mongorestoreにも、リモートリストアやコレクション単位でのリストアなど、多くのオプションがあります。詳しくは公式サイトのmongorestoreのページをご参照ください。
まとめと次回のテーマ
今回はMongoDBのバックアップについて紹介しました。システムに障害はつきものです。いざという時に大切なデータをロストして泣かないためにも、きちんとバックアップ運用について設計しておきましょう。
次回はMongoDBの監視について紹介する予定です。お楽しみに!