Docs Menu
Docs Home
/
MongoDBマニュアル
/ / /

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

string

minimummaximumで区切られたシャードキー値の範囲に関連付けるゾーンの名前。

sh.updateZoneKeyRange()インスタンスに接続されている場合にのみmongos を発行します。

このメソッドは、次の環境でホストされている配置で使用できます。

  • MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです

重要

このコマンドは、M 0 、M 2 、M 5クラスターではサポートされていません。 詳細については、「サポートされていないコマンド 」を参照してください。

  • MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン

  • MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン

シャーディングされたコレクションの既存の範囲と下限と上限が重複するシャードキー値の範囲は作成できません。 たとえば、 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オプションを指定します。

複合ハッシュされたシャードキーでの初期チャンク分散のためのゾーンとゾーン範囲の定義のより詳細な例については、「空または存在しないコレクションのゾーンとゾーン範囲の事前定義 」を参照してください。

Tip

以下も参照してください。

範囲をゾーンに関連付けた後、ゾーンによってカバーされる範囲がカバーされる チャンク をそのゾーン内のシャードに移行するために、まずバランサーは を実行する必要があります。 バランシングが完了するまで、シャーディングされたクラスターに構成されたゾーンを考慮すると、いくつかのチャンクが間違ったシャードに存在する可能性があります。 詳細については、「バランサー」を参照してください。

シャーディングされたクラスターで移行がどのように機能するかについて詳しくは、 シャーディングされたクラスター バランサーのマニュアル ページを参照してください。

ゾーン範囲は、常に下限を含み、上限を含まない範囲です。

コレクションを削除すると、それに関連付けられたゾーンやタグの範囲も削除されます。

以前のバージョンでは、MongoDB は削除されたコレクションのタグ関連付けを削除せず、後で同じ名前で新しいコレクションを作成すると、古いタグの関連付けが新しいコレクションに適用されます。

認証 を使用して実行されているシャーディングされたクラスターの場合は、次のいずれかとして認証する必要があります。

  • configデータベース内のさまざまなコレクションに対して指定されたアクションを含む特権を持つユーザー:

    • findconfig.shardsコレクションの

    • コレクションのfind と 、updateconfig.tags

    または、あるいは、

  • クラスター リソースでenableSharding を含む 権限 を持つユーザー。

clusterAdminまたはclusterManagerの組み込みロールには、 sh.updateZoneKeyRange()を発行するための適切な権限があります。 詳細については、ロールベースのアクセス制御に関するドキュメントページを参照してください。

シャーディングされたコレクションexampledb.collectionとシャードキーが{ a : 1 }の場合、次の操作を実行すると、 alphaゾーンに下限が1で上限が10の範囲が作成されます。

sh.updateZoneKeyRange(
"exampledb.collection",
{ a : 1 },
{ a : 10 },
"alpha"
)

次の操作では、 nullzoneフィールドに渡すことで、以前に作成した範囲が削除されます。

sh.updateZoneKeyRange(
"exampledb.collection",
{ a : 1 },
{ a : 10 },
null
)

minmaxは、ターゲット範囲の境界と完全に一致する必要があります。 次の操作は、以前に作成した範囲を削除しようとしますが、 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}

1

ゾーンを作成するには、 sh.addShardToZone()を使用します。

sh.addShardToZone("shardA", "DC1")
sh.addShardToZone("shardB", "DC2")
2

sh.updateZoneKeyRange()を使用して、 exampledbデータベースに空のcontactsコレクションの範囲を作成します。

sh.updateZoneKeyRange(
"exampledb.contacts",
{ zip: 10001 },
{ zip: 10090 },
"DC1"
);
sh.updateZoneKeyRange(
"exampledb.contacts",
{ zip: 90001 },
{ zip: 96054 },
"DC2"
);
3

注意

コレクションが存在しない場合は、シャーディング操作によってコレクションが作成されます。

コレクションが空で、シャードキーをサポートするインデックスが存在しない場合は、シャーディング操作によってインデックスが作成されます。

sh.shardCollection()を使用してコレクションcontactsをシャーディングします。

sh.shardCollection("exampledb.contacts", { zip: 1 } );
4

作成されたチャンクとディストリビューションを確認するには、 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}で、ハッシュされたフィールドは シャードキープレフィックスです。

1

予定されているシャードキーは{ "_id" : "hashed", "facility" : 1 }です。 ハッシュされたフィールドはプレフィックス(シャードキーの最初のフィールド)であるため、 を使用して 単一の ゾーンを作成します。sh.addShardToZone()

sh.addShardToZone("shardA", "FacilityAlpha")
sh.addShardToZone("shardB", "FacilityAlpha")
2

ハッシュされたプレフィックスを持つ複合ハッシュされたシャードキーでの最初のチャンク分散には、すべての下限フィールドにMinKeyが含まれ、すべての上限フィールドにMaxKeyが含まれる単一のゾーン範囲が必要です。

単一範囲を作成するには、 sh.updateZoneKeyRange()を使用します。

sh.updateZoneKeyRange(
"examples.metrics",
{ "_id" : MinKey, "facility" : MinKey },
{ "_id" : MaxKey, "facility" : MaxKey },
"FacilityAlpha"
);
3

注意

コレクションが存在しない場合は、シャーディング操作によってコレクションが作成されます。

コレクションが空で、シャードキーをサポートするインデックスが存在しない場合は、シャーディング操作によってインデックスが作成されます。

sh.shardCollection()presplitHashedZones: true とともに使用してコレクションをシャーディングし、初期チャンクの作成と分散を実行します。

sh.shardCollection(
"examples.metrics",
{ "_id" : "hashed", "facility" : 1 },
false,
{ presplitHashedZones: true }
)
4

作成されたチャンクとディストリビューションを確認するには、 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に対応するshardAshardBに 1 つのゾーンが作成されました。 ゾーンは ハッシュされたフィールドを使用して2チャンクにさらに細分化されました。

注意

この例は、ハッシュされたフィールドがシャードキーのプレフィックスではない(つまり、シャードキーの最初のフィールドがハッシュされていない)ハッシュされた複合シャードキーにのみ適用されます。

たとえば、 { "facility" : 1, "_id" : "hashed" }

MongoDB は、ハッシュされた複合インデックスでのコレクションのシャーディングをサポートしています。 ハッシュされた複合シャードキーでシャーディングする場合、MongoDB は、定義されたゾーン範囲が 追加の要件を 満たしている 場合にのみ 、空または存在しないコレクションに対して最適化された初期チャンクの作成と分散を実行できます。

2 つの工場のいずれかの分析を保存する空のコレクションexamples.metricsについて考えてみましょう。 計画されているシャードキーは{ "facility" : 1, "_id" : "hashed" }で、ハッシュされたフィールドはシャードキー プレフィックスではありません

  • facilityフィールドには、施設の名前: "FacilityAlpha"または"FacilityBaker"が保存されます。 コレクションでは、各施設のデータを特定のシャードに分離するために、 facilityのゾーン範囲が必要です。

  • _idフィールドはfacilityフィールドの低濃度を調整します。 ハッシュすることで、 _idフィールドの単調に増加する性質が埋め込まれます。

1

ゾーンを作成するには、 sh.addShardToZone()コマンドを使用します。

sh.addShardToZone("shardA", "FacilityAlpha")
sh.addShardToZone("shardB", "FacilityBaker")
2

予定されているシャードキーは{"facility" : 1, "_id" : "hashed"}です。 facilityフィールドには、 FacilityAlphaFacilityBakerの 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に個別の値が存在しないことを前提としています。 コレクションには、 facilityFacilityAlphaまたはFacilityBakerであるドキュメントのみが含まれるため、この範囲は個別のシャードキー プレフィックス値"facility" : "FacilityBaker"と可能な値が_idであるドキュメントのみをカバーします。

3

注意

コレクションが存在しない場合は、シャーディング操作によってコレクションが作成されます。

コレクションが空で、シャードキーをサポートするインデックスが存在しない場合は、シャーディング操作によってインデックスが作成されます。

sh.shardCollection()presplitHashedZones: true とともに使用してコレクションをシャーディングし、初期チャンクの作成と分散を実行します。

sh.shardCollection(
"examples.metrics",
{ "facility" : 1, "_id" : "hashed"},
false,
{ presplitHashedZones: true }
)
4

作成されたチャンクとディストリビューションを確認するには、 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 つのゾーンを作成し、 FacilityAlphaFacilityBakerに対応させます。 これらの各ゾーンは、ハッシュ フィールドを使用して2チャンクにさらに細分化されています。

Tip

以下も参照してください。

戻る

sh.stopBalancer