定義
sh.reshardCollection(namespace, key, unique, options)sh.reshardCollection()メソッドは、コレクションのシャードキーを変更し、データの分散状況を変える。コレクションを再シャーディングする前に、 の再シャーディング要件と再シャーディングの制限をお読みください。
重要
mongosh メソッド
このページでは、
mongoshメソッドについて記載しています。ただし、データベースコマンドや Node.js などの言語固有のドライバーのドキュメントには該当しません。データベースコマンドについては、
reshardCollectionコマンドを参照してください。MongoDB API ドライバーについては、各言語の MongoDB ドライバー ドキュメントを参照してください。
sh.reshardCollection()は、次のフィールドがあります。フィールドタイプ説明namespacestring
"<database>.<collection>"形式でシャーディングするコレクションの名前空間。keyドキュメント
シャードキーとして使用する新しいフィールドを指定するドキュメント。
{ <field1>: <1|"hashed">, ... }フィールド値を次のいずれかに設定します。
1、範囲ベースのシャーディング用"hashed"ハッシュされたシャードキーを指定します。
「シャードキー インデックス」も参照してください
uniqueブール値
任意。 シャードキーに一意の制約があるかどうかを指定します。
falseのみがサポートされています。 デフォルトはfalseです。optionsドキュメント
任意。任意フィールドを含むドキュメント。たとえば、
numInitialChunks、collation、zones、forceRedistributionなど。optionsフィールドは次のフィールドをサポートしています。フィールドタイプ説明numInitialChunksinteger
任意。 コレクションを 再シャーディングする ときに、クラスター内のすべてのシャードにわたって作成するチャンクの初期数を指定します。 デフォルト値は
90です。 次に、 MongoDB はクラスター全体でチャンクを作成し、バランスをとります。numInitialChunksの結果は、シャードあたり8192未満である必要があります。「提供されたシャードキーの濃度が十分でなく、必要な数のチャンクを作成できません」というエラーが表示された場合は、
numInitialChunks値を低くしてコレクションを再シャーディングします。collationドキュメント
任意。
reshardCollectionに指定されたコレクションにデフォルトの照合がある場合は、{ locale : "simple" }を使用して照合ドキュメントを含める必要があります 。そうしないと、reshardCollectionコマンドは失敗します。zones配列
任意。 コレクションの ゾーン を指定します。
ゾーン を維持または追加するには、コレクションの ゾーン を以下のように配列で指定します。
[ { min: <document with same shape as shardkey>, max: <document with same shape as shardkey>, zone: <string> | null }, ... ] forceRedistributionブール値
任意。
trueに設定されている場合、新しいシャードキーが古いシャードキーと同じであっても操作は実行されます。 データを特定のゾーンに移動するには、zonesオプションとともに使用します。バージョン8.0の新機能。
互換性
このメソッドは、次の環境でホストされている配置で使用できます。
MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです
重要
このコマンドは、M0 および Flex クラスターではサポートされていません。詳細については、「 サポートされていないコマンド 」を参照してください。
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
Considerations
リシャーディング中に発生するインデックスビルドが、暗黙で失敗する可能性があります。
リシャーディング プロセスの実行中はインデックスを作成しないでください。
インデックスのビルドが進行中の場合は、リシャーディングプロセスを開始しないでください。
リシャーディングしているコレクションが Atlas Search を使用している場合、リシャーディング操作の完了時に検索インデックスは使用できなくなります。再シャーディング操作が完了してから、検索インデックスを手動で再構築する必要があります。
再シャーディング プロセス
コレクションの再シャーディング操作では、シャードは次のようになります。
ドナーは、シャーディングされたコレクションのチャンクを現在保存しています。
シャードは同時にドナーでも受信者でもあることができます。
コンフィギュレーションサーバーのプライマリは常にリシャーディング コーディネーターであり、リシャーディング操作の各フェーズを開始します。
初期化フェーズ
初期化フェーズ中に、リシャーディング コーディネーターはシャーディングされたコレクションの新しいデータ分散を決定します。
クローン フェーズ
クローン フェーズ実行中:
各受信者シャードは、ドナーのシャーディングされたコレクションと同じコレクションオプションを持つ一時的な空のシャーディングされたコレクションを作成します。 この新しいコレクションは、受信者シャードが新しいデータを書き込むターゲットです。 受信者シャードは、インデックスフェーズまで、
_idインデックス以外のインデックスを作成しません。各受信者シャードは、新しいシャードキーの下で受信者シャードが所有するすべてのドキュメントを含む、ドナー シャードからのコレクションデータを複製します。
インデックス フェーズ
インデックスフェーズでは、各受信者シャードは必要な新しいインデックスをビルドします。 これらには、シャーディングされたコレクションの既存のすべてのインデックスと、新しいシャードキーパターン と互換性のあるインデックス(シャーディングされたコレクションにインデックスがまだ存在しない場合)が含まれます。
適用フェーズとキャッチアップ フェーズ
適用フェーズとキャッチアップフェーズ中:
各受信者シャードは、受信者がデータをクローンした後に対応するドナー シャードに書込まれたoplogエントリの適用を開始します。
リシャーディング操作を完了するための残り時間が 2 秒未満の場合、ドナー シャードはソースコレクションへの書込みをブロックします。
注意
必要な場合、 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) }
同じシャードキーへのコレクションの再シャーディング
同じシャードキーにリシャーディングするには、 forceRedistribution を true に設定します。次の例では、sales.ordersコレクションを同じシャードキー{ order_id: 1 } に再シャーディングし、データを再配布します。
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 } ) }