ドロップレットスナップショットを使用してMongoDBをバックアップする方法

前書き

定期的なデータベースバックアップは、意図しないデータ損失イベントから保護するための重要なステップです。 一般に、バックアップには大きく2つのカテゴリがあります。ファイルシステムレベル(「物理」)バックアップと論理バックアップです。 ファイルシステムレベルのバックアップでは、基礎となるデータファイルのある時点でのスナップショットが作成され、スナップショットファイルにキャプチャされた状態を使用してデータベースがきれいに復元されます。 論理バックアップには、ツールの使用が含まれます(例: mongodumpまたはpg_dump)を使用して、データベースからバックアップファイルにデータをエクスポートします。バックアップファイルは、対応する復元ツール(例: mongorestoreまたはpsql <)。

このガイドでは、Droplet Snapshotsを使用して、実行中のMongoDBインストールのファイルシステムレベルのバックアップを実行する方法を示します。 さらに、スナップショットイメージから復元を実行する方法についても説明します。

Note: DigitalOceanバックアップguideで詳しく説明されているように、Dropletスナップショットを使用すると、特に負荷の高いデータベースでパフォーマンスに影響があります。 最初に、シミュレートされた負荷のある非本番データベースを使用してこの手順をテストし、この方法が本番デプロイメントで機能することを確認する必要があります。

前提条件

このガイドを開始する前に、次の前提条件の手順を完了していることを確認してください。

このガイドでは、ジャーナリングが有効になっているデフォルトのWiredTigerストレージエンジンを使用して、MongoDB 3.2+がインストールされていることを前提としています。 さらに、このガイドを使用するには、dbpathディレクトリ(データファイルを含むディレクトリ、デフォルトでは/var/lib/mongodb)が単一のボリュームにマップされていることが重要です。 追加のブロックストレージボリュームをドロップレットに追加していない場合は、このガイドに従ってください。

Dropletにログインし、MongoDBを起動して実行すると、開始する準備が整います。

[[step-1 -—- verify-your-mongodb-setup]] ==ステップ1—MongoDBセットアップを確認します

まず、ジャーナリングが有効になっていることを確認します。

ジャーナリングはMongoDBの機能で、ジャーナルファイルに操作を書き込むことにより、データベースに障害が発生した場合に耐久性を提供します。 MongoDBジャーナリングの詳細については、MongoDB Manualを参照してください。

上記のガイドに従った場合、ジャーナリングはデフォルトで有効になります。 これが事実であることを確認するために、MongoDB構成ファイルを検査できます。

たとえばnanoなどのお気に入りのテキストエディタを使用して/etc/mongod.confを開きます。

nano /etc/mongod.conf

次のブロックが表示されるはずです。

/etc/mongod.conf

# Where and how to store data.
storage:
  dbPath: /var/lib/mongodb
  journal:
    enabled: true
#  engine:
#  mmapv1:
#  wiredTiger:

これは、ジャーナリングが有効になったことを示します。 MongoDB 3.2以降を使用している場合、デフォルトのストレージエンジンはWiredTigerです(MMAPv1はMongoDBの元のストレージエンジンでした)。

バックアップと復元の手順をテストするために、ダミーデータを挿入します。

[[step-2 -—- insert-test-data]] ==ステップ2—テストデータを挿入します

クリーンなサーバーから始めて、まだデータがない場合は、デモンストレーションの目的で、サンプルデータをダミーのrestaurantsコレクションに挿入できます。 データベースに既にいくつかのコレクションとドキュメントが保存されている場合は、この手順をスキップしてください。

まず、MongoDBシェルを使用して実行中のデータベースに接続します。

mongo

次のMongoシェルプロンプトが表示されます。

MongoDB shell version: 3.2.19
connecting to: test
Server has startup warnings:
2018-02-16T02:40:13.071+0000 I CONTROL  [initandlisten]
2018-02-16T02:40:13.071+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2018-02-16T02:40:13.071+0000 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2018-02-16T02:40:13.071+0000 I CONTROL  [initandlisten]
2018-02-16T02:40:13.071+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2018-02-16T02:40:13.071+0000 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2018-02-16T02:40:13.071+0000 I CONTROL  [initandlisten]
>

シェルが使用するデフォルトのデータベースはtestデータベースです。

testデータベースに存在するコレクションを一覧表示しましょう。

show collections

データベースにはまだ何も挿入していないため、コレクションはなく、出力なしでプロンプトに戻ります。

同時に作成するダミーのrestaurantsコレクションにドキュメントを挿入しましょう。

db.restaurants.insert({'name': 'Sammy's Pizzeria'})

次のような出力が表示されるはずです。

WriteResult({ "nInserted" : 1 })

これは、挿入操作が成功したことを示します。 restaurantsコレクションは以前は存在していなかったため、同時に作成されました。

コレクションをもう一度リストします。

show collections

新しく作成されたrestaurantsコレクションが表示されます。

restaurants

データベースにサンプルデータを保存したので、バックアップする準備が整いました。

[[step-3 -—- snapshot-the-mongodb-droplet]] ==ステップ3—MongoDBドロップレットのスナップショット

バックアップを実行するために、DigitalOceanDroplet Snapshotsを利用します。 ドロップレットスナップショットを使用すると、スナップショットが開始された時点でドロップレットのイメージを作成できます。 その後、このイメージを新しいドロップレットに復元して、さらに回復操作を行うことができます。

MongoDB 3.2+(WiredTigerとジャーナリングが有効になっている)を使用していることを考えると、スナップショットの発生中にファイルシステムへの書き込みを一時停止する必要はありません。 イメージを復元してデータベースを起動すると、MongoDBはそれ自体をチェックポイントから復元し、スナップショットが発生した時点に達するまでジャーナルファイルから操作を再生します。 ジャーナリングをさらに詳しく調べることに興味がある場合は、MongoDB Manual)を参照してください。

スナップショットプロセスlog in to your DigitalOcean accountを開始するには、MongoDBドロップレットに移動し、サイドバーのSnapshotsリンクをクリックします。

次のプロンプトが表示されるはずです。

Take Snapshot

Note:スナップショットを作成する前にドロップレットの電源を切ることをお勧めしますが、実稼働環境ではこれが常に可能であるとは限りません。 MongoDBのジャーナリング機能により、データベースとDropletの実行中でも、一貫性のある有効なスナップショットが可能になります。

スナップショットにわかりやすい名前を付け、Take Live Snapshotボタンをクリックしてスナップショットプロセスを開始します。

次のスナップショットの進行状況インジケータが表示されます。

Snapshot Progress

スナップショットが完了すると、イメージから新しいドロップレットを作成したり、実行中のドロップレットをスナップショットイメージでキャプチャした状態に復元したりできます。

これで、バックアップ手順の復元と検証を実行する準備が整いました。

[[step-4 -—- restore-the-mongodb-droplet]] ==ステップ4—MongoDBドロップレットを復元します

ここで、作成したばかりの画像から復元される新しいドロップレットを作成します。 MongoDBデータベースで使用可能なデータは、スナップショットが作成された時点で使用可能なデータと同じです。

サイドバーを使用してSnapshotsに戻り、完成したDropletスナップショットを見つけます。

Completed Snapshot

Moreをクリックして、Create Dropletを選択します。

Create Dropletメニューが表示され、スナップショットから新しいドロップレットを起動できます。

以前に撮影したスナップショットに対応する画像を選択します。 この場合、mongo-backup-test画像を使用します。

Choose Image

復元ドロップレットの構成を終了し、Createをクリックします。 復元Dropletが起動して実行されたら、ログインします。

Dropletの起動時に起動するようにMongoDBを構成した場合は、実行されているはずです。 これは、systemctlを使用して確認できます。

sudo systemctl status mongod

次のような出力が表示されるはずです。

Output● mongod.service - High-performance, schema-free document-oriented database
   Loaded: loaded (/lib/systemd/system/mongod.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2018-02-14 21:14:40 UTC; 4min 53s ago
     Docs: https://docs.mongodb.org/manual
 Main PID: 1302 (mongod)
    Tasks: 19
   Memory: 87.2M
      CPU: 1.802s
   CGroup: /system.slice/mongod.service
           └─1302 /usr/bin/mongod --quiet --config /etc/mongod.conf

すべてが正常であり、MongoDBが正常に起動したことを示します。

MongoDBが実行されていない場合は、まずロックファイルを削除してからサービスを開始する必要があります。

rm /var/lib/mongodb/mongod.lock
sudo systemctl start mongod

systemctl statusを使用してMongoDBが正しく起動したことを確認します。

MongoDBが起動して実行されると、自身のクリーンアップが開始され、スナップショットが発生した時点まで状態が復元されます。 これには数分かかる場合があり、これが完了するまでmongoシェルが使用できない場合があります。

サーバーが使用可能になったら、mongoコマンドを使用してログインできます。

mongo

これで、mongoシェルプロンプトが表示されます。

OutputMongoDB shell version: 3.2.19
connecting to: test
Server has startup warnings:
2018-02-14T21:14:41.923+0000 I CONTROL  [initandlisten]
2018-02-14T21:14:41.923+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2018-02-14T21:14:41.923+0000 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2018-02-14T21:14:41.923+0000 I CONTROL  [initandlisten]
2018-02-14T21:14:41.923+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2018-02-14T21:14:41.923+0000 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2018-02-14T21:14:41.923+0000 I CONTROL  [initandlisten]
>

ここまで来たらおめでとうございます! MongoDBデータベースのバックアップと復元が正常に実行されました。

追加の予防措置として、コレクションの整合性を確認できます。

[[step-5 --- check-data-integrity]] ==ステップ5—データの整合性をチェックします

このバックアップデータを実稼働で使用する前に、復元されたコレクションの無効なBSONオブジェクトをチェックすると便利です。

Note:validateコマンドは、非常に大きなコレクションでは遅くなる可能性があります。 さらに、validateコマンドが戻るまで、コレクションですべての読み取りと書き込みがブロックされます。

この例では、validateコマンドを実行するrestaurantsというコレクションがあります。

mongoシェルから、validateコマンドを実行します。

db.restaurants.validate({full:true})

次のような出力が表示されるはずです。

{
    "ns" : "test.restaurants",
    "nrecords" : 1,
    "nIndexes" : 1,
    "keysPerIndex" : {
        "test.restaurants.$_id_" : 1
    },
    "indexDetails" : {
        "test.restaurants.$_id_" : {
            "valid" : true
        }
    },
    "valid" : true,
    "errors" : [ ],
    "ok" : 1
}

valid: trueが表示されている場合は、コレクションのすべての側面が有効であり、このコレクションのデータを本番環境で安全に使用できます。

結論

このチュートリアルでは、実行中のMongoDBデータベースサーバーのファイルシステムレベルの物理的なバックアップを完了する方法を学びました。

MongoDBデータベースをバックアップするさまざまな方法の詳細については、MongoDB manualを参照してください。

この特定のバックアップ技術は、DigitalOceanの便利なドロップレットスナップショット機能により可能になりました。 ドロップレットスナップショットの詳細については、Snapshot docsを参照してください。

さらに、バックアップ機能を使用して、これらのスナップショットが自動的に発生するようにスケジュールできます。 ドロップレットバックアップの詳細については、Backups Introductionを参照してください。