ディスクスペースの再利用について
MongoDBインスタンスでデータを削除した場合、削除されたデータの使用していたストレージは「未使用領域」としてマークされます。その後、同じコレクションに新たなデータが書き込まれる際、通常はこの未使用領域が直接活用されます。ただし、この未使用領域は他のコレクションでは再利用できません。こうした未使用領域は「ディスク断片」と呼ばれ、断片が増加するとディスクの利用効率が低下します。
ディスクスペースの再利用方法には、compactコマンドの利用とデータファイルの再構築の2種類があります。
compactコマンド:コレクション単位で実行します。各コレクションごとに圧縮処理を行う必要があります。- データファイルの再構築:データベースインスタンス全体で実施します。より広範囲かつ包括的な処理となります。
compact
注意事項
- 事前にデータベース全体のバックアップを必ず取得してください。
- MongoDB 4.4未満のバージョンでは、
compactコマンドの実行によってコレクションが属するデータベースがロックされ、対象データベースの読み書き処理がすべてブロックされる可能性があります。ビジネスの閑散時間帯やバージョンアップ後にご実施ください。詳細はMongoDB公式ドキュメントをご参照ください。 compactコマンドによる断片領域の再利用処理時間は、コレクションのデータ量やシステム負荷、ディスク性能等に応じて異なります。実行中はCPU・メモリー使用率が一定程度上昇します。- MongoDB 4.4.9未満では、
compactコマンド実行中のノードは強制的にRECOVERING状態となります。長期化するとPRIMARYノードとのデータ同期不可となる場合があります。 - MongoDB 4.4.9~4.4.17では、
compactコマンド実行中のノードはSECONDARY状態を維持しますが、PRIMARYノードとのデータ同期は依然行えません。 - MongoDB 4.4.17以上では、SECONDARYノードで
compactコマンド実行中でもPRIMARYノードからのデータレプリケーションが維持されます。compactコマンドの運用は、可能な限りMongoDB 4.4.17以上での実行を推奨します。 - 下記条件では
compactコマンドを実行しても効果がほとんど得られません。詳細はソースコードをご参照ください。- 物理コレクションサイズが1MB未満
- ファイルの最初の80%分に未使用ストレージが20%未満しか存在しない場合、または最初の90%分に未使用ストレージが10%未満しか存在しない場合
compactコマンドによって必ずしも全ての未使用領域が再利用されるとは限りません。意図した量の領域を解放できない場合は、コマンドの再実行を検討してください。ただし短期間で頻繁に実行することは推奨されません。
推定再利用可能なディスク断片量の確認
-
対象コレクションが存在するデータベースへ切り替えます。
use database_namedatabase_nameは該当データベース名です。
-
コレクションの断片領域サイズを確認します。
db.collection_name.stats().wiredTiger["block-manager"]["file bytes available for reuse"]collection_nameは対象コレクション名です。
結果例:
1485426688この値が、推定される再利用可能なディスク断片量(単位:byte)です。