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

前書き

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

このガイドでは、https://www.digitalocean.com/community/tutorials/digitalocean-backups-and-snapshots-explained [Droplet Snapshots]を使用して、実行中のMongoDBインストールのファイルシステムレベルのバックアップを実行する方法を示します。 さらに、スナップショットイメージから復元を実行する方法についても説明します。

前提条件

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

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

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

ステップ1-MongoDBセットアップを確認する

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

ジャーナリングはMongoDBの機能で、ジャーナルファイルに操作を書き込むことにより、データベースに障害が発生した場合に耐久性を提供します。 MongoDBジャーナリングの詳細については、https://docs.mongodb.com/v3.2/core/journaling/ [MongoDBマニュアル]を参照してください。

上記のガイドに従った場合、ジャーナリングはデフォルトで有効になります。 これが事実であることを確認するために、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の元のストレージエンジンでした)。

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

ステップ2-テストデータの挿入

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

まず、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

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

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

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

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

WriteResult({ "nInserted" : 1 })

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

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

show collections

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

restaurants

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

ステップ3-MongoDBドロップレットのスナップショット

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

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

スナップショットプロセスを開始するには、https://cloud.digitalocean.com/droplets [DigitalOceanアカウントにログイン]、MongoDBドロップレットに移動し、サイドバーの* Snapshots *リンクをクリックします。

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

画像:https://assets.digitalocean.com/articles/backup-mongo-snapshots/take-snapshot.png [スナップショットを撮る]

スナップショットにわかりやすい名前を付け、[ライブスナップショットを取得]ボタンをクリックして、スナップショットプロセスを開始します。

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

image:https://assets.digitalocean.com/articles/backup-mongo-snapshots/droplet-snapshots.png [スナップショットの進行状況]

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

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

ステップ4-MongoDBドロップレットを復元する

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

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

image:https://assets.digitalocean.com/articles/backup-mongo-snapshots/droplet-snapshots-mongo.png [完了したスナップショット]

*その他*をクリックして、*ドロップレットの作成*を選択します。

[ドロップレットの作成]メニューが表示され、スナップショットから新しいドロップレットを作成できます。

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

image:https://assets.digitalocean.com/articles/backup-mongo-snapshots/choose-an-image.png [画像を選択]

復元ドロップレットの構成を終了し、[作成]をクリックします。 復元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データベースのバックアップと復元が正常に実行されました。

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

ステップ5-データの整合性を確認する

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

この例では、 `+ validate +`コマンドを実行するために呼び出されるコレクションがあります。

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

db..validate({full:true})

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

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

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

結論

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

MongoDBデータベースをバックアップするさまざまな方法の詳細については、https://docs.mongodb.com/v3.2/core/backups/ [MongoDBマニュアル]を参照してください。

この特定のバックアップ技術は、DigitalOceanの便利なドロップレットスナップショット機能により可能になりました。 ドロップレットスナップショットの詳細については、https://www.digitalocean.com/community/tutorials/digitalocean-backups-and-snapshots-explained [Snapshot docs]をご覧ください。

さらに、バックアップ機能を使用して、これらのスナップショットが自動的に発生するようにスケジュールできます。 ドロップレットバックアップの詳細については、https://www.digitalocean.com/community/tutorials/an-introduction-to-digitalocean-backups [バックアップの概要]を参照してください。

前の投稿:Ubuntu 16.04でJekyll開発サイトをセットアップする方法
次の投稿:Salt Cloudマップファイルを使用してアプリサーバーとNginxリバースプロキシを展開する方法