MongoDB は、バランサー プロセスを通じてシャード間のデータ移行を処理します。バランサーは、シャードクラスター内のシャード間でデータが均等に分散されるようにする役割を果たします。シャード間のデータ移行に必要な手順は次のとおりです。
1. バランスをとる
- 自動バランシング: MongoDB は、あるシャードから別のシャードにチャンクを移行することにより、データのバランスを自動的に調整します。これにより、データがシャード全体に均等に分散されます。
2. チャンクの移行
- 手動移行: MongoDB は、特定のコレクションに対して手動でチャンク移行を実行できます。これは、一括挿入中にデータを分散する場合に便利です。
3. 範囲の移行
- 自動範囲移行: MongoDB は一度に 1 範囲ずつデータを移行します。バランサーは、現在の移行の削除フェーズが完了するのを待たずに、次の範囲の移行を開始します。
4. リシャーディング
- リシャードからシャードへの手法: MongoDB はリシャーディングを使用して、クラスター内のシャード全体にデータを迅速に分散します。これには、目的のシャード キーとは異なる一時的なシャード キーに意図的にシャーディングし、その後、目的のシャード キーに再シャーディングすることが含まれます。
5. チャンクの移行手順
- ソース シャード: ソース シャードは、内部コマンドを受信すると移動を開始します。移行プロセス中に、チャンクに対する操作がソース シャードに送信されます。
- 宛先シャード:宛先シャードは、宛先に存在しないソースで必要なインデックスを構築します。宛先シャードはチャンク内のドキュメントのリクエストを開始し、データのコピーの受信を開始します。
- 同期: チャンク内の最終ドキュメントを受信した後、宛先シャードは同期プロセスを開始し、移行中に発生した移行ドキュメントへの変更が確実に反映されるようにします。
- メタデータ更新: ソース シャードは構成データベースに接続し、チャンクの新しい場所でクラスターのメタデータを更新します。
- 削除フェーズ: ソース シャードがメタデータの更新を完了し、チャンク上で開いているカーソルがなくなると、ソース シャードはドキュメントのコピーを削除します[3][5]。
6. ジャンボ チャンク
- ジャンボ チャンク: チャンクが最大サイズを超えるか、チャンク内のドキュメントの数が許可される最大値を超える場合、MongoDB はチャンクを移行しません。代わりに、MongoDB はチャンクの分割を試みます。分割が失敗した場合、MongoDB はチャンクの移行が繰り返し試行されるのを避けるために、チャンクにジャンボとしてラベルを付けます [3]。
7. 監視とメンテナンス
- 監視: MongoDB は、バランサー プロセスを監視し、データがシャード全体に均等に分散されていることを確認するツールを提供します。
- メンテナンス: MongoDB は、バランサーを管理し、データ移行が効率的かつスケーラブルであることを保証するためのコマンドを提供します。
### 結論
MongoDB は、バランサー プロセスを通じてシャード間のデータ移行を処理します。これにより、シャード クラスター内のシャード間でデータが均等に分散されます。バランサーは一度に 1 範囲ずつデータを移行し、MongoDB はバランサー プロセスを監視および管理するツールを提供します。
引用:[1] https://stackoverflow.com/questions/48438644/migration-data-between-shards-with-mongodb
[2] https://hackernoon.com/optimize-data-migration-in-mongodb-resharding-techniques-for-speed-and-scalability
[3] https://www.mongodb.com/docs/v3.0/core/sharding-chunk-migration/
[4] https://www.mongodb.com/community/forums/t/shard-migration-leads-to-service-disruption/247228
[5] https://www.mongodb.com/docs/v6.2/core/sharding-balancer-administration/