ディスクストレージは、スケーラブルなデータベースシステムにとって重要なリソースです。ディスクベースのデータベースのパフォーマンスは、ディスクでのデータの管理方法によって異なります。 MongoDBサーバーは、ストレージ管理を処理し、最初はすべてのドキュメントを順番に保存する、さまざまなプラグイン可能なストレージエンジンをサポートしています。データベースが大きくなり、複数の書き込み操作が実行されると、この連続したスペースは、間に空きスペースのチャンクを含む小さなブロックに断片化されます。通常の解決策はディスクサイズを増やすことですが、ディスクサイズを拡大することなく空き容量を取り戻すのに役立つ代替手段があります。注意すべき重要なことの1つは、MongoDBストレージ統計と、断片化を処理するためにデータベースを圧縮または修復する方法です。
あなたのデータベースは本当にどれくらいの大きさですか?
本番サーバーの空きディスク容量を常に監視する必要があります。また、クラウドプラットフォームでデータベースのサイズを支払う場合は、データベースのサイズを慎重に把握する必要があります。 MongoDBにはコマンドdb.stats()があります これにより、MongoDBインスタンスのストレージ統計に関する洞察を得ることができます。
>db.stats() { "db" : "test", "collections" : 5, "views" : 0, "objects" : 53829, "avgObjSize" : 43.555, "dataSize" : 2344556121, "storageSize" :3124416336, "numExtents" : 0, "indexes" : 7, "indexSize" : 8096876, "ok" : 1 }
dataSize
非圧縮データの合計サイズ(バイト単位) このデータベースに保持されています。
storageSize
ディスク容量の合計 データベース内のすべてのコレクションに割り当てられます。
db.stats()の応答 MongoDBエンジンのタイプによって異なります。上記の指標のバージョンに依存する説明は、MongoDBのドキュメントにあります。
storageSizeの大きな違いはなぜですか およびdataSize ?これは、前に説明したデータファイルの断片化が原因です。 MongoDBは、可能な限りフラグメント化されたデータ間の空き領域を再利用しようとし、オペレーティングシステムに解放しません。ただし、WiredTigerでは、圧縮が有効になっている場合、storageSizeはdataSizeよりも小さい場合があります。
コレクションから大量のデータが削除され、コレクションが削除されたスペースを新しいドキュメントに使用しない場合は、他のデータベースやコレクションで使用できるように、このスペースをオペレーティングシステムに戻す必要があります。 コンパクトを実行する必要があります または修理 ディスクスペースを最適化し、使用可能な空きスペースを取り戻すための操作。
コンパクトなMongoDB
MongoDBのコンパクトな操作により、コレクション内のすべてのドキュメントとインデックスがディスクスペースの連続したブロックに再書き込みされます。ただし、この操作は、コレクションが属するデータベースに対する他のすべての操作をブロックします。したがって、スタンドアロンサーバーの場合は、メンテナンスウィンドウ中に実行することをお勧めします。レプリカセットの場合は、シャードごとにローリング方式で実行する必要があります。つまり、最初にすべてのセカンダリを圧縮し、次にプライマリを圧縮して、データベースの可用性に影響を与えないようにします。コマンドの構文は次のとおりです。
db.runCommand({compact: collection-name })
1。 MMAPv1
- 圧縮操作は、データファイルとインデックスをデフラグします。ただし、オペレーティングシステムにスペースが解放されないことに注意してください。この操作は、MongoDBで再利用するためにデフラグしてより連続したスペースを作成するのに引き続き役立ちますが、ディスクの空き容量が非常に少ない場合は役に立ちません。
- 圧縮操作中に最大2GBの追加のディスク容量が必要です。
- 圧縮操作中はデータベースレベルのロックが保持されます。
2。 WiredTiger
WiredTigerエンジンはデフォルトで圧縮を提供し、MMAPv1よりも少ないディスクスペースを消費します。
- コンパクトなプロセスにより、空き領域がオペレーティングシステムに解放されます。
- コンパクトな操作を実行するには、最小限のディスク容量が必要です。
- WiredTigerは、データベースレベルのロックが必要なため、データベースに対するすべての操作もブロックします。
WiredTigerを実行している場合は、ストレージがディスクサイズの80%に達したときに、コンパクト操作を実行することをお勧めします。これを行うには、詳細ページから「コンパクト」操作をトリガーします。
MongoDBを修復する
MongoDB修復 操作は、ファイルシステムのfcskコマンドと同様に、データストレージ内のすべてのエラーと不整合を修復します。このコマンドは、予期しないシャットダウンまたはクラッシュ後のデータの整合性を保証します。ただし、サーバーでジャーナル処理が有効になっている場合、サーバーは再起動後にジャーナルを使用して自動的にクリーン状態になるため、修復の必要はありません。データベースが破損している場合は、データベースの修復 破損したデータは保存されないため、この操作をデータ回復に使用することはお勧めしません。 他の選択肢があるとき。
MMAPv1の場合、データベースの修復 データベースが破損しておらず、修復操作に必要な十分なスペースがあると思われる場合は、これがディスクスペースを再利用する唯一の方法です。コマンドの構文は次のとおりです。
db.runCommand({repairDatabase: 1})
- このコマンドは、データベース内のすべてのコレクションを圧縮し、すべてのインデックスを再作成します。
- このジョブには、現在のデータセットのサイズに2ギガバイトを加えたものに等しい空きディスク容量が必要です。
ScaleGridでは、 repairDatabaseを使用します MMAPv1の空き領域を再利用する操作 エンジンクラスター。