Ubuntu 14.04でMongoDBデータベースをバックアップ、復元、および移行する方法
序章
MongoDBは、最も人気のあるNoSQLデータベースエンジンの1つです。 スケーラブルで、強力で、信頼性が高く、使いやすいことで有名です。 この記事では、MongoDBデータベースをバックアップ、復元、および移行する方法を説明します。
データベースのインポートとエクスポートは、他のソフトウェア製品と互換性のある、人間が読める形式のデータを処理することを意味します。 対照的に、バックアップと復元の操作では、MongoDB固有のバイナリデータが作成または使用されます。これにより、データの整合性と整合性だけでなく、特定のMongoDB属性も保持されます。 したがって、移行の場合、ソースシステムとターゲットシステムに互換性がある限り、通常はバックアップと復元を使用することをお勧めします。
前提条件
このチュートリアルを実行する前に、次の前提条件を満たしていることを確認してください。
- Ubuntu14.04ドロップレット
- root以外のsudoユーザー。 詳細については、 Ubuntu14.04を使用した初期サーバーセットアップを確認してください。
- 記事Ubuntu14.04にMongoDBをインストールする方法を使用してインストールおよび構成されたMongoDB。
- Ubuntu14.04でMongoDBデータベースをインポートおよびエクスポートする方法の手順を使用してインポートされたMongoDBデータベースの例
特に明記されていない限り、このチュートリアルでroot権限を必要とするすべてのコマンドは、sudo権限を持つroot以外のユーザーとして実行する必要があります。
基本を理解する
この記事を続ける前に、この問題に関する基本的な理解が必要です。 MySQLなどの一般的なリレーショナルデータベースシステムの経験がある場合は、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では、最初のドキュメント(データベース行)の挿入時に構造が再び自動的に作成されます。
第3に、MongoDBでは、この記事のタスクなどで大量のデータを読み取ったり挿入したりすると、リソースを大量に消費し、CPU、メモリ、およびディスク領域の多くを消費する可能性があります。 MongoDBが大規模なデータベースやビッグデータに頻繁に使用されることを考えると、これは重要なことです。 この問題の最も簡単な解決策は、夜間またはピーク時以外にエクスポートとバックアップを実行することです。
第4に、データベースのエクスポートまたはバックアッププロセス中に情報が変更されるビジーなMongoDBサーバーがある場合、情報の一貫性が問題になる可能性があります。 この問題に対する簡単な解決策はありませんが、この記事の最後に、レプリケーションについてさらに読むための推奨事項が表示されます。
インポートおよびエクスポート機能を使用してデータをバックアップおよび復元できますが、MongoDBデータベースの完全な整合性を確保するためのより良い方法があります。 データをバックアップするには、コマンドmongodump
を使用する必要があります。 復元するには、mongorestore
を使用します。 それらがどのように機能するか見てみましょう。
MongoDBデータベースのバックアップ
まず、MongoDBデータベースのバックアップについて説明します。
mongodump
の重要な引数は、--db
です。これは、バックアップするデータベースの名前を指定します。 データベース名を指定しない場合、mongodump
はすべてのデータベースをバックアップします。 2番目の重要な引数は--out
で、データがダンプされるディレクトリを指定します。 newdb
データベースをバックアップし、それを/var/backups/mongobackups
ディレクトリに保存する例を見てみましょう。 理想的には、/var/backups/mongobackups/01-20-16
(2016年1月20日)のような現在の日付のディレクトリに各バックアップがあります。 まず、次のコマンドを使用して、そのディレクトリ/var/backups/mongobackups
を作成しましょう。
- sudo mkdir /var/backups/mongobackups
次に、バックアップコマンドは次のようになります。
- sudo mongodump --db newdb --out /var/backups/mongobackups/`date +"%m-%d-%y"`
正常に実行されたバックアップには、次のような出力があります。
2016-01-20T10:11:57.685-0500 writing newdb.restaurants to /var/backups/mongobackups/01-20-16/newdb/restaurants.bson
2016-01-20T10:11:57.907-0500 writing newdb.restaurants metadata to /var/backups/mongobackups/01-20-16/newdb/restaurants.metadata.json
2016-01-20T10:11:57.911-0500 done dumping newdb.restaurants (25359 documents)
2016-01-20T10:11:57.911-0500 writing newdb.system.indexes to /var/backups/mongobackups/01-20-16/newdb/system.indexes.bson
上記のディレクトリパスでは、現在の日付を自動的に取得するdate +"%m-%d-%y"
を使用していることに注意してください。 これにより、ディレクトリ/var/backups/01-20-16/
内にバックアップを作成できます。 これは、バックアップを自動化するときに特に便利です。
この時点で、ディレクトリ/var/backups/mongobackups/01-20-16/newdb/
にnewdb
データベースの完全バックアップがあります。 このバックアップには、newdb
を適切に復元し、いわゆる「忠実度」を維持するためのすべてが含まれています。
原則として、毎日など、定期的にバックアップを作成する必要があります。できれば、サーバーの負荷が最も少ない時間帯にバックアップを作成することをお勧めします。 したがって、mongodump
コマンドをcronジョブとして設定して、定期的に実行されるようにすることができます。 毎日午前3時3分。 この開いたcrontabを実行するには、次のようなcronのエディターを使用します。
- sudo crontab -e
sudo crontab
を実行すると、rootユーザーのcronジョブが編集されることに注意してください。 ユーザーにcronを設定すると、特にsudoプロファイルでパスワードの確認が必要な場合に、cronが正しく実行されない可能性があるため、これをお勧めします。
crontabプロンプト内に、次のmongodump
コマンドを挿入します。
3 3 * * * mongodump --out /var/backups/mongobackups/`date +"%m-%d-%y"`
上記のコマンドでは、--db
引数を意図的に省略しています。これは、通常、すべてのデータベースをバックアップする必要があるためです。
MongoDBデータベースのサイズによっては、バックアップが多すぎるとすぐにディスク容量が不足する可能性があります。 そのため、古いバックアップを定期的にクリーンアップするか、圧縮することもお勧めします。 たとえば、7日より古いすべてのバックアップを削除するには、次のbashコマンドを使用できます。
- find /var/backups/mongobackups/ -mtime +7 -exec rm -rf {} \;
前のmongodump
コマンドと同様に、これもcronジョブとして追加できます。 次のバックアップを開始する直前に実行する必要があります。例: 午前3時1分。 この目的のために、crontabを再度開きます。
- sudo crontab -e
その後、次の行を挿入します。
3 1 * * * find /var/backups/mongobackups/ -mtime +7 -exec rm -rf {} \;
このステップのすべてのタスクを完了すると、MongoDBデータベースの優れたバックアップソリューションが保証されます。
MongoDBデータベースの復元と移行
以前のバックアップ(前の手順のバックアップなど)からMongoDBデータベースを復元することにより、すべてのインデックスとデータ型を含む、特定の時間に取得されたMongoDB情報の正確なコピーを取得できます。 これは、MongoDBデータベースを移行する場合に特に便利です。 MongoDBを復元するには、mongodump
によって生成されたバイナリバックアップで機能するコマンドmongorestore
を使用します。
newdb
データベースを使用して例を続け、以前に作成したバックアップからデータベースを復元する方法を見てみましょう。 引数として、最初に--db
引数を使用してデータベースの名前を指定します。 次に、--drop
を使用して、ターゲットデータベースが最初に削除され、バックアップがクリーンなデータベースに復元されるようにします。 最後の引数として、最後のバックアップ/var/backups/mongobackups/01-20-16/newdb/
のディレクトリを指定します。 したがって、コマンド全体は次のようになります(復元するバックアップの日付に置き換えます)。
- sudo mongorestore --db newdb --drop /var/backups/mongobackups/01-20-16/newdb/
正常に実行すると、次の出力が表示されます。
2016-01-20T10:44:47.876-0500 building a list of collections to restore from /var/backups/mongobackups/01-20-16/newdb/ dir
2016-01-20T10:44:47.908-0500 reading metadata file from /var/backups/mongobackups/01-20-16/newdb/restaurants.metadata.json
2016-01-20T10:44:47.909-0500 restoring newdb.restaurants from file /var/backups/mongobackups/01-20-16/newdb/restaurants.bson
2016-01-20T10:44:48.591-0500 restoring indexes for collection newdb.restaurants from metadata
2016-01-20T10:44:48.592-0500 finished restoring newdb.restaurants (25359 documents)
2016-01-20T10:44:48.592-0500 done
上記の場合、バックアップが作成されたのと同じサーバーにデータを復元しています。 データを別のサーバーに移行して同じ手法を使用する場合は、バックアップディレクトリ(この場合は/var/backups/mongobackups/01-20-16/newdb/
)を別のサーバーにコピーする必要があります。
結論
この記事では、データベースのバックアップ、復元、移行の観点から、MongoDBデータを管理するための基本事項を紹介しました。 スケーラブルなMongoDBデータベースをセットアップする方法については、MongoDBレプリケーションについて説明されています。
レプリケーションはスケーラビリティに役立つだけでなく、現在のトピックにとっても重要です。 レプリケーションを使用すると、障害からマスターサーバーを復元している間、スレーブMongoDBサーバーから中断されることなくMongoDBサービスを実行し続けることができます。 レプリケーションの一部は、操作ログ(oplog)でもあり、データを変更するすべての操作を記録します。 MySQLのバイナリログを使用するのと同じように、このログを使用して、最後のバックアップが行われた後にデータを復元できます。 バックアップは通常夜間に行われることを思い出してください。夕方にバックアップを復元する場合は、最後のバックアップ以降のすべての更新が失われます。