定義
rewriteCollection同じシャードキーを使用して、シャーディングされたコレクションをディスクに書き換えます。
このコマンドを使用して、シャードを追加または削除するときにデータを再配布したり、ディスク領域を再利用したりします。
進行中のコレクション書き込みを停止するには、
abortRewriteCollectionコマンドを使用します。バージョン8.3の新機能。
互換性
このコマンドは、次の環境でホストされている配置で使用できます。
MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです
注意
このコマンドは、すべての MongoDB Atlas クラスターでサポートされています。すべてのコマンドに対する Atlas のサポートについては、「サポートされていないコマンド」を参照してください。
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
構文
このコマンドの構文は、次のとおりです。
db.adminCommand( { rewriteCollection: "<database>.<collection>", numInitialChunks: <int>, zones: <zones> } )
コマンドフィールド
このコマンドは、次のフィールドを使用します。
フィールド | タイプ | 説明 |
|---|---|---|
| string | 必須。書き換えるデータベースとコレクションの名前。 |
| integer | 任意。コレクション を再シャーディングするために使用する初期チャンクの数。デフォルトは 90 です。 |
| 配列 | 任意。シャードキーの ゾーン を指定するドキュメント。 |
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のドキュメントを参照してください。
書き換えの制限
コレクションでAtlas Searchが使用されている場合、操作の完了後に検索インデックスは使用できなくなります。これを復元するには、検索インデックスを 手動で再ビルドします。
Queryable 暗号化を使用するコレクションはサポートされていません。
アクセス制御
rewriteCollectionコマンドには、書き換えるクラスターまたはデータベースとコレクションに対するrewriteCollection 特権アクションが必要です。
この特権アクションは、次のロールを持つユーザーも使用できます。
例
コレクションを書き換えるには、次の コマンドを実行します。
db.adminCommand( { rewriteCollection: "sales.orders" } )