著者はCOVID-19救済基金を選択し、 Write forDOnationsプログラムの一環として寄付を受け取りました。

序章

MongoDB は、最も人気のあるNoSQLデータベースエンジンの1つです。 スケーラブルで、堅牢で、信頼性が高く、使いやすいことで有名です。 この記事では、サンプルのMongoDBデータベースをバックアップ、復元、および移行します。

データベースのインポートとエクスポートは、他のソフトウェア製品と互換性のある人間が読める形式でデータを処理することを意味します。 対照的に、MongoDBのバックアップおよび復元操作は、MongoDB固有のバイナリデータを作成または使用します。これにより、データの整合性と整合性だけでなく、特定のMongoDB属性も保持されます。 したがって、移行の場合、通常、ソースシステムとターゲットシステムに互換性がある限り、バックアップと復元を使用することをお勧めします。

前提条件

このチュートリアルを実行する前に、次の前提条件を満たしていることを確認してください。

特に明記されていない限り、このチュートリアルでroot権限を必要とするすべてのコマンドは、sudo権限を持つroot以外のユーザーとして実行する必要があります。

ステップ1—MongoDBでJSONとBSONを使用する

この記事を続ける前に、問題の基本的な理解が必要です。 Redisなどの他のNoSQLデータベースシステムの経験がある場合は、MongoDBを使用するときにいくつかの類似点が見つかる可能性があります。

MongoDBは、 JSON およびBSON(バイナリJSON)形式を使用して情報を保存します。 JSONは人間が読める形式であり、データのエクスポート、そして最終的にはインポートに最適です。 シンプルなテキストエディターなど、JSONをサポートする任意のツールを使用して、エクスポートされたデータをさらに管理できます。

jsonドキュメントの例は次のようになります。

JSON形式の例
{"address":[
    {"building":"1007", "street":"Park Ave"},
    {"building":"1008", "street":"New Ave"},
]}

JSONは操作に便利ですが、BSONで使用可能なすべてのデータ型をサポートしているわけではありません。 これは、JSONを使用すると、情報のいわゆる「忠実度の低下」が発生することを意味します。 バックアップと復元には、バイナリBSONを使用することをお勧めします。

次に、MongoDBデータベースを明示的に作成することを心配する必要はありません。 インポート用に指定したデータベースがまだ存在しない場合は、自動的に作成されます。 コレクション(データベーステーブル)構造の場合はさらに優れています。 他のデータベースエンジンとは対照的に、MongoDBでは、最初のドキュメント(データベース行)の挿入時に構造が再び自動的に作成されます。

第3に、MongoDBでは、この記事のタスクなど、大量のデータの読み取りまたは挿入はリソースを大量に消費し、CPU、メモリ、およびディスクスペースの多くを消費する可能性があります。 MongoDBが大規模なデータベースやビッグデータに頻繁に使用されることを考えると、これは重要です。 この問題の最も簡単な解決策は、夜間またはピーク時以外にエクスポートとバックアップを実行することです。

第4に、データベースのエクスポートまたはバックアッププロセス中に情報が変更されるビジーなMongoDBサーバーがある場合、情報の一貫性が問題になる可能性があります。 この問題の1つの可能な解決策は、レプリケーションです。これは、MongoDBトピックを進めるときに検討できます。

インポートおよびエクスポート機能を使用してデータをバックアップおよび復元できますが、MongoDBデータベースの完全な整合性を確保するためのより良い方法があります。 データをバックアップするには、コマンドmongodumpを使用する必要があります。 復元するには、mongorestoreを使用します。 それらがどのように機能するか見てみましょう。

ステップ2—mongodumpを使用してMongoDBデータベースをバックアップする

まず、MongoDBデータベースのバックアップについて説明します。

mongodumpの重要な引数は、--dbです。これは、バックアップするデータベースの名前を指定します。 データベース名を指定しない場合、mongodumpはすべてのデータベースをバックアップします。 2番目の重要な引数は--outで、データがダンプされるディレクトリを定義します。 たとえば、newdbデータベースをバックアップし、/var/backups/mongobackupsディレクトリに保存してみましょう。 理想的には、/var/backups/mongobackups/10-29-20のような現在の日付のディレクトリに各バックアップがあります。

まず、そのディレクトリ/var/backups/mongobackupsを作成します。

  1. sudo mkdir /var/backups/mongobackups

次に、mongodumpを実行します。

  1. sudo mongodump --db newdb --out /var/backups/mongobackups/`date +"%m-%d-%y"`

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

Output
2020-10-29T19:22:36.886+0000 writing newdb.restaurants to 2020-10-29T19:22:36.969+0000 done dumping newdb.restaurants (25359 documents)

上記のディレクトリパスでは、現在の日付を自動的に取得するdate +"%m-%d-%y"を使用していることに注意してください。 これにより、/var/backups/10-29-20/のようなディレクトリ内にバックアップを作成できます。 これは、バックアップを自動化するときに特に便利です。

この時点で、ディレクトリ/var/backups/mongobackups/10-29-20/newdb/newdbデータベースの完全バックアップがあります。 このバックアップには、newdbを適切に復元し、いわゆる「忠実度」を維持するためのすべてが含まれています。

原則として、定期的にバックアップを作成する必要があります。できれば、サーバーの負荷が最も少ないときにバックアップを作成してください。 したがって、mongodumpコマンドをcronジョブとして設定して、定期的に、たとえば毎日午前3時3分に実行されるようにすることができます。

この開いたcrontabを実行するには、cronのエディター:

  1. sudo crontab -e

sudo crontabを実行すると、rootユーザーのcronジョブが編集されることに注意してください。 ユーザーにcronを設定すると、特にsudoプロファイルでパスワードの確認が必要な場合に、cronが正しく実行されない可能性があるため、これをお勧めします。

crontabプロンプト内に、次のmongodumpコマンドを挿入します。

crontab
3 3 * * * mongodump --out /var/backups/mongobackups/`date +"%m-%d-%y"`

上記のコマンドでは、通常、すべてのデータベースをバックアップする必要があるため、意図的に--db引数を省略しています。

MongoDBデータベースのサイズによっては、バックアップが多すぎるとすぐにディスク容量が不足する可能性があります。 そのため、古いバックアップを定期的にクリーンアップするか、圧縮することもお勧めします。

たとえば、7日より古いすべてのバックアップを削除するには、次のbashコマンドを使用できます。

  1. find /var/backups/mongobackups/ -mtime +7 -exec rm -rf {} \;

前のmongodumpコマンドと同様に、これをcronジョブとして追加することもできます。 次のバックアップを開始する直前、たとえば午前3時1分に実行する必要があります。 この目的のために、crontabを再度開きます。

  1. sudo crontab -e

その後、次の行を挿入します。

crontab
1 3 * * * find /var/backups/mongobackups/ -mtime +7 -exec rm -rf {} \;

ファイルを保存して閉じます。

このステップのすべてのタスクを完了すると、MongoDBデータベースの適切なバックアップソリューションが保証されます。

ステップ3—mongorestoreを使用してMongoDBデータベースを復元および移行する

以前のバックアップからMongoDBデータベースを復元すると、すべてのインデックスとデータ型を含む、特定の時間に取得されたMongoDB情報の正確なコピーが得られます。 これは、MongoDBデータベースを移行する場合に特に便利です。 MongoDBを復元するには、コマンドmongorestoreを使用します。このコマンドは、mongodumpが生成するバイナリバックアップで機能します。

newdbデータベースを使用して例を続け、以前に作成したバックアップからデータベースを復元する方法を見てみましょう。 まず、--nsInclude引数を使用してデータベースの名前を指定します。 newdb.*を使用してすべてのコレクションを復元します。 restaurantsなどの単一のコレクションを復元するには、代わりにnewdb.restaurantsを使用してください。

次に、--dropを使用して、バックアップがクリーンなデータベースに復元されるように、ターゲットデータベースが最初に削除されていることを確認します。 最後の引数として、最後のバックアップのディレクトリを指定します。これは、/var/backups/mongobackups/10-29-20/newdb/のようになります。

タイムスタンプ付きのバックアップを作成したら、次のコマンドを使用して復元できます。

  1. sudo mongorestore --db newdb --drop /var/backups/mongobackups/10-29-20/newdb/

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

Output
2020-10-29T19:25:45.825+0000 the --db and --collection args should only be used when restoring from a BSON file. Other uses are deprecated and will not exist in the future; use --nsInclude instead 2020-10-29T19:25:45.826+0000 building a list of collections to restore from /var/backups/mongobackups/10-29-20/newdb dir 2020-10-29T19:25:45.829+0000 reading metadata for newdb.restaurants from /var/backups/mongobackups/10-29-20/newdb/restaurants.metadata.json 2020-10-29T19:25:45.834+0000 restoring newdb.restaurants from /var/backups/mongobackups/10-29-20/newdb/restaurants.bson 2020-10-29T19:25:46.130+0000 no indexes to restore 2020-10-29T19:25:46.130+0000 finished restoring newdb.restaurants (25359 documents) 2020-10-29T19:25:46.130+0000 done

上記の場合、バックアップを作成したのと同じサーバーにデータを復元しています。 データを別のサーバーに移行して同じ手法を使用する場合は、バックアップディレクトリ(この場合は/var/backups/mongobackups/10-29-20/newdb/)を別のサーバーにコピーする必要があります。

結論

これで、MongoDBデータベースのバックアップ、復元、および移行に関連するいくつかの重要なタスクを実行しました。 ここで説明するような信頼性の高いバックアップ戦略がなければ、本番環境のMongoDBサーバーを実行することはできません。