Docs Menu
Docs Home
/
MongoDBマニュアル
/ / /

ファイルシステムのスナップショットを使用した自己管理型配置のバックアップと復元

項目一覧

  • スナップショットの概要
  • Considerations
  • Linux での LVM を使用したバックアップと復元
  • ジャーナルファイルを含むインスタンスの別のボリュームへのバックアップ、またはジャーナリングなしでのインスタンスのバックアップ

このドキュメントでは、 LVMやストレージ アプライアンスなどのシステムレベルのツールを使用して MongoDB スタンドアロン サーバーとレプリカセットのバックアップを作成する手順と、それに対応する復元戦略について説明します。 シャーディングされたクラスターの詳細については、「ファイルシステム スナップショットを使用した自己管理型シャーディングされたクラスターのバックアップ 」を参照してください。

これらのファイルシステムのスナップショット、または「ブロックレベル」バックアップ方法では、システムレベルのツールを使って MongoDB のデータファイルを保持するデバイスのコピーを作成します。これらのメソッドはすぐに完了し、確実に機能しますが、MongoDB 外で追加のシステム設定を行う必要があります。

Tip

以下も参照してください。

スナップショットは、ライブデータと特別なスナップショットのボリューム間にポインターを作成することで機能します。これらのポインターは理論的には「ハードリンク」と同じです。作業データがスナップショットと異なる場合、スナップショット加工ではコピーオンライト戦略が使用されます。その結果、スナップショットには変更されたデータのみがストアされます。

スナップショットを作成したら、スナップショット画像をファイルシステムにマウントし、スナップショットからデータをコピーします。結果として得られるバックアップには、すべてのデータの完全なコピーが含まれます。

MongoDB では、MongoDB インスタンスのデータファイルとジャーナルファイルが別々のボリュームに存在する場合に、WiredTiger ストレージエンジンを使用して MongoDB インスタンスのボリュームレベルのバックアップをサポートしています。ただし、一貫性のあるバックアップを作成するには、データベースをロックし、バックアップ プロセス中にデータベースへのすべての書き込みを一時停止する必要があります。

AES256-GCM 暗号化モードを使用して暗号化されたストレージ エンジンの場合、AES256-GCM はすべてのプロセスについて、キーとユニークなカウンター ブロック値を使用することを求めます。

AES256-GCM 暗号で構成されたストレージ エンジンの場合:

  • ホット バックアップからの復元
    バージョン 4.2 以降、「ホット」バックアップ(mongod が実行されている状態)で取得したファイルからの復元では、MongoDB が起動時に「汚染された」キーを検出し、データベース キーを自動的にロールオーバーして、IV(Initialization Vector: 初期化ベクトル)の再利用を回避できるようになりました。
  • コールド バックアップからの復元

    ただし、「コールド」バックアップ(mongod が実行されていない状態)で取得したファイルからの復元では、MongoDB が起動時に「汚染された」キーを検出できず、IV を再利用すると、機密性と整合性における保証が無効になります。

    バージョン 4.2 以降では、コールド ファイルシステム スナップショットから復元した後にキーが再利用されるのを回避するため、MongoDB に新しいコマンド ライン オプション --eseDatabaseKeyRollover が追加されました。--eseDatabaseKeyRollover オプションを使用して起動すると、mongod インスタンスは AES256-GCM 暗号で構成されたデータベース キーをロールオーバーして終了します。

スナップショットを実行するときは、データベースが有効である必要があります。つまり、データベースが受け入れるすべての書き込みは、ジャーナルまたはデータファイルのいずれかのディスクに完全に書き込まれる必要があります。

バックアップの実行時にディスク上に存在しない書き込みがある場合、バックアップではこれらの変更は反映されません。

WiredTiger ストレージエンジンの場合、データファイルは最後のチェックポイント時点での一貫した状態を反映します。 チェックポイントは 2 GB のデータごとに、または 1 分ごとに発生します。

スナップショットはディスクイメージ全体のイメージを作成します。システム全体をバックアップする必要がなければ、MongoDB のデータファイル、ジャーナル(該当する場合)、設定を他のデータを含まない 1 つの論理ディスクに分離することを検討してください。

あるいは、すべての MongoDB データファイルを専用のデバイスにストアして、余計なデータを重複させずにバックアップを取れるようにします。

スナップショットから他のシステムにデータをコピーするようにします。これにより、サイト障害からデータを保護できます。

このチュートリアルには、増分バックアップの手順は含まれていません。スナップショットの方法が異なれば、提供される機能も異なりますが、以下で説明する LVM の方法では、増分バックアップをキャプチャするためのキャパシティーは提供されません。

mongod インスタンスでジャーナリングが有効になっている場合は、任意の種類のファイルシステムまたはボリュームやブロックレベルでのスナップショットツールを使用してバックアップを作成できます。

Linux ベースのシステムで独自のインフラストラクチャを管理する場合は、ディスクパッケージを提供し、スナップショット機能を提供するように LVM を使用してシステムを構成します。また、クラウド環境や仮想化環境内で LVM ベースの設定を使用することもできます。

注意

LVM を実行すると柔軟性が高まり、スナップショットを使用して MongoDB をバックアップできるようになります。

インスタンス内で RAID が構成された Amazon の EBS(Elastic Block Storage)上での配置に依存している場合、プラットフォームのスナップショットツールを使用してすべてのディスクで一貫性のある状態を取得することは不可能です。別の方法として、次のいずれかを実行することができます。

  • ディスクへのすべての書き込みをフラッシュし、書込みロック (write lock) を作成して、バックアップ処理中の状態の一貫性を確保します。

    このオプションを選択する場合は、「 ジャーナルファイルを含むインスタンスの別のボリュームへのバックアップ、またはジャーナリングなしでのインスタンスのバックアップ」を参照してください。

  • システム内の RAID の一番上で MongoDB データファイルを実行し、保持するように LVM を構成します。

    このオプションを選択した場合は、「 スナップショットの作成 」で説明されている LVM バックアップ操作を実行します。

このセクションでは、Linux システムで LVM を使用しての簡単なバックアップ処理の概要を説明します。ツール、コマンド、パスはシステムによって(若干)異なる場合がありますが、次の手順ではバックアップ操作の概要を説明します。

注意

以下の手順は、バックアップシステムとインフラのガイドラインとしてのみ使用してください。本番環境のバックアップシステムでは、アプリケーション固有の要件数や特定の環境に固有の要素を考慮する必要があります。

シャーディングされたクラスターの詳細については、「ファイルシステム スナップショットを使用した自己管理型シャーディングされたクラスターのバックアップ 」を参照してください。

WiredTiger を使った MongoDB インスタンスのボリュームレベルのバックアップでは、データファイルとジャーナルを単一のボリュームに置く必要がなくなりました。

LVM を使用してスナップショットを作成するには、次の形式でルートとしてコマンドを発行します。

lvcreate --size 100M --snapshot --name mdb-snap01 /dev/vg0/mongodb

このコマンドは、vg0 ボリュームグループ内の mongodb ボリュームの mdb-snap01 という名前の LVM スナップショット(--snapshot オプションを使用)を作成します。

この例では、/dev/vg0/mdb-snap01 にある mdb-snap01 という名前のスナップショットを作成します。システムのボリュームグループとデバイスのロケーションとパスは、オペレーティングシステムの LVM 構成によって若干異なる場合があります。

パラメーター --size 100M により、スナップショットの上限は 100 メガバイトになります。このサイズはディスク上のデータの総量ではなく、/dev/vg0/mongodb の現在の状態とスナップショットの作成との間の量の差異(/dev/vg0/mdb-snap01 など)を反映しています。

警告

特に、システムからデータをコピーしたり、一時的なイメージにコピーするのにかかる時間を考慮して、データの増加に対応できる十分なスペースのあるスナップショットを作成するように確認します。

スナップショットの容量が不足すると、スナップショットのイメージは使用できなくなります。この論理ボリュームを破棄し、別の論理ボリュームを作成します。

スナップショットは、コマンドが戻ったときに存在します。いつでもスナップショットから直接復元できます。また、新しい論理ボリュームを作成してこのスナップショットから代替イメージを復元することもできます。

スナップショットは高品質のバックアップを素早く作成するのに最適ですが、バックアップデータをストアするための形式としては理想的ではありません。スナップショットは通常、元のディスクイメージと同じストレージインフラストラクチャに依存し、そこに保存されます。したがって、これらのスナップショットをアーカイブして別の場所にストアすることが重要です。

スナップショットを作成したら、スナップショットをマウントし、データを別のストレージにコピーします。バックアップイメージをオフラインに移動すると、システムがバックアップイメージを圧縮しようとすることがあります。または、次の手順でスナップショットのイメージをブロックレベルでコピー作成します。

umount /dev/vg0/mdb-snap01
dd if=/dev/vg0/mdb-snap01 | gzip > mdb-snap01.gz

上記のコマンドシーケンスでは、以下のことを行います。

  • /dev/vg0/mdb-snap01 デバイスがマウントされていないことを確認します。マウントされているファイルシステムまたはファイルシステムのスナップショットのブロックレベルのコピーは絶対に作成しないでください。

  • dd コマンドを使用してスナップショットイメージ全体のブロックレベルのコピーを実行し、その結果を現在の作業ディレクトリ内の gzip ファイルに圧縮します。

    警告

    このコマンドは、現在の作業ディレクトリに大容量の gz ファイルを作成します。十分な空き容量があるファイルシステムでこのコマンドを実行するようにします。

LVM で作成されたスナップショットを復元するには、以下の一連のコマンドを実行します。

lvcreate --size 1G --name mdb-new vg0
gzip -d -c mdb-snap01.gz | dd of=/dev/vg0/mdb-new
mount /dev/vg0/mdb-new /srv/mongodb

上記のシーケンスでは、次の処理が行われます。

  • /dev/vg0 ボリュームグループに mdb-new という名前の新しい論理ボリュームを作成します。新しいデバイスへのパスは、/dev/vg0/mdb-new になります。

    警告

    このボリュームの最大サイズは 1 ギガバイトです。元のファイルシステムの合計サイズが 1 ギガバイト以下でなければ、復元は失敗します。

    1G を希望のボリュームサイズに変更します。

  • mdb-snap01.gz を圧縮解除してアーカイブ解除し、mdb-new ディスクイメージに展開します。

  • mdb-new ディスクイメージを /srv/mongodb ディレクトリにマウントします。MongoDB データファイルのロケーションに対応するようにマウントポイントを変更するか、必要に応じて他のロケーションに変更します。

注意

復元されたスナップショットには古いmongod.lockファイルが含まれます。 このファイルをスナップショットから除かないと、MongoDB は古いロックファイルが問題のあるシャットダウンを示していると見なす可能性があります。 storage.journal.enabledを有効にして実行していて、 db.fsyncLock()を使用していない場合は、 mongod.lockファイルを削除する必要はありません。 db.fsyncLock()を使用する場合は、ロックを削除する必要があります。

圧縮された gz ファイルに書き込まずにバックアップを復元するには、次の一連のコマンドを使用します。

umount /dev/vg0/mdb-snap01
lvcreate --size 1G --name mdb-new vg0
dd if=/dev/vg0/mdb-snap01 of=/dev/vg0/mdb-new
mount /dev/vg0/mdb-new /srv/mongodb

注意

すべての MongoDB コレクションには、デフォルトで UUIDが付属します。MongoDB がコレクションを復元する場合、復元されたコレクションは元の UUID を保持します。UUID がないコレクションを復元する場合、MongoDB は復元されたコレクションのために UUID を生成します。

コレクション UUID について詳しくは、「コレクション」を参照してください。

プロセスと SSH を組み合わせて使用し、オフシステムバックアップを実装できます。

このシーケンスは、SSH を使用してリモートシステムにバックアップをアーカイブし圧縮することを除いて、上で説明した手順とまったく同じです。

次の手順について考えてみます。

umount /dev/vg0/mdb-snap01
dd if=/dev/vg0/mdb-snap01 | ssh username@example.com gzip > /opt/backup/mdb-snap01.gz
lvcreate --size 1G --name mdb-new vg0
ssh username@example.com gzip -d -c /opt/backup/mdb-snap01.gz | dd of=/dev/vg0/mdb-new
mount /dev/vg0/mdb-new /srv/mongodb

WiredTiger を使った MongoDB インスタンスのボリュームレベルのバックアップでは、データファイルとジャーナルを単一のボリュームに置く必要がなくなりました。ただし、バックアップの一貫性を確保するために、バックアップ プロセス中にデータベースをロックし、データベースへのすべての書き込みを中断する必要があります。

mongod インスタンスがジャーナリングなしで実行中であるか、ジャーナルファイルが別のボリュームにある場合は、バックアップ処理中の書き込みを防ぐために、すべての書き込みをディスクにフラッシュし、データベースをロックする必要があります。レプリカセット構成の場合は、バックアップには読み取りを受信していないセカンダリ(つまり非表示ノード)。

1

ディスクへの書込み (write) をフラッシュし、データベースを "ロック" するには、mongoshdb.fsyncLock() メソッドを発行します。

db.fsyncLock();
3

スナップショットを作成した後にデータベースのロックを解除するには、 mongoshで次のコマンドを使用します。

db.fsyncUnlock();

戻る

バックアップ 方法