定義
reshardCollectionThe
reshardCollectioncommand changes the shard key for a collection and changes the distribution of your data.Tip
In
mongosh, this command can also be run through thesh.reshardCollection()helper method.Helper methods are convenient for
mongoshusers, but they may not return the same level of information as database commands. In cases where the convenience is not needed or the additional return fields are required, use the database command.
互換性
このコマンドは、次の環境でホストされている配置で使用できます。
- MongoDB Atlas: The fully managed service for MongoDB deployments in the cloud
注意
This command is supported in all MongoDB Atlas clusters. For information on Atlas support for all commands, see Unsupported Commands.
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
構文
このコマンドの構文は、次のとおりです。
db.adminCommand( { reshardCollection: "<database>.<collection>", key: { "<shardkey>" }, unique: <boolean>, numInitialChunks: <integer>, numSamplesPerChunk: <integer>, // New in MongoDB 8.0.20 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 | 任意。 コレクションを 再シャーディングする ときに、クラスター内のすべてのシャードにわたって作成するチャンクの初期数を指定します。 デフォルト値は 「提供されたシャードキーの濃度が十分でなく、必要な数のチャンクを作成できません」というエラーが表示された場合は、 シャードキーにハッシュされたプレフィックスが含まれている場合、リシャーディング操作では | ||||||||
| integer | 任意.新しいチャンクでサンプルするドキュメントの数を指定します。デフォルトでは 、 MongoDB は各チャンクで 10 ドキュメントをサンプリングします。 バージョン8.0.20の新機能。 | ||||||||
| ドキュメント | 任意。 | ||||||||
| 配列 | 任意。 コレクションの ゾーン を指定します。 ゾーン を維持または追加するには、コレクションの ゾーン を以下のように配列で指定します。 | ||||||||
| ブール値 | 任意。 バージョン8.0の新機能。 | ||||||||
| ブール値 | 任意。リシャーディング操作を迅速に完了できるようになります。true に設定すると、 |
Considerations
リシャーディング中に発生するインデックスビルドが、暗黙で失敗する可能性があります。
リシャーディング プロセスの実行中はインデックスを作成しないでください。
インデックスのビルドが進行中の場合は、リシャーディングプロセスを開始しないでください。
リシャーディングしているコレクションがMongoDB Search を使用している場合、リシャーディング操作の完了時に検索インデックスは使用できなくなります。再シャーディング操作が完了してから、検索インデックスを手動で再構築する必要があります。
リシャーディングの制限
If the collection uses Atlas Search, the search index becomes unavailable after the operation completes. To restore it, manually rebuild the search index.
Queryable 暗号化を使用するコレクションはサポートされていません。
再シャーディング プロセス
コレクションの再シャーディング操作では、シャードは次のようになります。
ドナーは、シャーディングされたコレクションのチャンクを現在保存しています。
シャードは同時にドナーでも受信者でもあることができます。
コンフィギュレーションサーバーのプライマリは常にリシャーディング コーディネーターであり、リシャーディング操作の各フェーズを開始します。
初期化フェーズ
初期化フェーズ中に、リシャーディング コーディネーターはシャーディングされたコレクションの新しいデータ分散を決定します。
クローン フェーズ
クローン フェーズ実行中:
各受信シャードは、ドナーのシャーディングされたコレクションと同じコレクションオプションを持つ、一時的な空のシャーディングされたコレクションを作成します。受信シャードは、インデックスフェーズまで
_id以外のインデックスを作成しません。各受信シャードは、ドナーシャードからコレクションデータをクローンし、クローンされたデータを一時コレクションに書き込み (write)ます。この一時コレクションには、新しいシャードキーの下で受信シャードが所有するすべてのドキュメントが含まれます。
インデックス フェーズ
インデックスフェーズでは、各受信者シャードは必要な新しいインデックスをビルドします。 これらには、シャーディングされたコレクションの既存のすべてのインデックスと、新しいシャードキーパターン と互換性のあるインデックス(シャーディングされたコレクションにインデックスがまだ存在しない場合)が含まれます。
適用フェーズとキャッチアップ フェーズ
バージョン8.2で変更。
適用フェーズとキャッチアップフェーズ中:
各受信者シャードは、受信者がデータをクローンした後に対応するドナー シャードに書込まれたoplogエントリの適用を開始します。
リシャーディング操作を完了するための残り時間の推定値が 500 ミリ秒 未満の場合、ドナー シャードはソースコレクションへの書込みをブロックします。
注意
必要に応じて、 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コレクションのデータを再配布し、ゾーン zone04 と zone05 に関連付けられているシャードにデータを移動します。
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() } } ] })