定義
rewriteCollection同じシャードキーを使用して、シャーディングされたコレクションをディスクに書き換えます。
このコマンドを使用して、シャードを追加または削除するときにデータを再配布したり、ディスク領域を再利用したりします。
進行中のコレクションの書込みを停止するには、
abortRewriteCollectionコマンドを使用します。バージョン8.3の新機能。
互換性
このコマンドは、次の環境でホストされている配置で使用できます。
- 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( { rewriteCollection: "<database>.<collection>", numInitialChunks: <int>, zones: <zones> } )
コマンドフィールド
このコマンドは、次のフィールドを使用します。
フィールド | タイプ | 説明 |
|---|---|---|
| string | 必須。書き換えるデータベースとコレクションの名前。 |
| integer | 任意.コレクション を再シャーディングするために使用する初期チャンクの数。デフォルトは 90 です。 |
| 配列 | 任意.document がシャードキーの ゾーン を指定する。 |
Considerations
コレクションのリビルド を開始する前に、次の要件を満たしていることを確認してください。
アプリケーションは、影響を受けるコレクションが書込みをブロックする期間を2 秒許容できます。 書込み (write) がブロックされている期間中、アプリケーションのレイテンシが増加します。
ワークロードがこの要件を許容できない場合は、代わりにシャードキーの改良を検討してください。
データベースが次のリソース要件を満たしている。
各受信者シャードで使用可能なストレージ領域が、少なくとも書き換えるコレクションのストレージサイズとその合計インデックスサイズの 2 倍をシャード数で割ったものであることを確認します。
( ( collection_storage_size + index_size ) * 2 ) / shard_count = storage_req 例、ストレージサイズが 2 TB データと 400 GB インデックスのコレクションを考えてみましょう。これを 4 つのシャードに分散するには、次のものが必要です。
( ( 2 TB collection + 0.4 TB index ) * 2 ) / 4 shards = 1.2 TB storage このコレクションを書き換えるには、各シャードに 1.2 が必要です利用可能なストレージの TB
MongoDB Atlasでは、 再書込み操作のために次の階層のストレージにアップグレードする必要がある場合があります。操作が完了したらダウングレードできます。
I/Oキャパシティーが50 % 未満であることを確認します。
CPU 負荷が80 % 未満であることを確認します。
重要
これらの要件はデータベースによって強制されません。 十分なリソースを割り当てられない場合、次の結果が発生する可能性があります。
データベースの容量が不足し、シャットダウンした
パフォーマンスの低下
操作に予想よりも時間がかかる
アプリケーションにトラフィックが少ない期間がある場合は、可能であれば、その時間中にコレクションに対してこの操作を実行します。
リシャーディングの前に、新しいシャードキーにインデックスを作成する必要はありません。リシャーディング操作、インデックスフェーズ中に必要なインデックスが自動的に構築されます。
インデックスのビルドは進行中ではありません。インデックスビルドが実行中どうかを確認するには、
$currentOpを使用します。db.getSiblingDB("admin").aggregate( [ { $currentOp : { idleConnections: true } }, { $match: { $or: [ { "op": "command", "command.createIndexes": { $exists: true } }, { "op": "none", "msg": /^Index Build/ } ] } } ] ) 結果ドキュメントでは、
inprogフィールド値が空の配列の場合、インデックスビルドは進行中ではありません。{ inprog: [], ok: 1, '$clusterTime': { ... }, operationTime: <timestamp> }
注意
書き換え操作は書き込み集中型のプロセスであり、 oplogのレートが増加する可能性があります。次のことをしたい場合があります。
固定の oplog サイズを設定して、oplog の無制限の増加を防ぎます。
oplog サイズを増やして 1 つ以上のセカンダリ ノードが古くなる可能性を最小限に抑えます。
詳細については、レプリカセットoplogのドキュメントを参照してください。
書き換えの制限
If the collection uses Atlas Search, the search index becomes unavailable after the operation completes. To restore it, manually rebuild the search index.
Queryable 暗号化を使用するコレクションはサポートされていません。
アクセス制御
rewriteCollection コマンドには、書き換えるクラスターまたはデータベースとコレクションに対する rewriteCollection 権限アクションが必要です。
この権限アクションは、次のロールを持つユーザーも使用できます。
例
コレクションを書き換えるには、次の コマンドを実行します。
db.adminCommand( { rewriteCollection: "sales.orders" } )