定義
sh.reshardCollection(namespace, key, unique, options)The
sh.reshardCollection()method changes the shard key for a collection and changes the distribution of your data.コレクションを再シャーディングする前に、再シャード要件と 再シャーディングの制限 をお読みください。
重要
mongosh メソッド
This page documents a
mongoshmethod. This is not the documentation for database commands or language-specific drivers, such as Node.js.データベースコマンドについては、
reshardCollectionコマンドを参照してください。MongoDB API ドライバーについては、各言語の「MongoDB ドライバーのドキュメント」を参照してください。
sh.reshardCollection()は、次のフィールドがあります。フィールドタイプ説明namespacestring
"<database>.<collection>"形式でシャーディングするコレクションの名前空間。keyドキュメント
シャードキーとして使用する新しいフィールドを指定するドキュメント。
{ <field1>: <1|"hashed">, ... }フィールド値を次のいずれかに設定します。
1、範囲ベースのシャーディング用"hashed"ハッシュされたシャードキーを指定します。
「シャードキー インデックス」も参照してください
uniqueブール値
任意。 シャードキーに一意の制約があるかどうかを指定します。
falseのみがサポートされています。 デフォルトはfalseです。unique: false既存のユニーク制約は削除されません。再シャード化の前にコレクションに存在するユニークインデックスは、再シャード化操作が完了した後もユニークなままです。新しいシャードキーは、既存のユニークインデックスに対するユニークインデックスの要件を満たしている必要があります。optionsドキュメント
任意.任意フィールドを含むドキュメント。たとえば、
numInitialChunks、numSamplesPerChunk、collation、zones、forceRedistributionなど。optionsフィールドは次のフィールドをサポートしています。フィールドタイプ説明numInitialChunksinteger
任意。 コレクションを 再シャーディングする ときに、クラスター内のすべてのシャードにわたって作成するチャンクの初期数を指定します。 デフォルト値は
90です。 次に、 MongoDB はクラスター全体でチャンクを作成し、バランスをとります。numInitialChunksの結果は、シャードあたり8192未満である必要があります。「提供されたシャードキーの濃度が十分でなく、必要な数のチャンクを作成できません」というエラーが表示された場合は、
numInitialChunks値を低くしてコレクションを再シャーディングします。シャードキーにハッシュされたプレフィックスが含まれている場合、リシャーディング操作では
numInitialChunks設定は無視されます。代わりに、 MongoDB は、空のハッシュされたコレクションの最初のチャンク作成と同じアプローチを使用して、受信者間でハッシュされたキースペースを確定的に分割します。numSamplesPerChunkinteger
任意.新しいチャンクでサンプルするドキュメントの数を指定します。デフォルトでは 、 MongoDB は各チャンクで 10 ドキュメントをサンプリングします。
バージョン8.0.20の新機能。
collationドキュメント
任意。
reshardCollectionに指定されたコレクションにデフォルトの照合がある場合は、{ locale : "simple" }を使用して照合ドキュメントを含める必要があります 。そうしないと、reshardCollectionコマンドは失敗します。zones配列
任意。 コレクションの ゾーン を指定します。
ゾーン を維持または追加するには、コレクションの ゾーン を以下のように配列で指定します。
[ {s min: <document with same shape as shardkey>, max: <document with same shape as shardkey>, zone: <string> | null }, ... ] forceRedistributionブール値
任意。
trueに設定されている場合、新しいシャードキーが古いシャードキーと同じであっても操作は実行されます。 データを特定のゾーンに移動するには、zonesオプションとともに使用します。バージョン8.0の新機能。
互換性
このメソッドは、次の環境でホストされている配置で使用できます。
- MongoDB Atlas: The fully managed service for MongoDB deployments in the cloud
重要
This command is not supported in M0 and Flex clusters. For more information, see Unsupported Commands.
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
Considerations
リシャーディング中に発生するインデックスビルドが、暗黙で失敗する可能性があります。
リシャーディング プロセスの実行中はインデックスを作成しないでください。
インデックスのビルドが進行中の場合は、リシャーディングプロセスを開始しないでください。
リシャーディングしているコレクションがMongoDB Search を使用している場合、リシャーディング操作の完了時に検索インデックスは使用できなくなります。再シャーディング操作が完了してから、検索インデックスを手動で再構築する必要があります。
リシャーディングの制限
If the collection uses Atlas Search, the search index becomes unavailable after the operation completes. To restore it, manually rebuild the search index.
Queryable 暗号化を使用するコレクションはサポートされていません。
再シャーディング プロセス
コレクションの再シャーディング操作では、シャードは次のようになります。
ドナーは、シャーディングされたコレクションのチャンクを現在保存しています。
シャードは同時にドナーでも受信者でもあることができます。
コンフィギュレーションサーバーのプライマリは常にリシャーディング コーディネーターであり、リシャーディング操作の各フェーズを開始します。
初期化フェーズ
初期化フェーズ中に、リシャーディング コーディネーターはシャーディングされたコレクションの新しいデータ分散を決定します。
クローン フェーズ
クローン フェーズ実行中:
各受信シャードは、ドナーのシャーディングされたコレクションと同じコレクションオプションを持つ、一時的な空のシャーディングされたコレクションを作成します。受信シャードは、インデックスフェーズまで
_id以外のインデックスを作成しません。各受信シャードは、ドナーシャードからコレクションデータをクローンし、クローンされたデータを一時コレクションに書き込み (write)ます。この一時コレクションには、新しいシャードキーの下で受信シャードが所有するすべてのドキュメントが含まれます。
インデックス フェーズ
インデックスフェーズでは、各受信者シャードは必要な新しいインデックスをビルドします。 これらには、シャーディングされたコレクションの既存のすべてのインデックスと、新しいシャードキーパターン と互換性のあるインデックス(シャーディングされたコレクションにインデックスがまだ存在しない場合)が含まれます。
適用フェーズとキャッチアップ フェーズ
バージョン8.2で変更。
適用フェーズとキャッチアップフェーズ中:
各受信者シャードは、受信者がデータをクローンした後に対応するドナー シャードに書込まれたoplogエントリの適用を開始します。
リシャーディング操作を完了するための残り時間の推定値が 500 ミリ秒 未満の場合、ドナー シャードはソースコレクションへの書込みをブロックします。
注意
必要な場合、 sh.commitReshardCollection()メソッドを発行すると、リシャーディング操作を手動で強制的に完了できます。 これは、再シャーディング操作を完了するための現在の推定時間がコレクションで書込みをブロックする許容期間である場合に有用です。 sh.commitReshardCollection()メソッドは、書込みを早期にブロックし、リシャーディング操作を強制的に完了させます。 書込み (write) がブロックされている期間中、アプリケーションのレイテンシが増加します。
コミット フェーズ
コミット フェーズ実行中:
リシャーディング コーディネーターは、すべてのシャードが厳密な一貫性に達するまで待機し、 リシャーディング操作 をコミットします。
リシャーディング コーディネーターは、各ドナー シャード プライマリと受信者シャード プライマリに対して、一時的にシャーディングされたコレクションの名前を変更するよう、個別に指示します。 一時的なコレクションは、新しいリシャーディングされたコレクションになります。
各ドナー シャードは、古いシャーディングされたコレクションを削除します。
注意
リシャーディング プロセスがコミット フェーズに達すると、sh.abortReshardCollection() ではプロセスを終了できなくなります。
例
コレクションの再シャーディング
次の例では、 sales.ordersコレクションを新しいシャードキー{ order_id: 1 }で再シャーディングします。
sh.reshardCollection( "sales.orders", { order_id: 1 } )
出力例:
{ ok: 1, '$clusterTime': { clusterTime: Timestamp(1, 1624887954), signature: { hash: Binary(Buffer.from("0000000000000000000000000000000000000000", "hex"), 0), keyId: 0 } }, operationTime: Timestamp(1, 1624887947) }
同じシャードキーへのコレクションの再シャーディング
In order to reshard to the same shard key, set forceRedistribution to true. The following example reshards the sales.orders collection to the same shard key { order_id: 1 } and redistributes data.
sh.reshardCollection( "sales.orders", { order_id: 1 }, { forceRedistribution: true } )
出力例:
{ ok: 1, '$clusterTime': { clusterTime: Timestamp({ t: 1733502241, i: 20 }), signature: { hash: Binary.createFromBase64('AAAAAAAAAAAAAAAAAAAAAAAAAAA=', 0), keyId: Long('0') } }, operationTime: Timestamp({ t: 1733502241, i: 20 }) }
詳細については、同じシャードキーにコレクションを再シャーディングする を参照してください。
ゾーンを使用したコレクションの再シャーディング
変化する要件を満たしたり、パフォーマンスを向上させたりするために、クラスター内のシャード全体のデータの分散を調整する必要がある場合は、 ゾーンでコレクションを再シャーディングします 。
次の例では、 test.scoresコレクションはshard0とshard1に存在します。 現在のシャードキーは{ _id: 1}です。
新しいゾーン情報を指定して sh.reshardCollection を実行
sh.reshardCollection( "test.scores", { "studentId": 1, "testId": 1}, { zones: [ { min: { "studentId": MinKey(), "testId": MinKey() }, max: { "studentId": MaxKey(), "testId": MaxKey() }, zone: "NewZone" } ] } )
リシャーディング操作では、ゾーンNewZoneのシャードが受信者として追加されます。 データベース プライマリ シャードは、ゾーン定義に欠落している範囲のバックグラウンドとして受信者として追加されます。 欠落している範囲がない場合、コレクションは「NewZone」内のシャード(この例ではshard2やshard3など)にクローンされます。 sh.reshardCollectionは以下を返します。
{ ok: 1, '$clusterTime': { clusterTime: Timestamp( { t: 1699484530, i: 54 } ), signature: { hash: Binary.createFromBase64( "90ApBDrSSi4XnCpV3OWIH4OGO0Y=", 0 ), keyId: Long( "7296989036055363606" ) } }, operationTime: Timestamp( { t: 1699484530, i: 54 } ) }