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