sh.updateZoneKeyRange()
定義
sh.updateZoneKeyRange(namespace, minimum, maximum, zone)
シャードキー値の範囲をゾーンに関連付けます。
updateZoneKeyRange
データベースコマンドとそのヘルパーsh.updateZoneKeyRange()
およびsh.addTagRange()
は、シャーディングされていないコレクションまたは存在しないコレクションで実行できます。重要
mongosh メソッド
このページでは、
mongosh
メソッドについて記載しています。ただし、データベースコマンドや Node.js などの言語固有のドライバーのドキュメントには該当しません。データベースコマンドについては、
updateZoneKeyRange
コマンドを参照してください。MongoDB API ドライバーについては、各言語の MongoDB ドライバー ドキュメントを参照してください。
sh.updateZoneKeyRange()
以下の引数を取ります。Parameterタイプ説明namespace
stringシャーディングされたコレクションの名前空間は
zone
に関連付けられています。操作を成功させるには、コレクションをシャーディングする必要があります。
minimum
ドキュメントシャードキー値の範囲の包括的下限。
シャードキーの各フィールドを
<fieldname> : <value>
の形式で指定します。 値は、シャードキーと同じ BSON type である必要があります。ハッシュされたシャーディングを使用するには、 フィールド値が タイプ
NumberLong
である必要があります。maximum
ドキュメントシャードキー値の範囲の排他的上限。
シャードキーの各フィールドを
<fieldname> : <value>
の形式で指定します。 値は、シャードキーと同じ BSON type である必要があります。ハッシュされたシャーディングを使用するには、 フィールド値が タイプ
NumberLong
である必要があります。zone
stringminimum
とmaximum
で区切られたシャードキー値の範囲に関連付けるゾーンの名前。sh.updateZoneKeyRange()
インスタンスに接続されている場合にのみmongos
を発行します。
動作
シャーディングされたコレクションの既存の範囲と下限と上限が重複するシャードキー値の範囲は作成できません。 たとえば、 1
から10
の既存の範囲がある場合、 5
から20
の新しい範囲は作成できません。新しい範囲は既存の範囲と重複するためです。
ゾーンには複数のデータ範囲を関連付けることができますが、範囲は最大で 1 つのゾーンに関連付けることができます。
シャーディングされたクラスター内のゾーンの詳細については、ゾーンのマニュアル ページを参照してください。
空のコレクションまたは存在しないコレクションの初期チャンク分散
空のコレクションまたは存在しないコレクションで ゾーンシャーディングsh.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オプションを指定します。
複合ハッシュされたシャードキーでの初期チャンク分散のためのゾーンとゾーン範囲の定義のより詳細な例については、「空または存在しないコレクションのゾーンとゾーン範囲の事前定義 」を参照してください。
バランサー
範囲をゾーンに関連付けた後、ゾーンによってカバーされる範囲がカバーされる チャンク をそのゾーン内のシャードに移行するために、まずバランサーは を実行する必要があります。 バランシングが完了するまで、シャーディングされたクラスターに構成されたゾーンを考慮すると、いくつかのチャンクが間違ったシャードに存在する可能性があります。 詳細については、「バランサー」を参照してください。
シャーディングされたクラスターで移行がどのように機能するかについて詳しくは、 シャーディングされたクラスター バランサーのマニュアル ページを参照してください。
限界
ゾーン範囲は、常に下限を含み、上限を含まない範囲です。
削除されたコレクション
コレクションを削除すると、それに関連付けられたゾーンやタグの範囲も削除されます。
以前のバージョンでは、MongoDB は削除されたコレクションのタグ関連付けを削除せず、後で同じ名前で新しいコレクションを作成すると、古いタグの関連付けが新しいコレクションに適用されます。
セキュリティ
認証 を使用して実行されているシャーディングされたクラスターの場合は、次のいずれかとして認証する必要があります。
config
データベース内のさまざまなコレクションに対して指定されたアクションを含む特権を持つユーザー:または、あるいは、
クラスター リソースで
enableSharding
を含む 権限 を持つユーザー。
clusterAdmin
またはclusterManager
の組み込みロールには、 sh.updateZoneKeyRange()
を発行するための適切な権限があります。 詳細については、ロールベースのアクセス制御に関するドキュメントページを参照してください。
例
シャーディングされたコレクションexampledb.collection
とシャードキーが{ a
: 1 }
の場合、次の操作を実行すると、 alpha
ゾーンに下限が1
で上限が10
の範囲が作成されます。
sh.updateZoneKeyRange( "exampledb.collection", { a : 1 }, { a : 10 }, "alpha" )
次の操作では、 null
をzone
フィールドに渡すことで、以前に作成した範囲が削除されます。
sh.updateZoneKeyRange( "exampledb.collection", { a : 1 }, { a : 10 }, null )
min
とmax
は、ターゲット範囲の境界と完全に一致する必要があります。 次の操作は、以前に作成した範囲を削除しようとしますが、 min
の限界として{ a : 0 }
を指定します。
sh.updateZoneKeyRange( "exampledb.collection", { a : 0 }, { a : 10 }, null )
{ a : 0 }
と{ a : 10 }
の範囲は既存の範囲を含みますが、完全一致ではないため、 updateZoneKeyRange
は何も削除しません。
複合シャードキー
シャーディングされたコレクションexampledb.collection
とシャードキー{ a
: 1, b : 1 }
がある場合、次の操作は{ a: 1, b : 1 }
の下限と{ a : 10, b : 10}
の上限をカバーする範囲を作成し、それをalpha
ゾーンに関連付けます。
sh.updateZoneKeyRange( "exampledb.collection", { a : 1, b : 1 }, { a : 10, b : 10 }, "alpha" )
空、または存在しないコレクションのゾーンとゾーン範囲の事前定義
空のコレクションまたは存在しないコレクションにゾーンとゾーン範囲を作成する場合、MongoDB はコレクションをシャーディングするときに最初のチャンク作成と分散プロセスを最適化する場合があります。 この最適化されたプロセスにより、シャーディング後にゾーンを作成するよりもバランサーのオーバーヘッドが少なく、ゾーンシャーディングの迅速なセットアップがサポートされます。 バランサーは、最適化された最初のチャンク作成と分散後に、すべてのチャンク管理を実行します。 詳細については、「複合ハッシュされたシャードキーを使用した初期チャンク分散」を参照してください。
以下のセクションには、3 つの異なるシャードキーのタイプの例が含まれています。
3 つの異なるシャードキー タイプのゾーンまたはゾーン範囲を事前に定義する次の例を検討してみましょう。
単一または複合シャードキー
注意
この例は、ハッシュされたフィールドがない単一フィールドまたは複合シャードキーにのみ適用されます。
たとえば、 { "zip" : 1 }
や{ "zip" : 1, "account" : 1}
ゾーンの作成
ゾーンを作成するには、 sh.addShardToZone()
を使用します。
sh.addShardToZone("shardA", "DC1") sh.addShardToZone("shardB", "DC2")
ゾーン範囲の作成
sh.updateZoneKeyRange()
を使用して、 exampledb
データベースに空のcontacts
コレクションの範囲を作成します。
sh.updateZoneKeyRange( "exampledb.contacts", { zip: 10001 }, { zip: 10090 }, "DC1" ); sh.updateZoneKeyRange( "exampledb.contacts", { zip: 90001 }, { zip: 96054 }, "DC2" );
コレクションのシャード
注意
コレクションが存在しない場合は、シャーディング操作によってコレクションが作成されます。
コレクションが空で、シャードキーをサポートするインデックスが存在しない場合は、シャーディング操作によってインデックスが作成されます。
sh.shardCollection()
を使用してコレクションcontacts
をシャーディングします。
sh.shardCollection("exampledb.contacts", { zip: 1 } );
作成されたチャンクとディストリビューションの確認
作成されたチャンクとディストリビューションを確認するには、 sh.status()
操作を実行します。
sh.status()
このメソッドは以下を返します。
--- Sharding Status --- sharding version: { "_id" : 1, "minCompatibleVersion" : 5, "currentVersion" : 6, "clusterId" : ObjectId("5b80c06d35a961fd0ae1986d") } shards: { "_id" : "shardA", "host" : "shardA/mongodb0.example.net:27018,mongodb1.example.net:27018,mongodb2.example.net:27018", "state" : 1, "tags" : [ "DC1" ] } { "_id" : "shardB", "host" : "shardB/mongodb3.example.net:27018,mongodb4.example.net:27018,mongodb5.example.net:27018", "state" : 1, "tags" : [ "DC2" ] } active mongoses: "4.2.0" : 2 autosplit: Currently enabled: yes balancer: Currently enabled: yes Currently running: no Failed balancer rounds in last 5 attempts: 0 Migration Results for the last 24 hours: No recent migrations databases: { "_id" : "config", "primary" : "config", "partitioned" : true } { "_id" : "exampledb", "primary" : "shardA", "partitioned" : true, "version" : { "uuid" : UUID("6c351bcf-acd2-4fd9-82d8-9f6bd7321558"), "lastMod" : 1 } } exampledb.contacts shard key: { "zip" : 1 } unique: false balancing: true chunks: shardA 3 shardB 2 { "zip" : { "$minKey" : 1 } } -->> { "zip" : 10001 } on : shardA Timestamp(1, 0) { "zip" : 10001 } -->> { "zip" : 10090 } on : shardA Timestamp(1, 1) { "zip" : 10090 } -->> { "zip" : 90001 } on : shardB Timestamp(1, 2) { "zip" : 90001 } -->> { "zip" : 96054 } on : shardB Timestamp(1, 3) { "zip" : 96054 } -->> { "zip" : { "$maxKey" : 1 } } on : shardA Timestamp(1, 4) tag: DC1 { "zip" : 10001 } -->> { "zip" : 10090 } tag: DC2 { "zip" : 90001 } -->> { "zip" : 96054 }
コレクション用に、シャーディング操作により、シャード A とシャード B にわたって5チャンク(ゾーン範囲に対応する 2 つのチャンクと他のすべての値をカバーする他の 3 つのチャンク)が作成されました。
ハッシュされたプレフィックスを持つ複合ハッシュされたシャードキー
注意
この例は、ハッシュされたフィールドがシャードキーのプレフィックスである(つまり、シャードキーの最初のフィールドがハッシュされている)ハッシュされた複合シャードキーにのみ適用されます。
たとえば、 { "_id" : "hashed", "facility" : 1 }
MongoDB は、ハッシュされた複合インデックスでのコレクションのシャーディングをサポートしています。 ハッシュされた複合シャードキーでシャーディングする場合、MongoDB は、定義されたゾーン範囲が 追加の要件を 満たしている 場合にのみ 、空または存在しないコレクションに対して最適化された初期チャンクの作成と分散を実行できます。
2 つの工場のいずれかの分析を保存する空のコレクションexamples.metrics
について考えてみましょう。 計画されているシャードキーは{ "_id" : "hashed", "facility" : 1}
で、ハッシュされたフィールドは シャードキープレフィックスです。
ゾーンの作成
予定されているシャードキーは{ "_id" : "hashed", "facility" : 1 }
です。 ハッシュされたフィールドはプレフィックス(シャードキーの最初のフィールド)であるため、 を使用して 単一の ゾーンを作成します。sh.addShardToZone()
sh.addShardToZone("shardA", "FacilityAlpha") sh.addShardToZone("shardB", "FacilityAlpha")
ゾーン範囲の作成
ハッシュされたプレフィックスを持つ複合ハッシュされたシャードキーでの最初のチャンク分散には、すべての下限フィールドにMinKey
が含まれ、すべての上限フィールドにMaxKey
が含まれる単一のゾーン範囲が必要です。
単一範囲を作成するには、 sh.updateZoneKeyRange()
を使用します。
sh.updateZoneKeyRange( "examples.metrics", { "_id" : MinKey, "facility" : MinKey }, { "_id" : MaxKey, "facility" : MaxKey }, "FacilityAlpha" );
コレクションのシャード
注意
コレクションが存在しない場合は、シャーディング操作によってコレクションが作成されます。
コレクションが空で、シャードキーをサポートするインデックスが存在しない場合は、シャーディング操作によってインデックスが作成されます。
sh.shardCollection()
presplitHashedZones: true とともに使用してコレクションをシャーディングし、初期チャンクの作成と分散を実行します。
sh.shardCollection( "examples.metrics", { "_id" : "hashed", "facility" : 1 }, false, { presplitHashedZones: true } )
作成されたチャンクとディストリビューションの確認
作成されたチャンクとディストリビューションを確認するには、 sh.status()
操作を実行します。
sh.status()
出力は、次のようになります(読みやすくするために内容は省略されています )。
--- Sharding Status --- databases: { "_id" : "config", "primary" : "config", "partitioned" : true } { "_id" : "examples", "primary" : "shardA", "partitioned" : true, "version" : { "uuid" : UUID("245f8abf-a363-48b0-8208-2a5b577bbb4e"), "lastMod" : 1 } } examples.metrics shard key: { "_id" : "hashed", "facility" : 1 } unique: false balancing: true chunks: shardA 2 shardB 2 { "_id" : { "$minKey" : 1 }, "facility" : { "$minKey" : 1 } } -->> { "_id" : NumberLong("-4611686018427387902"), "facility" : { "$minKey" : 1 } } on : shardA Timestamp(1, 0) { "_id" : NumberLong("-4611686018427387902"), "facility" : { "$minKey" : 1 } } -->> { "_id" : NumberLong(0), "facility" : { "$minKey" : 1 } } on : shardA Timestamp(1, 1) { "_id" : NumberLong(0), "facility" : { "$minKey" : 1 } } -->> { "_id" : NumberLong("4611686018427387902"), "facility" : { "$minKey" : 1 } } on : shardB Timestamp(1, 2) { "_id" : NumberLong("4611686018427387902"), "facility" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 }, "facility" : { "$maxKey" : 1 } } on : shardB Timestamp(1, 3) tag: FacilityAlpha { "_id" : { "$minKey" : 1 }, "facility" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 }, "facility" : { "$maxKey" : 1 } }
シャーディング操作により合計で4チャンクが生成されました。 2 つのチャンクは、絶対下限と上限に対応します。 FacilityAlpha
に対応するshardA
とshardB
に 1 つのゾーンが作成されました。 ゾーンは ハッシュされたフィールドを使用して2チャンクにさらに細分化されました。
非プレフィックス ハッシュされたフィールドを持つ複合ハッシュされたシャードキー
注意
この例は、ハッシュされたフィールドがシャードキーのプレフィックスではない(つまり、シャードキーの最初のフィールドがハッシュされていない)ハッシュされた複合シャードキーにのみ適用されます。
たとえば、 { "facility" : 1, "_id" : "hashed" }
MongoDB は、ハッシュされた複合インデックスでのコレクションのシャーディングをサポートしています。 ハッシュされた複合シャードキーでシャーディングする場合、MongoDB は、定義されたゾーン範囲が 追加の要件を 満たしている 場合にのみ 、空または存在しないコレクションに対して最適化された初期チャンクの作成と分散を実行できます。
2 つの工場のいずれかの分析を保存する空のコレクションexamples.metrics
について考えてみましょう。 計画されているシャードキーは{ "facility" : 1, "_id" : "hashed" }
で、ハッシュされたフィールドはシャードキー プレフィックスではありません。
facility
フィールドには、施設の名前:"FacilityAlpha"
または"FacilityBaker"
が保存されます。 コレクションでは、各施設のデータを特定のシャードに分離するために、facility
のゾーン範囲が必要です。_id
フィールドはfacility
フィールドの低濃度を調整します。 ハッシュすることで、_id
フィールドの単調に増加する性質が埋め込まれます。
ゾーンの作成
ゾーンを作成するには、 sh.addShardToZone()
コマンドを使用します。
sh.addShardToZone("shardA", "FacilityAlpha") sh.addShardToZone("shardB", "FacilityBaker")
ゾーン範囲の作成
予定されているシャードキーは{"facility" : 1, "_id" : "hashed"}
です。 facility
フィールドには、 FacilityAlpha
とFacilityBaker
の 2 つの値があります。
ハッシュされたフィールドがプレフィックスではない複合ハッシュされたシャードキーによる最初のチャンク分散には、異なるプレフィックス フィールド値の組み合わせごとに 1 つのゾーン範囲が必要です(つまり ハッシュされたフィールドに先行するすべてのフィールド)。 facility
には 2 つの異なるプレフィックス値があるため、コレクションにはそれらの値をカバーする 2 つのゾーン範囲が必要です。
下限値は、プレフィックス以外のフィールドすべてに
MinKey
を指定します。上限範囲には、下限値とは異なるプレフィックス フィールドが少なくとも 1 つあります。
sh.updateZoneKeyRange()
を使用して"facility": "FacilityAlpha"
の範囲を作成します。
sh.updateZoneKeyRange( "examples.metrics", { "facility": "FacilityAlpha", "_id" : MinKey }, { "facility": "FacilityBaker", "_id" : MinKey }, "FacilityAlpha" );
ゾーン範囲の上限は排他的であるため、この範囲は個別のシャードキー プレフィックス値
"facilty" : "FacilityAlpha"
と可能な値が_id
であるドキュメントのみをカバーします。
sh.updateZoneKeyRange()
を使用して"facility": "FacilityBaker"
の範囲を作成します。
sh.updateZoneKeyRange( "examples.metrics", { "facility": "FacilityBaker", "_id" : MinKey }, { "facility": MaxKey, "_id" : MinKey }, "FacilityBaker" );
この範囲の上限は技術的には
facility
の他の値を取得できますが、最初のチャンク分散ロジックはfacility
に個別の値が存在しないことを前提としています。 コレクションには、facility
がFacilityAlpha
またはFacilityBaker
であるドキュメントのみが含まれるため、この範囲は個別のシャードキー プレフィックス値"facility" : "FacilityBaker"
と可能な値が_id
であるドキュメントのみをカバーします。
コレクションのシャード
注意
コレクションが存在しない場合は、シャーディング操作によってコレクションが作成されます。
コレクションが空で、シャードキーをサポートするインデックスが存在しない場合は、シャーディング操作によってインデックスが作成されます。
sh.shardCollection()
presplitHashedZones: true とともに使用してコレクションをシャーディングし、初期チャンクの作成と分散を実行します。
sh.shardCollection( "examples.metrics", { "facility" : 1, "_id" : "hashed"}, false, { presplitHashedZones: true } )
作成されたチャンクとディストリビューションの確認
作成されたチャンクとディストリビューションを確認するには、 sh.status()
操作を実行します。
sh.status()
出力は、次のようになります(読みやすくするために内容は省略されています )。
--- Sharding Status --- databases: { "_id" : "config", "primary" : "config", "partitioned" : true } { "_id" : "examples", "primary" : "shardA", "partitioned" : true, "version" : { "uuid" : UUID("6c351bcf-acd2-4fd9-82d8-9f6bd7321558"), "lastMod" : 1 } } examples.metrics shard key: { "facility" : 1, "_id" : "hashed" } unique: false balancing: true chunks: shardA 3 shardB 3 { "facility" : { "$minKey" : 1 }, "_id" : { "$minKey" : 1 } } -->> { "facility" : "FacilityAlpha", "_id" : { "$minKey" : 1 } } on : shard1 Timestamp(1, 0) { "facility" : "FacilityAlpha", "_id" : { "$minKey" : 1 } } -->> { "facility" : "FacilityAlpha", "_id" : NumberLong(0) } on : shard1 Timestamp(1, 1) { "facility" : "FacilityAlpha", "_id" : NumberLong(0) } -->> { "facility" : "FacilityBaker", "_id" : { "$minKey" : 1 } } on : shard1 Timestamp(1, 2) { "facility" : "FacilityBaker", "_id" : { "$minKey" : 1 } } -->> { "facility" : "FacilityBaker", "_id" : NumberLong(0) } on : shard2 Timestamp(1, 3) { "facility" : "FacilityBaker", "_id" : NumberLong(0) } -->> { "facility" : { "$maxKey" : 1 }, "_id" : { "$minKey" : 1 } } on : shard2 Timestamp(1, 4) { "facility" : { "$maxKey" : 1 }, "_id" : { "$minKey" : 1 } } -->> { "facility" : { "$maxKey" : 1 }, "_id" : { "$maxKey" : 1 } } on : shard2 Timestamp(1, 5) tag: FacilityAlpha { "facility" : "FacilityAlpha", "_id" : { "$minKey" : 1 } } -->> { "facility" : "FacilityBaker", "_id" : { "$minKey" : 1 } } tag: FacilityBaker { "facility" : "FacilityBaker", "_id" : { "$minKey" : 1 } } -->> { "facility" : { "$maxKey" : 1 }, "_id" : { "$minKey" : 1 } }
シャーディング操作により合計で6チャンクが生成されました。 2 つのチャンクは、絶対下限と上限に対応します。 1 つはshardA
に、1 つはshardB
に、2 つのゾーンを作成し、 FacilityAlpha
とFacilityBaker
に対応させます。 これらの各ゾーンは、ハッシュ フィールドを使用して2チャンクにさらに細分化されています。