定義
updateZoneKeyRangeThe
updateZoneKeyRangeadministrative command can either create or remove the association between a range of shard key values and a zone.You can run
updateZoneKeyRangedatabase command and its helperssh.updateZoneKeyRange()andsh.addTagRange()on an unsharded collection or a non-existing collection.Tip
In
mongosh, this command can also be run through thesh.updateZoneKeyRange()helper method.Helper methods are convenient for
mongoshusers, but they may not return the same level of information as database commands. In cases where the convenience is not needed or the additional return fields are required, use the database command.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 |
値が既存のゾーンと一致しない場合、コマンドは失敗します。
|
動作
If no zone range matches the minimum and maximum bounds passed to updateZoneKeyRange, nothing is removed.
Only issue updateZoneKeyRange when connected to a mongos instance.
mongosh は 2 つのヘルパー メソッドを提供します。
sh.updateZoneKeyRange()、 シャードキー 値の範囲をゾーンに追加するため。sh.removeRangeFromZone()ゾーンから シャードキー 値の範囲を削除するため。
シャーディングされたコレクションの既存の範囲と下限と上限が重複するシャードキー値の範囲は作成できません。 たとえば、 1から10の既存の範囲がある場合、 5から20の新しい範囲は作成できません。新しい範囲は既存の範囲と重複するためです。
ゾーンには複数のデータ範囲を関連付けることができますが、範囲は最大で 1 つのゾーンに関連付けることができます。
When removing the association between a range and a zone, updateZoneKeyRange does not remove the zone. Use the removeShardFromZone command to remove the association between a zone and a shard.
シャーディングされたクラスター内のゾーンの詳細については、ゾーンのマニュアル ページを参照してください。
空のコレクションまたは存在しないコレクションの初期チャンク分散
空のコレクション、または存在しないコレクションでゾーンシャーディングを実行することを検討している場合は、コレクションをシャーディング前に、updateZoneKeyRange 40を使用してゾーンとゾーン範囲を作成します(..2 40以降)。バージョン..3 以降、空のコレクションまたは存在しないコレクションにゾーンとゾーン範囲を作成すると、 MongoDB はコレクションをシャーディングときに初期チャンクの作成と分散プロセスを最適化できます。この最適化されたプロセスにより、シャーディング後にゾーンを作成する よりもバランサーのオーバーヘッドが少なく、ゾーンシャーディングの迅速なセットアップがサポートされます。バランサーは、最適化された最初のチャンク作成と分散後に、すべてのチャンク管理を実行します。
最初のチャンク分散のゾーンとゾーン範囲の定義の例については、「空または存在しないコレクションのゾーンとゾーン範囲の事前定義 」を参照してください。
複合ハッシュされたシャードキーを使用した初期チャンク分散
MongoDB は、ハッシュされた複合インデックスでのコレクションのシャーディングをサポートしています。 MongoDB は、空のコレクションまたは存在しないコレクションを 複合ハッシュされたシャードキー でシャーディングするときに、最適化された初期チャンクの作成と分散を実行できます。
ハッシュされたフィールドがシャードキーのプレフィックス(つまり、シャードキーの最初のフィールド)である場合、MongoDB が初期チャンクの作成と分散を実行するには、次のすべてが当てはまる必要があります。
コレクションには単一のゾーン範囲があり、すべての下限フィールドには
MinKey、すべての上限フィールドにはMaxKeyが含まれます。sh.shardCollection()はpresplitHashedZones: trueオプションを指定します。
ハッシュされたフィールドがシャードキーのプレフィックスではない場合(つまり、シャードキーにハッシュされていない先頭フィールドが 1 つ以上ある場合)、MongoDB が初期チャンクの作成と分散を実行するには、次のすべてが当てはまる必要があります。
コレクションには、個別のプレフィックスフィールド値の組み合わせごとに 1 つのゾーン範囲があります(つまり ハッシュされたフィールドに先行するすべてのフィールド)。
各ゾーン範囲の下限について、ハッシュされたフィールドとそれ以降のすべてのフィールドに
MinKeyを指定します。各ゾーン範囲について、少なくとも 1 つの上限プレフィックス フィールドがその下限のカウンター と 異なる必要があります。
sh.shardCollection()はpresplitHashedZones: trueオプションを指定します。
複合ハッシュされたシャードキーでの初期チャンク分散のためのゾーンとゾーン範囲の定義のより詳細な例については、「空または存在しないコレクションのゾーンとゾーン範囲の事前定義 」を参照してください。
バランサー
After successfully running updateZoneKeyRange, there may be chunk migrations during the next balancer round.
ゾーンに範囲を追加した後、ゾーンによってカバーされる範囲を含む チャンク をそのゾーン内のシャードに移行するために、バランサーはまず を実行する必要があります。 バランシングが完了するまで、シャーディングされたクラスターに構成されたゾーンを考慮すると、いくつかのチャンクが間違ったシャードに存在する可能性があります。
範囲とゾーンの間の関連付けを削除すると、そのゾーン内のシャードで範囲によってカバーされるチャンクを維持する制約が削除されます。 次のバランサー ラウンド中に、バランサーは以前に ゾーンによってカバーされていたチャンクを移行する場合があります。
シャーディングされたクラスターで移行がどのように機能するかについて詳しくは、 シャーディングされたクラスター バランサーのドキュメントを参照してください。
限界
ゾーン範囲は、常に下限を含み、上限を含まない範囲です。
削除されたコレクション
コレクションを削除すると、それに関連付けられたゾーンやタグの範囲も削除されます。
以前のバージョンでは、MongoDB は削除されたコレクションのタグ関連付けを削除せず、後で同じ名前で新しいコレクションを作成すると、古いタグの関連付けが新しいコレクションに適用されます。
セキュリティ
認証 を使用して実行されているシャーディングされたクラスターの場合は、次のいずれかとして認証する必要があります。
クラスター リソースで
enableShardingを含む 権限 を持つユーザー。
The clusterAdmin or clusterManager built-in roles have the appropriate permissions for issuing updateZoneKeyRange. See the documentation page for Role-Based Access Control for more information.
例
シャーディングされたコレクション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 } )
While the range of { a : 0 } and { a : 10 } encompasses the existing range, it is not an exact match and therefore updateZoneKeyRange does not remove anything.
複合シャードキー
シャーディングされたコレクション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" } )