ハッシュされたシャーディング
ハッシュされたシャーディングでは、シャード キーとしてハッシュされた単一フィールド インデックスまたはハッシュされた複合インデックスのいずれかを使用して、シャーディングされたクラスター全体にデータを分割します。
- 単一フィールド ハッシュされたインデックスでのシャーディング
ハッシュされたシャーディングでは、対象とする操作がブロードキャスト操作と比較して少なくなるという犠牲を払って、シャーディングされたクラスター全体にデータをより均等に分散できます。ハッシュされた後、「近い」シャードキー値を持つドキュメントが同じチャンクまたはシャードに存在する可能性は低くなります。
mongos
は、指定された範囲のクエリを実行するためにブロードキャスト操作を実行する可能性が高くなります。mongos
は、等価一致のクエリを 1 つのシャードの対象にできます。ハッシュされたインデックスは、1 つのフィールドのハッシュ値をインデックス値として計算します。この値はシャードキーとして使用されます。[1]
- ハッシュされた複合インデックスのシャーディング
MongoDB には、1 つのハッシュされたフィールドを含む複合インデックスの作成がサポートされています。ハッシュされた複合インデックスを作成するには、インデックスを作成するときに任意の単一のインデックスキーの値として
hashed
を指定します。ハッシュされた複合インデックスは、複合インデックスの1 つのフィールドのハッシュ値をインデックス値としてKさんします。この値はシャードキーとしてインデックス中の他のフィールドと共に使用されます。
ハッシュされた複合シャーディングは、ゾーン シャーディングなどの機能をサポートします。ここで、プレフィックスは(つまり最初の)ハッシュされていないフィールド(1 つまたは複数)はゾーン範囲をサポートし、ハッシュされたフィールドはシャーディングされたデータのより均等な分散をサポートします。ハッシュされた複合シャーディングでは、単調に増加するフィールドに関連したデータ分散の問題を解決するために、ハッシュされたプレフィックス付きのシャードキーもサポートされています。
Tip
MongoDB は、ハッシュされたインデックスを使用してクエリを解決するときに、ハッシュを自動計算するため、アプリケーションでハッシュを計算する必要がありません。
警告
MongoDB hashed
インデックスは、ハッシュする前に浮動小数点数を 64 ビット整数に切り捨てます。たとえば、hashed
インデックスは 2.3
、2.2
、2.9
の値を持つフィールドに同じ値をストアします。衝突を防ぐため、64 ビット整数に確実に変換できない(そして浮動小数点に戻せない)浮動小数点数には hashed
インデックスを使用しないでください。MongoDB hashed
インデックスは 2 53より大きい浮動小数点値をサポートしていません。
キーのハッシュされた値を確認するには、convertShardKeyToHashed()
を参照してください。
[1] | mongosh は、convertShardKeyToHashed() メソッドを提供します。このメソッドでは、ハッシュされたインデックスと同じハッシュ関数を使用するため、キーのハッシュされた値がどうなるかを確認できます。 |
ハッシュされたシャーディング シャードキー
ハッシュされたシャードキーとして選択するフィールドには、濃度が適切であるか、異なる値が多数含まれている必要があります。ハッシュされたキーは、ObjectId 値やタイムスタンプのように単調に変化するフィールドを持つシャードキーに最適です。その良い例は、ObjectId 値のみが含まれていると仮定した、デフォルトの _id
フィールドです。
ハッシュされたシャードキーを使用してコレクションをシャードするには、「コレクションのシャード」を参照してください。
ハッシュされたシャーディングと範囲シャーディング
単調に増加する値 X
をシャードキーとして使用するコレクションの場合、範囲シャーディングを使用すると、入力インサートが次のように分散されます。
X
の値は常に増加するため、上限が MaxKey
のチャンクが大部分の書き込みを受信します。これにより、挿入操作はこのチャンクを含む単一のシャードに制限され、シャーディングされたクラスターでの分散された書き込みの利点が減るか、除かれます。
X
でハッシュされたインデックスを使用すると、挿入の分散は次のようになります。
データがより均等に分散されるようになったため、挿入はクラスター全体に効率的に分散されます。
コレクションのシャード
sh.shardCollection()
メソッドを使用して、コレクションの完全な名前空間と、シャードキーとして使用する対象のハッシュされたインデックスを指定します。
sh.shardCollection( "database.collection", { <field> : "hashed" } )
ハッシュされた複合インデックスでコレクションをシャードするには、コレクションの完全な名前空間と、シャードキーとして使用する対象のハッシュされた複合インデックスを指定します。
sh.shardCollection( "database.collection", { "fieldA" : 1, "fieldB" : 1, "fieldC" : "hashed" } )
重要
MongoDB 5.0 以降、ドキュメントのシャードキーを変更することでコレクションの再シャーディングが可能です。
既存のシャードキーにサフィックス フィールドを追加することで、シャードキーを調整できます。
入力済みのコレクションのシャーディング
ハッシュされたシャードキーを使用して、データが入ったコレクションをシャードする場合:
シャーディング操作により、すべてのシャードキー値をカバーする初期チャンクが作成されます。
最初のチャンク作成後、バランサーはデータのバランスを取る必要があるときに最初のチャンクの範囲を移動します。
空のコレクションのシャーディング
コレクションにゾーンとゾーン範囲が定義されている場合、シャード コレクション操作では、空のコレクションまたは存在しないコレクションに対して、初期チャンクの作成と分散を実行できます。このように初期チャンクを作成して分散することで、ゾーン シャーディングの設定を迅速に行うことができます。初期分散後、バランサーは通常どおりに今後のチャンク分散を管理します。
- 単一フィールドのハッシュされたシャードキーでの空のコレクションのシャーディング
空または存在しないコレクションにゾーンとゾーン範囲が指定されていない場合は以下のとおりです。
シャーディング操作では、シャードキー値の全範囲をカバーする空のチャンクが作成され、初期チャンクの分散が実行されます。デフォルトでは、この操作はシャードごとに 2 つのチャンクを作成し、クラスター全体に移行します。
numInitialChunks
オプションを使用すると、異なる初期チャンク数を指定できます。このように初期チャンクを作成して分散することで、シャーディングの設定を迅速に行うことができます。初期分散後、バランサーは今後のチャンク分散を管理します。
空のコレクションまたは存在しないコレクションにゾーンとゾーン範囲が指定されている場合(MongoDB 4.0.3 以降で利用可能):
シャーディング操作では、定義されたゾーン範囲の空のチャンクと、シャードキー値の全範囲をカバーする追加のチャンクが作成され、ゾーン範囲に基づいて初期チャンク分散が実行されます。このようにチャンクを最初に作成して分散することで、ゾーン シャーディングの設定を迅速に行うことができます。
初期分散後、バランサーは今後のチャンク分散を管理します。
- ハッシュされたフィールド プレフィックスを持つ複合ハッシュされたシャードキーでの空のコレクションのシャーディング
複合ハッシュされたシャードキーのプレフィックスとして、ハッシュされたフィールドがある場合(つまり、ハッシュされたフィールドがシャードキーの最初のフィールドである場合):
空のコレクションまたは存在しないコレクションにゾーンとゾーン範囲が指定されていない場合:
シャーディング操作では、シャードキー値の全範囲をカバーする空のチャンクが作成され、初期チャンクの分散が実行されます。ハッシュされていないすべてのフィールドの値は、各分裂点で
MinKey
です。デフォルトでは、この操作はシャードごとに 2 つのチャンクを作成し、クラスター全体に移行します。numInitialChunks
オプションを使用すると、異なる初期チャンク数を指定できます。このように初期チャンクを作成して分散することで、シャーディングの設定を迅速に行うことができます。初期分散後、バランサーは今後のチャンク分散を管理します。
空のコレクションまたは存在しないコレクションに
MinKey
からMaxKey
までの範囲の単一のゾーンが指定され、かつpresplitHashedZones
オプションがsh.shardCollection()
に指定されている場合:シャーディング操作では、定義されたゾーン範囲の空のチャンクと、シャードキー値の全範囲をカバーする追加のチャンクが作成され、ゾーン範囲に基づいて初期チャンク分散が実行されます。このように初期チャンクを作成して分散することで、ゾーン シャーディングの設定を迅速に行うことができます。
初期分散後、バランサーは今後のチャンク分散を管理します。
- ハッシュされていないプレフィックスを持つ複合ハッシュされたシャードキーでの空のコレクションのシャーディング
複合ハッシュされたシャードキーのプレフィックスとして、ハッシュされていないフィールドが 1 つ以上ある場合(つまり、ハッシュされたフィールドがシャードキーの最初のフィールドではない場合):
空のコレクションまたは存在しないコレクションにゾーンとゾーン範囲が指定されておらず、かつ preSplitHashedZones が
false
または省略されている場合、MongoDB はコレクションをシャーディングするときに初期チャンクの作成または分散を実行しません。空のコレクションまたは存在しないコレクション、および preSplitHashedZones にゾーンとゾーン範囲が指定されていない場合、
sh.shardCollection()
およびshardCollection
はエラーを返します。空のコレクションまたは存在しないコレクションにゾーンとゾーン範囲が指定されていて、かつ preSplitHashedZones オプションが
sh.shardCollection()
に指定されている場合:シャーディング操作では、定義されたゾーン範囲の空のチャンクと、シャードキー値の全範囲をカバーする追加のチャンクが作成されます。
シャーディング操作では、ゾーン内の各シャードに同じ数のチャンクが割り当てられるように、各範囲の初期チャンクがさらに細分化されます。
このように初期チャンクを作成して分散することで、ゾーン シャーディングの設定を迅速に行うことができます。初期分散後、バランサーは今後のチャンク分散を管理します。
各ゾーンに定義された範囲は、一定の要件を満たさなければなりません。要件の説明と完全な例については、「空または存在しないコレクションのゾーンとゾーン範囲の事前定義」を参照してください。
ハッシュされたシャードキーインデックスの削除
MongoDB 7.0.3 以降(そして 6.0.12 と 5.0.22)、ハッシュされたシャードキーのインデックスを削除できます。
これにより、ハッシュされたシャードキーでシャーディングされたコレクションのデータ挿入を高速化できます。mongosync
を使用すると、データの取り込みを高速化することもできます。
詳細については、「ハッシュシャードキー インデックスの削除」を参照してください。
Tip
以下も参照してください。
シャーディングされたクラスターをデプロイしてハッシュされたシャーディングを実装する方法については、「自己管理型シャーディングされたクラスターのデプロイ 」を参照してください。