5

私の最初のサーバーでは、次のようになります。

root@prod ~ # du -hs /var/lib/mongodb/
909G    /var/lib/mongodb/

このデータベースを mongodump/mongorestore で移行した後、2 番目のサーバーで次のようになります。

root@prod ~ # du -hs /var/lib/mongodb/
30G /var/lib/mongodb/

数時間待った後、mongo はインデックス作成を終了しました。

root@prod ~ # du -hs /var/lib/mongodb/
54G /var/lib/mongodb/

データベースをテストしましたが、破損したデータや欠落したデータはありません。

移行前と移行後にサイズに大きな違いがあるのはなぜですか?

4

2 に答える 2

8

MongoDB は、実際にデータの削除やその他の原因でデータ サイズが減少した場合、ディスク領域を回復しません。オンライン ドキュメントには適切な説明があります。

データ ディレクトリ内のファイルがデータベース内のデータよりも大きいのはなぜですか?

データ ディレクトリ (デフォルト構成では /data/db ディレクトリ) 内のデータ ファイルは、データベースに挿入されたデータ セットよりも大きい場合があります。次の考えられる原因を検討してください。

事前に割り当てられたデータ ファイル。

データ ディレクトリでは、ファイル システムの断片化を防ぐために、MongoDB はデータ ファイルを特定のサイズに事前に割り当てます。MongoDB は、最初のデータ ファイルに .0、次の .1 などの名前を付けます。mongod が割り当てる最初のファイルは 64 メガバイト、次の 128 メガバイトというように、最大​​ 2 ギガバイトであり、その時点で後続のすべてのファイルは 2 ギガバイトになります。データ ファイルには、領域が割り当てられているがデータを保持していないファイルが含まれます。mongod は、90% が空の可能性がある 1 ギガバイトのデータ ファイルを割り当てる場合があります。ほとんどの大規模なデータベースでは、未使用の割り当て領域はデータベースに比べて小さくなります。

Unix ライクなシステムでは、mongod は追加のデータ ファイルを事前に割り当て、ディスク領域を 0 に初期化します。

preallocDataFiles を false に設定すると、事前割り当てを無効にできます。ただし、実稼働環境では preallocDataFiles を無効にしないでください。 preallocDataFiles は、テストの場合と、データベースを頻繁に削除する小さなデータ セットでのみ使用してください。

Linux システムでは、hdparm を使用して、割り当てにかかるコストを把握できます。

time hdparm --fallocate $((1024*1024)) テストファイル

オプログ。

この mongod がレプリカ セットのメンバーである場合、データ ディレクトリには oplog.rs ファイルが含まれます。これは、ローカル データベースで事前に割り当てられた制限付きコレクションです。デフォルトの割り当ては、64 ビット インストールでのディスク容量の約 5% です。詳細については、Oplog のサイジングを参照してください。ほとんどの場合、oplog のサイズを変更する必要はありません。ただし、そうする場合は、Oplog のサイズの変更を参照してください。

ジャーナル。

データ ディレクトリには、MongoDB がデータベースに適用する前に書き込み操作をディスクに保存するジャーナル ファイルが含まれます。ジャーナリングの仕組みを参照してください。

空のレコード。

MongoDB は、ドキュメントとコレクションを削除するときに、データ ファイル内の空のレコードのリストを維持します。MongoDB はこのスペースを再利用できますが、このスペースをオペレーティング システムに返すことはありません。

割り当てられたストレージをデフラグするには、compact を使用します。これは、割り当てられたスペースをデフラグします。ストレージの断片化を解消することで、MongoDB は割り当てられたスペースを効果的に使用できます。コンパクトを実行するには、最大 2 ギガバイトの余分なディスク領域が必要です。ディスク容量が非常に少ない場合は、compact を使用しないでください。

重要

Compact は、MongoDB データ ファイルから断片化を取り除くだけで、ディスク領域をオペレーティング システムに返しません。

削除された領域を再利用するには、repairDatabase を使用してデータベースを再構築します。これにより、ストレージの断片化が解消され、オペレーティング システムに領域が解放される場合があります。repairDatabase を実行するには、最大 2 ギガバイトの余分なディスク領域が必要です。ディスク容量が非常に少ない場合は、repairDatabase を使用しないでください。

http://docs.mongodb.org/manual/faq/storage/

彼らがあなたに言わないのは、ディスクスペースを復元/回復する他の2つの方法です-あなたが行ったようにmongodump/mongorestoreを使用するか、空のディスクで新しいメンバーをレプリカセットに追加して、データベースファイルを最初から書き込むようにします。

これを監視したい場合は、db.stats() コマンドを実行すると、データ、インデックス、ストレージ、およびファイル サイズに関する豊富なデータが返されます。

http://docs.mongodb.org/manual/reference/command/dbStats/

于 2014-07-29T18:30:45.277 に答える