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
フィールドは次のフィールドをサポートしています。
フィールド | タイプ | 説明 | ||||||||
---|---|---|---|---|---|---|---|---|---|---|
| integer | 任意。 コレクションの再シャーディング時にクラスター内のすべてのシャードにわたって作成するチャンクの初期数を指定します。 デフォルトは、現在のシャードキー パターンの下にあるコレクションに存在するチャンクの数です。 次に、MongoDB はクラスター全体でチャンクを作成し、バランスをとります。 | ||||||||
| ドキュメント | 任意。 | ||||||||
| 配列 | 任意。 ゾーンを維持または追加するには、コレクションの ゾーン を以下のように配列で指定します。
|
互換性
このメソッドは、次の環境でホストされている配置で使用できます。
MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです
重要
このコマンドは、M 0 、M 2 、M 5クラスターではサポートされていません。 詳細については、「サポートされていないコマンド 」を参照してください。
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
再シャーディング プロセス
コレクションの再シャーディング操作では、シャードは次のようになります。
ドナーは、シャーディングされたコレクションのチャンクを現在保存しています。
シャードは同時にドナーでも受信者でもあることができます。 ゾーン を使用する場合を除き、ドナー シャードのセットは受信者シャードと同じです。
コンフィギュレーションサーバーのプライマリは常にリシャーディング コーディネーターであり、リシャーディング操作の各フェーズを開始します。
初期化フェーズ
初期化フェーズ中に、リシャーディング コーディネーターはシャーディングされたコレクションの新しいデータ分散を決定します。
インデックス フェーズ
インデックスフェーズ中:
シャード受信者ごとに、既存のシャーディングされたコレクションと同じコレクション オプションを持つ、新しい空のシャーディングされたコレクションが作成されます。 このシャーディングされたコレクションは、受信者が新しいデータを書き込むシャーディングされたコレクションのターゲットです。
各シャード受信者は、必要な新しいインデックスをビルドします。 これらには、シャーディングされたコレクション上の既存のすべてのインデックスと、新しいシャードキー パターンと互換性のあるインデックス(シャーディングされたコレクションにインデックスがまだ存在しない場合)が含まれます。
複製、適用、キャッチアップのフェーズ
クローン、適用、キャッチアップ フェーズ中に、以下を実行します。
各シャード受信者は、新しいシャードキーの下に所有するドキュメントの最初のコピーを複製します。
各シャード受信者は、受信者がデータをクローンした後に発生した操作からの oplog エントリの適用を開始します。
リシャーディング操作を完了するための残り時間の推定値が2 秒未満の場合、リシャーディング コーディネーターはコレクションへの書込み (write) をブロックします。
注意
必要な場合、
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 } ) }