定義
reshardCollectionバージョン 5.0 で追加
reshardCollectionコマンドは、コレクションのシャードキーを変更し、データの分散を変更します。Tip
mongoshでは、このコマンドはsh.reshardCollection()ヘルパー メソッドを通じて実行することもできます。ヘルパー メソッドは
mongoshユーザーには便利ですが、データベースコマンドと同じレベルの情報は返されない可能性があります。 便宜上必要ない場合、または追加の戻りフィールドが必要な場合は、 データベースコマンドを使用します。
互換性
このコマンドは、次の環境でホストされている配置で使用できます。
MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです
注意
このコマンドは、すべての MongoDB Atlas クラスターでサポートされています。すべてのコマンドに対する Atlas のサポートについては、「サポートされていないコマンド」を参照してください。
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
構文
このコマンドの構文は、次のとおりです。
{ reshardCollection: "<database>.<collection>", key: <shardkey>, unique: <boolean>, numInitialChunks: <integer>, collation: { locale: "simple" }, zones: [ { min: <document with same shape as shardkey>, max: <document with same shape as shardkey>, zone: <string> | null }, ... ] }
コマンドフィールド
このコマンドは、次のフィールドを使用します。
フィールド | タイプ | 説明 |
|---|---|---|
| string | リシャーディングするコレクションの名前空間。 形式は |
| ドキュメント | シャードキーとして使用する新しいフィールドを指定するドキュメント。
フィールド値を次のいずれかに設定します。
|
| ブール値 | 任意。 シャードキーに一意の制約があるかどうかを指定します。 |
| integer | 任意。 コレクションの再シャーディング時にクラスター内のすべてのシャードにわたって作成するチャンクの初期数を指定します。 デフォルトは、現在のシャードキー パターンの下にあるコレクションに存在するチャンクの数です。 次に、MongoDB はクラスター全体でチャンクを作成し、バランスをとります。 |
| ドキュメント | 任意。 |
| 配列 | 任意。 ゾーンを維持または追加するには、コレクションの ゾーン を配列で指定します。 |
mongoshはラッパー メソッドsh.reshardCollection()を提供します。
再シャーディング プロセス
コレクションの再シャーディング操作では、シャードは次のようになります。
ドナーは、シャーディングされたコレクションのチャンクを現在保存しています。
シャードは同時にドナーでも受信者でもあることができます。 ゾーン を使用する場合を除き、ドナー シャードのセットは受信者シャードと同じです。
コンフィギュレーションサーバーのプライマリは常にリシャーディング コーディネーターであり、リシャーディング操作の各フェーズを開始します。
初期化フェーズ
初期化フェーズ中に、リシャーディング コーディネーターはシャーディングされたコレクションの新しいデータ分散を決定します。
インデックス フェーズ
インデックスフェーズ中:
シャード受信者ごとに、既存のシャーディングされたコレクションと同じコレクション オプションを持つ、新しい空のシャーディングされたコレクションが作成されます。 このシャーディングされたコレクションは、受信者が新しいデータを書き込むシャーディングされたコレクションのターゲットです。
各シャード受信者は、必要な新しいインデックスをビルドします。 これらには、シャーディングされたコレクション上の既存のすべてのインデックスと、新しいシャードキー パターンと互換性のあるインデックス(シャーディングされたコレクションにインデックスがまだ存在しない場合)が含まれます。
複製、適用、キャッチアップのフェーズ
クローン、適用、キャッチアップ フェーズ中に、以下を実行します。
各シャード受信者は、新しいシャードキーの下に所有するドキュメントの最初のコピーを複製します。
各シャード受信者は、受信者がデータをクローンした後に発生した操作からの oplog エントリの適用を開始します。
リシャーディング操作を完了するための残り時間の推定値が2 秒未満の場合、リシャーディング コーディネーターはコレクションへの書込み (write) をブロックします。
注意
必要に応じて、
commitReshardCollectionコマンドを発行すると、リシャーディング操作を手動で強制的に完了させることができます。 これは、再シャーディング操作を完了するための現在の推定時間がコレクションで書込みをブロックする許容期間である場合に有用です。commitReshardCollectionコマンドは、書込みを早期にブロックし、リシャーディング操作を強制的に完了させます。 書込み (write) がブロックされている期間中、アプリケーションのレイテンシが増加します。
コミット フェーズ
リシャーディング プロセスがコミット フェーズに達すると、
abortReshardCollection中止されなくなります。すべてのシャードが厳密な一貫性に達すると、リシャーディング コーディネーターはリシャーディング操作をコミットし、新しいルーティング テーブルをインストールします。
リシャーディング コーディネーターは、各ドナー シャード プライマリと受信者シャード プライマリに対して、一時的にシャーディングされたコレクションの名前を変更するよう、個別に指示します。 一時的なコレクションは、新しいリシャーディングされたコレクションになります。
各ドナー シャードは、古いシャーディングされたコレクションを削除します。
例
コレクションの再シャーディング
次の例では、 sales.ordersコレクションを新しいシャードキー{ order_id: 1 }で再シャーディングします。
db.adminCommand({ reshardCollection: "sales.orders", key: { order_id: 1 } })
MongoDB は以下を返します。
{ ok: 1, '$clusterTime': { clusterTime: Timestamp(1, 1624887954), signature: { hash: Binary(Buffer.from("0000000000000000000000000000000000000000", "hex"), 0), keyId: 0 } }, operationTime: Timestamp(1, 1624887947) }