シャーディングされたクラスターでのチャンクの分裂
通常、MongoDB は、チャンクが最大 チャンク サイズ を超える場合、挿入後に チャンク を分割します。ただし、次の場合は、チャンクを手動で分割することをお勧めします。
既存のデータを使用してクラスターを配置した後など、クラスター内に大量のデータがあり、チャンクがほとんどない場合。
最初に単一のチャンクまたはシャードに存在する大量のデータを追加することが予想されます。 たとえば、
300
から400
の間のシャードキー値を持つ大量のデータを挿入する予定ですが、シャードキーのすべての値は250
から500
の間で、すべての値が単一のチャンクに含まれています。
注意
MongoDB では、連続したチャンク範囲を 1 つのチャンクに結合するためのmergeChunks
コマンドが提供されています。 詳細については、「 シャーディングされたクラスター内のチャンクのマージ」を参照してください。
バランサーは、移動が将来の挿入にメリットをもたらす場合、最近分割されたチャンクを新しいシャードにすぐに移行することがあります。 バランサーは、手動で分割されたチャンクとシステムによって自動的に分割されたチャンクを区別しません。
警告
シャーディングされたコレクションのデータを分割して新しいチャンクを作成する場合は注意してください。 既存のデータを持つコレクションをシャーディングすると、MongoDB はコレクションを均等に分散するためのチャンクを自動的に作成します。 シャーディングされたクラスターでデータを効果的に分割するには、チャンク内のドキュメント数と平均ドキュメント サイズを考慮して、均等なチャンク サイズを作成する必要があります。 チャンクのサイズが不均等な場合、シャードのチャンク数は同じ数でも、データサイズは大きく異なる場合があります。 サイズが異なるコレクションになるような分割は作成しないようにします。
クラスター全体の現在のチャンク範囲を判別するには、 sh.status()
を使用します。
チャンクを手動で分割するには、フィールドmiddle
またはfind
のいずれかを指定してsplit
コマンドを使用します。 mongosh
にはヘルパー メソッドsh.splitFind()
とsh.splitAt()
が提供されます。
splitFind()
は、このクエリに一致するとして返された最初のドキュメントを含むチャンクを、同じサイズの 2 つのチャンクに分割します。 完全な名前空間( シャーディングされたコレクションの「 <database>.<collection>
」をsplitFind()
に置き換えます。 splitFind()
のクエリではシャードキーを使用する必要はありませんが、ほとんどの場合、シャードキーを使用する方が合理的です。
例
次のコマンドは、 records
データベースのpeople
コレクション内にあるzipcode
フィールドの63109
の値を含むチャンクを分割します。
sh.splitFind( "records.people", { "zipcode": "63109" } )
splitAt()
を使用して、クエリされたドキュメントを新しいチャンクの下限として使用し、チャンクを 2 に分割します。
例
次のコマンドは、 records
データベースのpeople
コレクション内にあるzipcode
フィールドの63109
の値を含むチャンクを分割します。
sh.splitAt( "records.people", { "zipcode": "63109" } )
注意
splitAt()
では、チャンクは必ずしも同じサイズの 2 つに分割される必要はありません。 分裂は、ドキュメントがチャンク内のどこにあるかに関係なく、クエリに一致するドキュメントの場所で行われます。