シャーディングされたコレクションのデフラグ
フラグメント化とは、シャーディングされたコレクションのデータが、不必要に多数の小さなチャンクに分割されることです。 これにより、そのコレクションで実行される 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 つのシャード間で共有されるコレクション データが、 たとえば、 |
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 を使用してシャードをモニタリングする( シャーディングされたクラスターの確認) を参照してください