DigitalOcean SpacesへのスケジュールされたMongoDBバックアップのセットアップ方法

前書き

定期的なデータベースバックアップは、意図しないデータ損失イベントから保護するための重要なステップです。 一般に、バックアップには大きく2つのカテゴリがあります。ファイルシステムレベル(「物理」)バックアップと論理バックアップです。

ファイルシステムレベルのバックアップでは、基礎となるデータファイルのある時点でのスナップショットを作成し、スナップショットファイルにキャプチャされた状態を使用してデータベースをきれいに回復できるようにします。 特に、http://tldp.org/HOWTO/LVM-HOWTO/snapshots_backup.html [LVMスナップショット]などのファイルシステムスナップショットまたはブロックストレージボリュームスナップショットと組み合わせて使用​​する場合、大規模なデータベースをすばやくバックアップするのに役立ちます。 DigitalOcean Block Storage Snapshotsとして。

論理バックアップには、ツールの使用が含まれます(例: + mongodump +`または `+ pg_dump +)を使用して、データベースからバックアップファイルにデータをエクスポートし、対応する復元ツールを使用して復元します(例: + mongorestore +`または `+ pg_restore +)。 多くの場合、バックアップおよび復元するデータをきめ細かく制御し、データベースのバージョンやインストール間でバックアップを移植できます。 論理バックアップツールは、メモリを介してバックアップされるすべてのデータを読み取るため、処理速度が遅くなり、特に大規模なデータベースの場合に重要な負荷が大きくなる可能性があります。

効果的なバックアップおよびリカバリ戦略の設計には、多くの場合、パフォーマンスへの影響、実装コスト、およびデータストレージコストとリカバリ速度、データ整合性、およびバックアップカバレッジのトレードオフが伴います。 最適なソリューションは、復旧ポイントと時間https://en.wikipedia.org/wiki/Recovery_point_objective[objectives]およびデータベースの規模とアーキテクチャに依存します。

このガイドでは、組み込みの論理バックアップツールである `+ mongodump `を使用してMongoDBデータベースをバックアップする方法を示します。 次に、結果のシリアル化されたデータバックアップファイルを圧縮して、https://www.digitalocean.com/community/tutorials/an-introduction-to-digitalocean-spaces [DigitalOcean Spaces](非常に冗長なオブジェクトストア)にアップロードする方法を示します。 。 また、Bashと「 cron +」を使用してバックアップおよびアップロード操作を定期的にスケジュールする方法を示し、最後にサンプルのデータリカバリシナリオで締めくくります。

このチュートリアルの終わりまでに、拡張可能な自動バックアップ戦略のフレームワークを実装して、アプリケーションがデータ損失に陥った場合に迅速に復旧できるようにします。 小規模から中規模のデータベースの場合、「+ mongodump +」を使用した論理バックアップにより、バックアップおよびリカバリするデータをきめ細かく制御できます。 これらの圧縮されたバックアップアーカイブをDigitalOcean Spacesに保存すると、耐久性のあるオブジェクトストアで容易に利用できるため、アプリケーションデータが保護され、データ損失イベントが発生した場合に迅速に回復できます。

前提条件

このガイドを開始する前に、次の前提条件が利用可能であることを確認してください。

Dropletにログインし、MongoDBを起動して実行し、スペースを作成したら、すぐに使用を開始できます。

手順1-テストデータの挿入

クリーンなMongoDBインストールから始めて、まだデータを保存していない場合は、テストのために最初にダミーの「+ restaurants +」コレクションにサンプルデータを挿入する必要があります。 データベースにすでにいくつかのコレクションとドキュメントが保存されている場合は、この手順をスキップしてhttps://www.digitalocean.com/community/tutorials/how-to-set-up-scheduled-logical-mongodbに進んでください。 -backups-to-digitalocean-spaces#step-2-%E2%80%94-use-mongodump-to-back-up-mongodb-data [ステップ2]。

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

mongo

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

MongoDB shell version: 3.2.19
connecting to: test
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
   http://docs.mongodb.org/
Questions? Try the support group
   http://groups.google.com/group/mongodb-user
Server has startup warnings:
2018-04-11T20:30:57.320+0000 I CONTROL  [initandlisten]
2018-04-11T20:30:57.320+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2018-04-11T20:30:57.320+0000 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2018-04-11T20:30:57.320+0000 I CONTROL  [initandlisten]
>

デフォルトでは、シェルは `+ test`データベースに接続します。

`+ test +`データベースに存在するコレクションをリストしましょう:

show collections

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

ダミーの `+ restaurants +`コレクションにドキュメントを挿入しましょう。コレクションは自動的に作成されます(まだ存在しないため)。

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

次の出力が表示されます。

OutputWriteResult({ "nInserted" : 1 })

これは、挿入操作が成功したことを示します。

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

show collections

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

Outputrestaurants

MongoDBシェルを終了するには、 + CTRL + + `+ D +`を押します。

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

ステップ2-「+ mongodump +」を使用してMongoDBデータをバックアップする

組み込みの `+ mongodump +`ユーティリティを使用して、MongoDBデータベース全体を圧縮アーカイブファイルにバックアップ(または「ダンプ」)します。

まず、 `+ mongodump `によって作成されたアーカイブを保存するために、 ` backup +`という一時ディレクトリを作成しましょう。

mkdir backup

次に、このMongoDBインスタンスの「+ test 」データベースを「 test_dump.gz 」という圧縮アーカイブファイルにバックアップします。 インスタンスに他のデータベースが含まれている場合、「-db 」フラグの後に「 test 」の代わりに別のデータベース名を使用できます。 `-db +`フラグを省略して、MongoDBインスタンスの*すべて*データベースをバックアップすることもできます。

mongodump --db  --archive=.// --gzip

ここでは、 +-archive +`フラグを使用して、すべてのデータを単一のアーカイブファイル(場所は `+ archive +`パラメーターで指定)に保存することを指定し、 `+-gzip + `このファイルを圧縮することを指定するフラグ。 さらに、オプションで `+-collection`または -query`フラグを使用して、アーカイブする特定のコレクションまたはクエリを選択できます。 これらのフラグの詳細については、 ` mongodump +` https://docs.mongodb.com/manual/reference/program/mongodump/ [ドキュメント]をご覧ください。

dumpコマンドを実行すると、次の出力が表示されます。

Output2018-04-13T16:29:32.191+0000    writing test.restaurants to archive './'
2018-04-13T16:29:32.192+0000    done dumping test.restaurants (1 document)

これは、テストデータが正常にダンプされたことを示しています。

次のステップでは、このバックアップアーカイブをオブジェクトストレージにアップロードします。

ステップ3-バックアップアーカイブをDigitalOcean Spacesにアップロードする

このアーカイブをDigitalOcean Spaceにアップロードするには、https://www.digitalocean.com/community/tutorials/how-to-set-upでインストールおよび設定した `+ s3cmd +`ツールを使用する必要があります-scheduled-mongodb-backups-to-digitalocean-spaces#prerequisites [前提条件]。

最初に「+ s3cmd 」設定をテストし、バックアップスペースへのアクセスを試みます。 このチュートリアルでは、スペース名として「 mongo-backup-demo +」を使用しますが、スペースの実際の名前を入力する必要があります。

s3cmd info s3:///

次の出力が表示されます。

Outputs3:/// (bucket):
  Location:  nyc3
  Payer:     BucketOwner
  Expiration Rule: none
  Policy:    none
  CORS:      none
  ACL:       3587522: FULL_CONTROL

これは、接続が成功し、 `+ s3cmd +`がオブジェクトをスペースに転送できることを示します。

`+ put +`コマンドを使用して、ステップ2で作成したアーカイブをスペースに転送します。

s3cmd put  s3://

ファイル転送の出力が表示されます。

Outputupload: '' -> 's3://'  [1 of 1]
297 of 297   100% in    0s    25.28 kB/s  done

転送が完了すると、スペースのコンテンツを一覧表示して、ファイルがスペースに正常に転送されたことを確認します。

s3cmd ls s3:///

バックアップアーカイブファイルが表示されます。

Output2018-04-13 20:39       297   s3://

この時点で、MongoDBデータベース「+ test +」を正常にバックアップし、バックアップアーカイブをDigitalOcean Spaceに転送しました。

次のセクションでは、 `+ cron +`を使用してスケジュールできるように、Bashを使用して上記の手順をスクリプト化する方法について説明します。

手順4-バックアップスクリプトの作成とテスト

MongoDBデータベースを圧縮アーカイブファイルにバックアップし、このファイルをSpaceに転送したので、これらの手動手順を1つのBashスクリプトに結合できます。

バックアップスクリプトを作成

最初に、「+ mongodump 」コマンドと「 s3cmd put 」コマンドを組み合わせたスクリプトを作成し、いくつかのログ機能(「 echo +」を使用)のような追加機能を追加します。

任意のテキストエディターで空のファイルを開きます(ここでは「+ nano +」を使用します)。

nano backup_mongo.sh

次のコードスニペットを貼り付け、関連する値を更新して、独自のスペース、データベース、およびファイル名を参照するようにしてください。 ファイルを「+ backup_mongo.sh +」と呼びますが、このファイルに好きな名前を付けることができます。 このセクションの最後で完全なスクリプトを見つけることもできます。

このスクリプトを1つずつ見ていきましょう。

backup_mongo.sh

#!/bin/bash

set -e
...

ここで、 `#!/ bin / bash +`は、スクリプトをBashコードとして解釈するようシェルに指示します。 ` set -e +`は、スクリプトコマンドのいずれかが失敗した場合に即座に終了するようにインタープリターに指示します。

backup_mongo.sh

...

SPACE_NAME=
BACKUP_NAME=$(date +%y%m%d_%H%M%S).gz
DB=

...

このセクションでは、後で使用する3つの変数を設定します。

  • + SPACE_NAME +:バックアップファイルのアップロード先のDigitalOceanスペースの名前

  • + BACKUP_NAME +:バックアップアーカイブの名前。 ここでは、基本的な日時文字列に設定します。

  • + DB +:スクリプトがバックアップするMongoDBデータベースを指定します。 MongoDBインスタンス全体(すべてのデータベース)をバックアップする場合、この変数は使用されません。

backup_mongo.sh

...

date
echo "Backing up MongoDB database to DigitalOcean Space: $SPACE_NAME"

echo "Dumping MongoDB $DB database to compressed archive"
mongodump --db $DB --archive=$HOME/ --gzip

echo "Copying compressed archive to DigitalOcean Space: $SPACE_NAME"
s3cmd put $HOME/ s3://$SPACE_NAME/$BACKUP_NAME

...

次に、日付と時刻を出力して(ロギングの目的で)、上記でテストした `+ mongodump `コマンドを実行してバックアップを開始します。 バックアップアーカイブを再度「〜/ backup / +」に保存します。

次に、 `+ s3cmd `を使用して、このアーカイブを2つの ` SPACE_NAME `および ` BACKUP_NAME `変数で指定された場所にコピーします。 たとえば、スペース名が「 mongo-backup-demo 」で、現在の日時が「+2018/04/12 12:42:21」の場合、バックアップの名前は「+ 180412_124221.gz 」になり、 ` mongo-backup-demo +`スペースに保存されます。

backup_mongo.sh

...

echo "Cleaning up compressed archive"
rm $HOME/

echo 'Backup complete!'

ここで、バックアップアーカイブをスペースに正常にコピーしたため、 `+〜/ backup +`ディレクトリからバックアップアーカイブを削除します。最終出力は、バックアップが完了したことを示しています。

これらのすべてのコードスニペットを結合すると、完全なスクリプトは次のようになります。

backup_mongo.sh

#!/bin/bash

set -e

SPACE_NAME=
BACKUP_NAME=$(date +%y%m%d_%H%M%S).gz
DB=

date
echo "Backing up MongoDB database to DigitalOcean Space: $SPACE_NAME"

echo "Dumping MongoDB $DB database to compressed archive"
mongodump --db $DB --archive=$HOME/ --gzip

echo "Copying compressed archive to DigitalOcean Space: $SPACE_NAME"
s3cmd put $HOME/ s3://$SPACE_NAME/$BACKUP_NAME

echo "Cleaning up compressed archive"
rm $HOME/

echo 'Backup complete!'

完了したら、このファイルを必ず保存してください。

次に、このスクリプトをテストして、すべてのサブコマンドが機能することを検証します。

バックアップスクリプトのテスト

「+ backup_mongo.sh +」スクリプトをすばやく実行しましょう。

まず、スクリプトを実行可能にします。

chmod +x backup_mongo.sh

次に、スクリプトを実行します。

./backup_mongo.sh

次の出力が表示されます。

OutputMon Apr 16 22:20:26 UTC 2018
Backing up MongoDB database to DigitalOcean Space:
Dumping MongoDB test database to compressed archive
2018-04-16T22:20:26.664+0000    writing test.restaurants to archive '/home/'
2018-04-16T22:20:26.671+0000    done dumping test.restaurants (1 document)
Copying compressed archive to DigitalOcean Space:
upload: '/home/' -> 's3://'  [1 of 1]
297 of 297   100% in    0s     3.47 kB/s  done
Cleaning up compressed archive
Backup complete!

バックアップシェルスクリプトの作成に成功し、 `+ cron +`を使用したスケジューリングに進むことができます。

手順5-Cronを使用して毎日のバックアップをスケジュールする

バックアップスクリプトの夜間実行をスケジュールするには、Unixライクなオペレーティングシステムに組み込まれているジョブスケジューリングユーティリティである `+ cron +`を使用します。

最初に、バックアップスクリプトのログを保存するディレクトリを作成します。 次に、バックアップスクリプトをcrontab( `+ cron `の設定ファイル)に追加して、 ` cron `が夜間に実行されるようにスケジュールします。 ` cron +`は通常の頻度をサポートしているため、オプションで毎週または毎月のバックアップをスケジュールできます。

ロギングディレクトリを作成する

バックアップスクリプトのログファイルを保存するディレクトリを作成しましょう。 これらのログにより、バックアップスクリプトを定期的にチェックして、すべてが正常であることを確認し、一部のコマンドが失敗した場合にデバッグできます。

(ロギングに使用される慣例により) `+ / var / log `に ` mongo_backup +`サブディレクトリを作成します。

sudo mkdir /var/log/

次に、そのディレクトリをUnixユーザーが書き込みできるようにします。 この場合、ユーザーの名前は* sammy *ですが、サーバーのsudo権限を持つ関連する非ルートユーザー名を使用する必要があります。

sudo chown  /var/log/

Unixユーザー* sammy は、 `+ / var / log / mongo_backup +`に書き込むことができます。 cronjobは sammy *として実行されるため、ログファイルをこのディレクトリに書き込むことができます。

スケジュールされたcronjobを作成しましょう。

Cronjobを作成

cronjobを作成するには、「crontab」と呼ばれる、スケジュールされたジョブのリストを含むファイルを編集します。複数のcrontabがあり、ユーザーごとに1つと、システム全体のcrontabが `+ / etc / crontab +`にあります。 このチュートリアルでは、ユーザー* sammy *としてバックアップスクリプトを実行します。ユースケースに応じて、システム全体のcrontabから実行することを選択できます。

編集のためにcrontabを開きます。

crontab -e

次のメニューが表示され、好みのテキストエディターを選択できます。

Outputno crontab for sammy - using an empty one

Select an editor.  To change later, run 'select-editor'.
 1. /bin/ed
 2. /bin/nano        <---- easiest
 3. /usr/bin/vim.basic
 4. /usr/bin/vim.tiny

Choose 1-4 [2]: no crontab for sammy - using an empty one

お好みのエディターを選択してください。 「+ nano 」を選択するには、「 2+」と入力します。 次に、コメントアウトされたセクションの後に、ファイルに次の行を追加します。

クロンタブ-e

# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command

/home/ >>/var/log/ 2>&1

crontabの最後に必ず末尾の改行を含めるようにしてください。 ファイルを保存して閉じます。

次の出力が表示されます。

Outputno crontab for sammy - using an empty one
crontab: installing new crontab

これで、バックアップスクリプトは毎朝午前2時に実行されます。 + stdout +`と `+ stderr +(出力とエラーストリーム)の両方がパイプされ、先ほど作成したログディレクトリの `+ mongo_backup.log +`というログファイルに追加されます。

+0 2 * * * +(cron構文で午前2時に毎晩実行)を希望のバックアップ頻度と時間に変更できます。 cronとその構文の詳細については、https://www.digitalocean.com/community/tutorials/how-to-use-cron-to-automate-tasks-on-a-vps [使用方法]のチュートリアルを参照してください。 VPSでタスクを自動化するCron]。

バックアップが機能することを確認するために、このチュートリアルをクイックリカバリ演習で締めくくります。

手順6-テストリカバリを実行する

バックアップ戦略には、定期的にテストされる回復手順を含める必要があります。 ここでは、DigitalOceanスペースにアップロードした圧縮バックアップファイルからの復元を簡単にテストします。

最初に、スペースから「+ test_dump.gz +」をMongoDBドロップレットのホームディレクトリにダウンロードします。

s3cmd get s3://

次の出力が表示されます。

Outputdownload: 's3://' -> './'  [1 of 1]
297 of 297   100% in    0s  1305.79 B/s  done

このチュートリアルを新しいMongoDBインスタンスから始めた場合、 `+ test +`データベースのみが含まれていたことを思い出してください。このデータベースは、バックアップした唯一のデータベースでした。

デモンストレーションのために、このテストデータベースを削除して、クリーンリストアを実行できるようにします。 この最初の手順を実行しない場合、復元手順では元のドキュメントが検出されるため、スキップされます。 特定のユースケースでは、新しいドキュメントのみの復元が許容される場合がありますが、このチュートリアルの目的のために、空のデータベースへの完全な復元を明示的にテストしたいと思います。

`+ mongo +`シェルを使用してMongoDBインスタンスに接続します。

mongo

次に、「+ test」データベースを「+ use」し、MongoDBインスタンスから削除します。

use test
db.dropDatabase()

「+ test +」ドロップを確認する次の出力が表示されます。

Output{ "dropped" : "test", "ok" : 1 }

次に、 + mongo`シェルを終了し、 + mongorestore`コマンドを実行します。

mongorestore --gzip --archive= --db

ここでは、ソースバックアップファイルが圧縮され、「アーカイブファイル」形式であることを指定します(「+ mongodump 」を呼び出すときに「-archive 」および「-gzip 」フラグを使用したことを思い出してください)、 d ` test +`データベースに復元したい。

次の出力が表示されます。

Output2018-04-16T23:10:07.317+0000    creating intents for archive
2018-04-16T23:10:07.453+0000    reading metadata for test.restaurants from archive ''
2018-04-16T23:10:07.497+0000    restoring test.restaurants from archive ''
2018-04-16T23:10:07.541+0000    restoring indexes for collection test.restaurants from metadata
2018-04-16T23:10:07.541+0000    finished restoring test.restaurants (1 document)
2018-04-16T23:10:07.541+0000    done

これは、「+ test +」復元が成功したことを示します。

最後に、最初の「+ restaurants +」データが正常に復元されたことを確認しましょう。

MongoDBシェルを開き、 `+ restaurants +`コレクションをクエリします。

db.restaurants.find()

このチュートリアルの最初のステップで保存したオブジェクトが表示されます。

Output{ "_id" : ObjectId("5ace7614dbdf8137afe60025"), "name" : "Pizzeria Sammy" }

これで、このMongoDBバックアップ戦略の実装とテストが正常に完了しました。

結論

このチュートリアルでは、夜間の論理的なMongoDBバックアップの戦略を実装およびテストする方法を学びました。

このガイドは、さまざまな方法で拡張または変更できます。 いくつかの簡単な提案を次に示します。

  • リカバリポイントの目標(RPO)に応じて、データリカバリウィンドウに合わせて、推奨されるバックアップ頻度を増減することができます。

  • 別の便利な追加機能は、バックアップスクリプトサブコマンドが失敗した場合にトリガーされるアラート機能です(例: この機能は、定期的に監視されるアラート受信ボックスにメールを送信できます)。

  • このスクリプトは、スペースオブジェクトの削除を処理しません。 たとえば、6か月ほど前のバックアップを一掃することもできます。

  • 運用のユースケースに応じて、より複雑なhttps://en.wikipedia.org/wiki/Backup_rotation_scheme#Grandfather-father-son[backup rotation scheme]を実装することもできます。

`+ mongodump +`の手順では、ダンプされたすべてのデータをすばやく読み取る必要があるため、このバックアップ方法は中小規模のデータベース、特に特定のコレクションや結果セットなどの部分的なバックアップに最適です。 大規模な展開には、ファイルシステムレベルのバックアップをお勧めします。 ファイルシステムレベルのMongoDBバックアップの詳細については、https://www.digitalocean.com/community/tutorials/how-to-back-up-mongodb-using-droplet-snapshots [MongoDBのバックアップ方法]でこのチュートリアルを参照してください。ドロップレットスナップショット]。 MongoDBデータベースをバックアップするさまざまな方法の詳細については、https://docs.mongodb.com/v3.2/core/backups/ [MongoDBマニュアル]を参照してください。

このチュートリアルで紹介するソリューションは、バックアップデータの範囲をきめ細かく制御するための「+ mongodump 」と、費用対効果が高く耐久性のある長期データストレージ用のDigitalOcean Spacesを活用しています。 ` mongodump +`バックアップユーティリティの詳細については、MongoDBマニュアルのhttps://docs.mongodb.com/manual/reference/program/mongodump/ [リファレンスページ]を参照してください。 DigitalOcean Spacesの詳細については、https://www.digitalocean.com/community/tutorials/an-introduction-to-digitalocean-spaces [DigitalOcean Spacesの紹介]をご覧ください。