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