Zones
項目一覧
シャーディングされたクラスターでは、 シャードキー に基づきシャーディングされたデータの ゾーン を作成できます。各ゾーンはクラスター内の 1 つまたは複数のシャードに関連付けることができ、 シャードは任意の数のゾーンに関連付けることができます。 MongoDB はバランスの取れたクラスター内で、ゾーンによってカバーされるチャンクをそのゾーンに関連付けられているシャードのみに移行します。
ゾーンを適用できる一般的な配置パターンは次のとおりです。
特定のシャードセットでデータの特定のサブセットを分離します。
最も関連するデータが、アプリケーション サーバーに地理的に最も近いシャードにあることを確認します。
シャード ハードウェアのハードウェアまたはパフォーマンスに基づいて、データをシャードにルーティングします。
次の図には、3 つのシャードと 2 つのゾーンを持つシャーディングされたクラスターが示されています。 A
ゾーンは、下限が1
で上限が10
の範囲を表します。 B
ゾーンは、下限が10
で上限が20
の範囲を表します。 シャードAlpha
とBeta
にはA
ゾーンがあります。 シャードBeta
にはB
ゾーンもある。 シャードCharlie
には関連付けられているゾーンがありません。 クラスターは定常状態で、どのゾーンにも違反するチャンクはありません。
動作と操作
Ranges
各ゾーンは、コレクションのシャードキー値の 1 つ以上の範囲をカバーします。 任意のゾーンがカバーする各範囲は、常に下限を含み、上限を含まない範囲です。 ゾーンは範囲を共有できません。また、重複する範囲を持つこともできません。
たとえば、 {"x": 1}
のシャードキーを考えてみましょう。 クラスターには次のゾーン範囲があります。
{ "x" : 5 } --> { "x" : 10 } // Zone A { "x" : 10} --> { "x" : 20 } // Zone B
シャードキー値が
7
のドキュメントはゾーン A にルーティングされます。シャードキー値が
10
のドキュメントはゾーン B にルーティングされます。
ハッシュされたシャードキーとゾーン範囲
シャードキーにハッシュされたフィールドが含まれているコレクションの場合、そのフィールドのゾーン範囲とデータ分布はハッシュされた値になります。 ゾーンには、ハッシュされたシャードキーの値が定義された範囲に該当するドキュメントが含まれます。 ハッシュされたフィールドのゾーン範囲では、ハッシュされていないフィールドのゾーン範囲と同じ予測可能なドキュメント ルーティング動作はありません。
たとえば、 {"x" : "hashed"}
のシャードキーを考えてみましょう。 次の範囲は、 5
から10
までのハッシュされた範囲を表します。
{ "x": NumberLong("4470791281878691347") } --> { "x": NumberLong("7766103514953448109") } // Zone A
シャードキー値が
1
のドキュメントは、1
のハッシュ値が定義された範囲に収まるため、ゾーン A にルーティングされます。シャードキー値が
15
のドキュメントは、15
のハッシュ値が定義された範囲に収まるため、ゾーン A にルーティングされます。シャードキー値が
8
のドキュメントは、8
のハッシュ値が定義された範囲に該当しないため、ゾーン A にルーティングされません。
mongosh
は、指定されたパラメータの変更後のハッシュ値を計算するためのconvertShardKeyToHashed()
を提供します。
ハッシュされたフィールドのゾーン範囲の有効な用途の 1 つは、コレクションのデータを 1 つのゾーン内のシャードに制限することです。 MinKey
を下限として、 MaxKey
を上限として使用し、可能な ハッシュされたシャードキー 値の全範囲をカバーするゾーン範囲を作成します。
範囲を定義するために、MongoDB はupdateZoneKeyRange
コマンドと、関連するヘルパー メソッドsh.updateZoneKeyRange()
とsh.addShardTag()
を提供します。
updateZoneKeyRange
データベースコマンドとそのヘルパーsh.updateZoneKeyRange()
およびsh.addTagRange()
は、シャーディングされていないコレクションまたは存在しないコレクションで実行できます。
コレクションを削除すると、それに関連付けられたゾーンやタグの範囲も削除されます。
初期チャンク分散
空のコレクションまたは存在しないコレクションをシャーディングする前にゾーンとゾーン範囲を定義することで、シャード コレクション操作は定義されたゾーン範囲のチャンクと、シャードキー値の全範囲をカバーする追加のチャンクを作成し、初期化を実行しますゾーン範囲に基づく チャンク分散 。 このように初期チャンクを作成して分散することで、ゾーン シャーディングの設定を迅速に行うことができます。 初期分散後、バランサーは今後のチャンク分散を管理します。
MongoDB は、ハッシュされた複合インデックスでのコレクションのシャーディングをサポートしています。 複合ハッシュされたシャードキーを使用して、空のコレクションまたは存在しないコレクションをシャーディングする場合、MongoDB が初期チャンクの作成と分散を実行するために追加の要件が適用されます。
例については、「 空または存在しないコレクションのゾーンとゾーン範囲の事前定義」を参照してください。
バランサー
バランサーは、シャーディングされたコレクションの チャンク をクラスター内のすべてのシャードに均等に分散しようとします。
移行用にマークされた各チャンクごとに、バランサーは設定されたゾーンの可能性のある各宛先シャードを確認します。 チャンク範囲がゾーンに該当する場合、バランサーはチャンクをそのゾーン内のシャードに移行します。 ゾーンに該当しないチャンクはクラスター内の任意のシャードに存在でき、通常に移行されます。
バランシング ラウンド中に、バランサーがいずれかのチャンクが特定のシャードの構成済みゾーンに違反していることを検出した場合、バランサーはそれらのチャンクを競合が存在しないシャードに移行します。
ゾーンをシャードに関連付け、シャーディングされたコレクションのためにゾーンをシャードキー範囲で構成した後、クラスターがシャーディングされたコレクションの影響データを移行するのに時間がかかる場合があります。 これは、チャンクの分割とクラスター内のデータの現在の分散状況によって異なります。 バランシングが完了すると、特定のゾーン内のドキュメントの読み取りと書込みは、そのゾーン内のシャードまたはシャードにのみルーティングされます。
構成が完了すると、バランサーは今後のバランシング ラウンド中に ゾーンを尊重します。
シャードキー
カバーされるゾーンに新しい範囲を定義する場合、シャードキーに含まれるフィールドを使用する必要があります。複合シャードキーを使用する場合、シャードキーのプレフィックスを範囲に含める必要があります。
たとえば、シャードキー{ a : 1, b : 1, c : 1 }
の場合、 b
の値をカバーする範囲を作成または更新するには、プレフィックスとしてa
を含める必要があります。 c
の値をカバーする範囲を作成または更新するには、プレフィックスとしてa
とb
を含める必要があります。
シャードキーに含まれていないフィールドを使用して範囲を作成することはできません。 たとえば、 ゾーン を使用して地理的場所に基づいてデータを分割する場合、シャードキーには最初のフィールドに地理データが含まれている必要があります。
コレクションにシャードキーを選択するときは、ゾーンの構成に使用するフィールドを検討してください。 シャードキーの選択に関する考慮事項については、「 シャードキーの選択 」を参照してください。
シャード ゾーンの境界
ゾーン範囲は、常に下限を含み、上限を含まない範囲です。