Docs Menu
Docs Home
/
MongoDBマニュアル
/ /

シャーディングされたコレクションのデフラグ

項目一覧

  • 始める前に
  • タスク
  • 詳細
  • 詳細

フラグメント化とは、シャーディングされたコレクションのデータが、不必要に多数の小さなチャンクに分割されることです。 これにより、そのコレクションで実行される CRUD 操作の操作時間が増加する可能性があります。 デフラグでは、小さなチャンクが大きなチャンクにマージされ、チャンクの数が減り、CRUD 操作時間が短縮されます。

CRUD 操作時間が許容される場合は、コレクションをデフラグする必要はありません。

以下の表には、さまざまな MongoDB バージョンのデフラグ情報をまとめています。

MongoDB バージョン
説明
MongoDB 7.0以降
チャンクは自動的にマージされます。 MongoDB 7.0でコレクションをデフラグすることによるパフォーマンスの改善は、 MongoDB 6.0と比較して低くなります。 通常、 MongoDB 7.0以降のコレクションをデフラグする必要はありません。
MongoDB 6.0 、および7.0より前

バランサー がチャンクを移行するとき、またはノードの起動時に CRUD 操作の遅延が発生した場合にのみ、コレクションをデフラグします。

MongoDB 6.0 以降では、書込みトラフィックが多い場合でもフラグメント化は発生しません。 チャンクの移行により断片化が発生します。

MongoDB 6.0 より前
メタデータの更新中に CRUD 操作時間が長くなった場合にのみ、コレクションをデフラグします。 MongoDB のバージョンが6.0より前の場合、挿入またはアップデート操作が多いためにコレクション サイズが大幅に大きくなると、シャーディングされたコレクションがフラグメント化されます。

シャーディングされたコレクションをデフラグするには、 configureCollectionBalancingコマンドのdefragmentCollectionオプションを使用します。 オプションは MongoDB 6.0以降で使用可能です。

コレクションをデフラグする前に、これらの問題を検討してください。

  • デフラグにより、シャードで多くのメタデータが更新される可能性があります。 移行中に CRUD 操作にすでに通常よりも時間がかかる場合は、シャード バランシング ウィンドウの実行中にのみデフラグを実行して、システム ワークロードを軽減する必要があります。

  • デフラグがクラスターのワークロードと CRUD レイテンシに影響を与える場合は、 chunkDefragmentationThrottlingMSパラメーターを使用して影響を軽減できます。

  • マージされたチャンクでは配置履歴が失われます。

    • つまり、デフラグの実行中に、スナップショット読み取りと間接的にトランザクションが古いチャンク履歴エラーで失敗する可能性があります。

    • 配置履歴は、チャンクが保存されたシャードを記録します。 デフラグにより配置履歴が削除され、一部の操作が失敗する可能性がありますが、通常約 5 分後に解決されます。

  • デフラグは、シャード間でデータを移動することで、コレクション内のドキュメントのローカリティに影響します。 コレクションに頻繁にアクセスされるデータの範囲がある場合、コレクションをデフラグすると、頻繁にアクセスされるデータが 1 つのシャードに保存される可能性があります。 これにより、ワークロードが複数のシャードではなく 1 つのシャードに配置されるため、CRUD 操作のパフォーマンスが低下する可能性があります。

注意

通常、デフラグを手動で開始して停止するのではなく、バランサーの実行時間を指定するために、シャード バランシング ウィンドウを使用する必要があります。

このセクションでは、シャーディングされたコレクションのデフラグに関連する追加の詳細について説明します。

configureCollectionBalancingコマンドによって返されるdefragmentCollectionフィールドは、デフラグの実行中にのみtrueになります。

デフラグが自動的に終了するか、デフラグを手動で停止すると、返されたドキュメントからdefragmentCollectionフィールドが削除されます。

セカンダリ ノードの読み取りはデフラグ中に許可されますが、プライマリ ノードのメタデータの更新がセカンダリ ノードに複製されるまで、完了に時間がかかる場合があります。

MongoDB バランサーの詳細についてはシャーディングされたクラスターのバランサー を参照してください。

chunkSize の概要については、「シャーディングされたクラスターの範囲サイズの変更」をご覧ください。

以下の表では、さまざまな MongoDB バージョンで chunkSize がデフラグとバランサー操作に与える影響を説明しています。

MongoDB バージョン
説明
MongoDB 6.0 以降

2 つのシャード間で共有されるコレクション データが、chunkSize 設定の 3 倍以上に異なる場合、バランサーはシャード間でチャンクを移行します。

たとえば、chunkSize が 128 MB で、コレクション データが 384 MB 以上異なる場合、バランサーはチャンクをシャード間で移行します。

MongoDB 6.0 より前
チャンクが chunkSize より大きくなると、チャンクが分割されます。

チャンクが移動、分割、マージされると、コンフィギュレーションサーバーによってチャンク操作がコミットされた後にシャード メタデータが更新されます。チャンク操作に関係のないシャードも新しいメタデータで更新されます。

シャード メタデータの更新にかかる時間は、ルーティング テーブルのサイズに比例します。コレクションの CRUD 操作は、シャード メタデータが更新される間一時的にブロックされ、ルーティング テーブルが小さいほど CRUD 操作の遅延が短くなります。

コレクションをデフラグすると、チャンクの数が減り、チャンク メタデータの更新にかかる時間が短縮されます。

システム負荷を軽減するには、シャード バランシング ウィンドウを使用して特定の時間にのみバランサーを実行するように設定します。デフラグはバランシング ウィンドウの時間に実行されます。

chunkDefragmentationThrottlingMS パラメータを使用すると、バランサーによって実行される分割コマンドとマージ コマンドのレートを制限できます。

デフラグはいつでも開始および停止できます。

シャード ゾーンを設定することもできます。シャード ゾーンはシャードキーに基づいており、各ゾーンをクラスター内の 1 つ以上のシャードに関連付けることができます。

MongoDB 6.0 以降、シャーディングされたクラスターは、チャンクの移行が必要な場合のみチャンクを分割するようになりました。これにより、チャンク サイズが chunkSize を超える場合があります。サイズの大きいチャンクの場合はシャード上のチャンク数を減らし、シャード メタデータの更新にかかる時間を短縮することでパフォーマンスを向上させます。たとえば、chunkSize を 256 MB に設定しても、シャード上のチャンクが 1 TB と表示される場合があります。

chunkSize は以下に影響します。

  • 2 つのシャード間における 1 回のチャンク移行操作でバランサーが移行を試みるデータの最大量。

  • デフラグ中に移行されるデータの量。

  • シャーディングの概要については、「 シャーディング 」を参照してください

  • チャンクを使用したデータのパーティション分割(「 チャンクを使用したデータのパーティション分割」を参照してください)

  • コレクションバランシングを構成します。次を参照してください。 configureCollectionBalancing

  • バランサー コレクションのステータスを確認します。 balancerCollectionStatus

  • シャード バランシングWindowsの構成(「バランシング ウィンドウのスケジュール」を参照してください)

  • MongoDB Atlas を使用してシャードをモニタリングする( シャーディングされたクラスターの確認) を参照してください

戻る

Config Database