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 | 任意。 コレクションを 再シャーディングする ときに、クラスター内のすべてのシャードにわたって作成するチャンクの初期数を指定します。 デフォルト値は 「提供されたシャードキーの濃度が十分でなく、必要な数のチャンクを作成できません」というエラーが表示された場合は、 | ||||||||
| ドキュメント | 任意。 | ||||||||
| 配列 | 任意。 コレクションの ゾーン を指定します。 ゾーン を維持または追加するには、コレクションの ゾーン を以下のように配列で指定します。
| ||||||||
| ブール値 | 任意。 バージョン8.0の新機能。 |
Considerations
リシャーディング中に発生するインデックスビルドが、暗黙で失敗する可能性があります。
リシャーディング プロセスの実行中はインデックスを作成しないでください。
インデックスのビルドが進行中の場合は、リシャーディングプロセスを開始しないでください。
再シャーディング プロセス
コレクションの再シャーディング操作では、シャードは次のようになります。
ドナーは、シャーディングされたコレクションのチャンクを現在保存しています。
シャードは同時にドナーでも受信者でもあることができます。
コンフィギュレーションサーバーのプライマリは常にリシャーディング コーディネーターであり、リシャーディング操作の各フェーズを開始します。
初期化フェーズ
初期化フェーズ中に、リシャーディング コーディネーターはシャーディングされたコレクションの新しいデータ分散を決定します。
クローン フェーズ
クローン フェーズ実行中:
各受信者シャードは、ドナーのシャーディングされたコレクションと同じコレクションオプションを持つ一時的な空のシャーディングされたコレクションを作成します。 この新しいコレクションは、受信者シャードが新しいデータを書き込むターゲットです。 受信者シャードは、インデックスフェーズまで、
_id
インデックス以外のインデックスを作成しません。各受信者シャードは、新しいシャードキーの下で受信者シャードが所有するすべてのドキュメントを含む、ドナー シャードからのコレクションデータを複製します。
インデックス フェーズ
インデックスフェーズでは、各受信者シャードは必要な新しいインデックスをビルドします。 これらには、シャーディングされたコレクションの既存のすべてのインデックスと、新しいシャードキーパターン と互換性のあるインデックス(シャーディングされたコレクションにインデックスがまだ存在しない場合)が含まれます。
適用フェーズとキャッチアップ フェーズ
適用フェーズとキャッチアップフェーズ中:
各受信者シャードは、受信者がデータをクローンした後に対応するドナー シャードに書込まれたoplogエントリの適用を開始します。
リシャーディング操作を完了するための残り時間が 2 秒未満の場合、ドナー シャードはソースコレクションへの書込みをブロックします。
注意
必要に応じて、 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() } } ] })