著者は、寄付のための書き込みプログラムの一環として、COVID-19救済基金に寄付を行うことを選択しました。
はじめに
MongoDBは、最も人気のあるNoSQLデータベースエンジンの1つです。スケーラブルで堅牢で信頼性が高く、使いやすいことで有名です。この記事では、サンプルのMongoDBデータベースをバックアップ、リストア、および移行します。
データベースのインポートとエクスポートは、他のソフトウェア製品と互換性のある人間が読める形式でデータを扱うことを意味します。対照的に、MongoDBのバックアップとリストア操作は、MongoDB固有のバイナリデータを作成または使用し、データの整合性と完全性だけでなく、特定のMongoDB属性も保持します。したがって、移行に関しては、ソースとターゲットのシステムが互換性がある限り、通常はバックアップとリストアを使用することが好ましいです。
前提条件
このチュートリアルを進める前に、次の前提条件をすべて満たしていることを確認してください:
- sudo非ルートユーザーとファイアウォールを備えたUbuntu 20.04サーバーが必要です。これは、Ubuntu 20.04初期サーバーセットアップガイドで設定できます。
- Ubuntu 20.04にMongoDBをインストールする方法チュートリアルを使用して、MongoDBをインストールおよび構成してください。
- MongoDBデータベースのインポートとエクスポート方法の手順に従って、例としてMongoDBデータベースをインポートしてください。
このチュートリアルで特に指定されていない限り、root権限が必要なすべてのコマンドは、sudo権限を持つ非ルートユーザーとして実行する必要があります。
ステップ1 — MongoDBでJSONとBSONを使用する
この記事をさらに読む前に、問題に関する基本的な理解が必要です。Redisなどの他のNoSQLデータベースシステムの経験がある場合、MongoDBを使用する際に類似点がいくつか見つかるかもしれません。
MongoDBは、情報を保存するためにJSONおよびBSON(バイナリJSON)形式を使用しています。JSONは人間が読みやすい形式であり、データのエクスポートおよび最終的にはインポートに適しています。JSONをサポートする任意のツール、単純なテキストエディタを含む、任意のツールでエクスポートされたデータをさらに管理できます。
次のような例の.json
ドキュメントがあります:
{"address":[
{"building":"1007", "street":"Park Ave"},
{"building":"1008", "street":"New Ave"},
]}
JSONは操作が簡単ですが、BSONで利用可能なすべてのデータ型をサポートしているわけではありません。これは、JSONを使用すると情報の「信頼性の低下」と呼ばれることがあることを意味します。バックアップと復元には、バイナリBSONを使用する方が良いでしょう。
第二に、MongoDBでは、明示的にMongoDBデータベースを作成する必要はありません。インポート用に指定したデータベースが存在しない場合、自動的に作成されます。さらに優れているのは、コレクション(データベースのテーブル)の構造です。MongoDBでは、他のデータベースエンジンとは異なり、構造は再度、最初のドキュメント(データベースの行)の挿入時に自動的に作成されます。
第三に、MongoDBでは、この記事のタスクのような大量のデータの読み取りや挿入は、CPU、メモリ、およびディスクスペースを多く消費する場合があります。これは、MongoDBが大規模なデータベースやビッグデータに頻繁に使用されることを考慮すると、重要です。この問題の最も簡単な解決策は、夜間または非ピーク時にエクスポートとバックアップを実行することです。
第四に、データの一貫性は、情報がデータベースのエクスポートやバックアッププロセス中に変更される忙しいMongoDBサーバーで問題になる可能性があります。この問題の1つの可能な解決策は、MongoDBのトピックを深く理解した際に考慮すべきレプリケーションです。
データのバックアップとリストアには、インポートとエクスポート機能を使用できますが、MongoDBデータベースの完全性を確保するためのより良い方法があります。データをバックアップするには、mongodump
コマンドを使用します。リストアには、mongorestore
を使用します。それでは、これらがどのように機能するか見てみましょう。
ステップ2 — mongodump
を使用してMongoDBデータベースをバックアップする
まず、MongoDBデータベースのバックアップについて説明します。
--db
であり、これはバックアップを取得したいデータベースの名前を指定します。データベース名を指定しない場合、--out
で、データをダンプするディレクトリを定義します。例えば、newdb
データベースをバックアップし、/var/backups/mongobackups
ディレクトリに保存します。理想的には、現在の日付のディレクトリごとにバックアップを取得します。例えば、/var/backups/mongobackups/10-29-20
。
まず、そのディレクトリ/var/backups/mongobackups
を作成します:
次に、mongodump
を実行します:
次のような出力が表示されます:
Output2020-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
を正しく復元し、その「忠実度」を保持するために必要なすべてが含まれています。
一般的なルールとして、サーバーの負荷が最も少ない時に定期的にバックアップを取るべきです。したがって、
これを行うには、cronのエディタであるcrontab
を開きます。
sudo crontab
を実行すると、rootユーザーのクーロンジョブを編集します。これはお勧めです。なぜなら、ユーザーのクーロンを設定すると、特にsudoプロファイルがパスワードの確認を必要とする場合、正しく実行されない可能性があるからです。
クーロンタブプロンプト内に、次のmongodump
コマンドを挿入します:
上記のコマンドでは、通常、すべてのデータベースをバックアップしたいため、わざと--db
引数を省略しています。また、特殊文字%
は、クーロン構文に準拠するためにエスケープする必要があります。
MongoDBデータベースのサイズに応じて、バックアップが多すぎてディスクスペースがすぐに不足する可能性があります。そのため、古いバックアップを定期的に削除するか、圧縮することもお勧めです。
たとえば、7日より古いすべてのバックアップを削除するには、次のbashコマンドを使用できます:
前述のmongodump
コマンドと同様に、これもクーロンジョブとして追加できます。次のバックアップを開始する直前に実行する必要があります。03:03 AMのジョブの場合、この削除は03:01 AMに実行されます。再びcrontabを開きます:
次の行を挿入します:
ファイルを保存して閉じます。
このステップでのすべてのタスクを完了すると、MongoDBデータベースの適切なバックアップソリューションが確立されます。次に、データベースを復元します。
ステップ3 — MongoDBデータベースの復元と移行にmongorestore
を使用する
以前のバックアップからMongoDBデータベースを復元すると、特定の時点で取得したMongoDB情報の完全なコピーが得られます。これにはすべてのインデックスとデータ型も含まれます。これはMongoDBデータベースを移行する際に特に便利です。MongoDBを復元するためには、mongodump
が生成するバイナリバックアップと共に動作するmongorestore
コマンドを使用します。
前に取得したバックアップからnewdb
データベースを復元する方法を見てみましょう。まず、--nsInclude
引数でデータベースの名前を指定します。newdb.*
を使用してすべてのコレクションを復元します。 restaurants
のような単一のコレクションを復元する場合は、代わりにnewdb.restaurants
を使用します。
次に、--drop
を使用して、対象のデータベースが最初に削除されるようにします。バックアップがクリーンなデータベースに復元されます。 最後の引数として、最後のバックアップのディレクトリを指定します。これは次のようになります:/var/backups/mongobackups/10-29-20/newdb/
。
タイムスタンプ付きのバックアップがある場合は、次のコマンドを使用して復元できます(日付を自分のものに合わせて更新します):
次のような出力が表示されます:
Output2020-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サーバーを実行するべきではありません。
これらの<DigitalOceanコミュニティ記事でMongoDBの構成と使用方法に関するさらなるチュートリアルを見つけることができます。また、MongoDBが提供する可能性に関する優れたリソースである公式の<MongoDBドキュメントもご参照ください。