定義
updateZoneKeyRangeupdateZoneKeyRange管理コマンドは、シャードキー値の範囲とゾーンの間の関連付けを作成または削除できます。updateZoneKeyRangeデータベースコマンドとそのヘルパーsh.updateZoneKeyRange()とsh.addTagRange()は、シャーディングされていないコレクションまたは存在しないコレクションで実行できます。Tip
mongoshでは、このコマンドはsh.updateZoneKeyRange()ヘルパー メソッドを通じて実行することもできます。ヘルパー メソッドは
mongoshユーザーには便利ですが、データベースコマンドと同じレベルの情報は返されない可能性があります。 便宜上必要ない場合、または追加の戻りフィールドが必要な場合は、 データベースコマンドを使用します。updateZoneKeyRangeを実行するには、db.runCommand( { <command> } )メソッドを使用します。管理データベースで
addShardToZoneを実行する必要があります。
互換性
このコマンドは、次の環境でホストされている配置で使用できます。
MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
構文
このコマンドの構文は、次のとおりです。
db.adminCommand( { updateZoneKeyRange: <string>, min: <document>, max: <document>, zone: <string> | <null> } )
コマンドフィールド
このコマンドは、次のフィールドを使用します。
Parameter | タイプ | 説明 |
|---|---|---|
| string | 範囲に関連付けるコレクションの 名前空間 。 コマンドが成功するには、コレクションがシャーディングされている必要があります。 |
| ドキュメント | シャードキー値の範囲の包括的下限。 シャードキーの各フィールドを ハッシュされたシャーディングを使用するには、 |
| ドキュメント | シャードキー値の範囲の排他的上限。 シャードキーの各フィールドを ハッシュされたシャーディングを使用するには、 |
| string |
値が既存のゾーンと一致しない場合、コマンドは失敗します。
|
動作
updateZoneKeyRangeに渡される最小境界と最大境界に一致するゾーン範囲がない場合、削除されるものはありません。
updateZoneKeyRangeインスタンスに接続されている場合にのみmongos を発行します。
mongosh は 2 つのヘルパー メソッドを提供します。
sh.updateZoneKeyRange()、 シャードキー 値の範囲をゾーンに追加するため。sh.removeRangeFromZone()ゾーンから シャードキー 値の範囲を削除するため。
シャーディングされたコレクションの既存の範囲と下限と上限が重複するシャードキー値の範囲は作成できません。 たとえば、 1から10の既存の範囲がある場合、 5から20の新しい範囲は作成できません。新しい範囲は既存の範囲と重複するためです。
ゾーンには複数のデータ範囲を関連付けることができますが、範囲は最大で 1 つのゾーンに関連付けることができます。
範囲とゾーンの間の関連付けを削除しても、 updateZoneKeyRangeはゾーンを削除しません。 ゾーンとシャードの間の関連付けを削除するには、 removeShardFromZoneコマンドを使用します。
シャーディングされたクラスター内のゾーンの詳細については、ゾーンのマニュアル ページを参照してください。
空のコレクションまたは存在しないコレクションの初期チャンク分散
空のコレクションまたは存在しないコレクションで ゾーンシャーディングupdateZoneKeyRange を実行することを検討している場合は、コレクションをシャーディングする 前に 、 を使用してゾーンとゾーン範囲を作成します( 以降4.0.2 )。Starting in version 4.0.3, 空のコレクションまたは存在しないコレクションにゾーンとゾーン範囲を作成することで、MongoDB はコレクションをシャーディングするときに初期チャンクの作成と分散プロセスを最適化できます。 この最適化されたプロセスにより、シャーディング後にゾーンを作成するよりもバランサーのオーバーヘッドが少なく、ゾーンシャーディングの迅速なセットアップがサポートされます。 バランサーは、最適化された最初のチャンク作成と分散後に、すべてのチャンク管理を実行します。
最初のチャンク分散のゾーンとゾーン範囲の定義の例については、「空または存在しないコレクションのゾーンとゾーン範囲の事前定義 」を参照してください。
複合ハッシュされたシャードキーを使用した初期チャンク分散
MongoDB は、ハッシュされた複合インデックスでのコレクションのシャーディングをサポートしています。 MongoDB は、空のコレクションまたは存在しないコレクションを 複合ハッシュされたシャードキー でシャーディングするときに、最適化された初期チャンクの作成と分散を実行できます。
ハッシュされたフィールドがシャードキーのプレフィックス(つまり、シャードキーの最初のフィールド)である場合、MongoDB が初期チャンクの作成と分散を実行するには、次のすべてが当てはまる必要があります。
コレクションには単一のゾーン範囲があり、すべての下限フィールドには
MinKey、すべての上限フィールドにはMaxKeyが含まれます。sh.shardCollection()はpresplitHashedZones: trueオプションを指定します。
ハッシュされたフィールドがシャードキーのプレフィックスではない場合(つまり、シャードキーにハッシュされていない先頭フィールドが 1 つ以上ある場合)、MongoDB が初期チャンクの作成と分散を実行するには、次のすべてが当てはまる必要があります。
コレクションには、個別のプレフィックスフィールド値の組み合わせごとに 1 つのゾーン範囲があります(つまり ハッシュされたフィールドに先行するすべてのフィールド)。
各ゾーン範囲の下限について、ハッシュされたフィールドとそれ以降のすべてのフィールドに
MinKeyを指定します。各ゾーン範囲について、少なくとも 1 つの上限プレフィックス フィールドがその下限のカウンター と 異なる必要があります。
sh.shardCollection()はpresplitHashedZones: trueオプションを指定します。
複合ハッシュされたシャードキーでの初期チャンク分散のためのゾーンとゾーン範囲の定義のより詳細な例については、「空または存在しないコレクションのゾーンとゾーン範囲の事前定義 」を参照してください。
バランサー
updateZoneKeyRangeを正常に実行すると、次回のバランサー ラウンド中にチャンクの移行が行われる可能性があります。
ゾーンに範囲を追加した後、ゾーンによってカバーされる範囲を含む チャンク をそのゾーン内のシャードに移行するために、バランサーはまず を実行する必要があります。 バランシングが完了するまで、シャーディングされたクラスターに構成されたゾーンを考慮すると、いくつかのチャンクが間違ったシャードに存在する可能性があります。
範囲とゾーンの間の関連付けを削除すると、そのゾーン内のシャードで範囲によってカバーされるチャンクを維持する制約が削除されます。 次のバランサー ラウンド中に、バランサーは以前に ゾーンによってカバーされていたチャンクを移行する場合があります。
シャーディングされたクラスターで移行がどのように機能するかについて詳しくは、 シャーディングされたクラスター バランサーのドキュメントを参照してください。
限界
ゾーン範囲は、常に下限を含み、上限を含まない範囲です。
削除されたコレクション
コレクションを削除すると、それに関連付けられたゾーンやタグの範囲も削除されます。
以前のバージョンでは、MongoDB は削除されたコレクションのタグ関連付けを削除せず、後で同じ名前で新しいコレクションを作成すると、古いタグの関連付けが新しいコレクションに適用されます。
セキュリティ
認証 を使用して実行されているシャーディングされたクラスターの場合は、次のいずれかとして認証する必要があります。
configデータベース内のさまざまなコレクションに対して指定されたアクションを含む特権を持つユーザー:または、あるいは、
クラスター リソースで
enableShardingを含む 権限 を持つユーザー。
clusterAdminまたはclusterManagerの組み込みロールには、 updateZoneKeyRangeを発行するための適切な権限があります。 詳細については、ロールベースのアクセス制御に関するドキュメントページを参照してください。
例
シャーディングされたコレクションexampledb.collectionとシャードキーが{ a
: 1 }の場合、次の操作を実行すると、 alphaゾーンに下限が1で上限が10の範囲が作成されます。
admin = db.getSiblingDB("admin") admin.runCommand( { updateZoneKeyRange : "exampledb.collection", min : { a : 1 }, max : { a : 10 }, zone : "alpha" } )
次の操作では、 nullをzoneフィールドに渡すことで、以前に作成した範囲が削除されます。
admin = db.getSiblingDB("admin") admin.runCommand( { updateZoneKeyRange : "exampledb.collection", min : { a : 1 }, max : { a : 10 }, zone : null } )
minとmaxは、ターゲット範囲の境界と完全に一致する必要があります。 次の操作は、以前に作成した範囲を削除しようとしますが、 minの限界として{ a : 0 }を指定します。
admin = db.getSiblingDB("admin") admin.runCommand( { updateZoneKeyRange : "exampledb.collection", min : { a : 0 }, max : { a : 10 }, zone : null } )
{ a : 0 }と{ a : 10 }の範囲は既存の範囲を含みますが、完全一致ではないため、 updateZoneKeyRangeは何も削除しません。
複合シャードキー
シャーディングされたコレクションexampledb.collectionとシャードキー{ a
: 1, b : 1 }がある場合、次の操作は{ a: 1, b : 1 }の下限と{ a : 10, b : 10}の上限をカバーする範囲を作成し、それをalphaゾーンに関連付けます。
admin = db.getSiblingDB("admin") admin.runCommand( { updateZoneKeyRange : "exampledb.collection", min : { a : 1, b : 1 }, max : { a : 10, b : 10 }, zone : "alpha" } )