MongoDBは、主にChunk Migrationと呼ばれるプロセスを介してシャード間のデータ移行を処理します。これは、クラスター内の複数のシャードにデータを均等に配布するように設計されたシャードアーキテクチャの不可欠な部分です。 MongoDBでのシャードは、複数のサーバーまたはシャードにデータを分割することにより、データベースを水平にスケーリングするために使用される方法です。このシステムは、データの分布を決定するドキュメント内のフィールドまたはフィールドのセットであるシャードキーを活用します。シャード間のデータ移行を管理するために、MongoDBはBalancerと呼ばれるバックグラウンドプロセスを使用します。これは、必要に応じてデータ範囲(またはチャンク)を移行することによりデータ分布を最適化します。
###シャードクラスターとチャンク移行の概要
Mongodbは、シャードコレクションをチャンクに分割します。これは、シャードキー値の隣接する範囲です。各チャンクは特定のシャードに属し、これらのチャンクはデータセット全体をまとめて保持します。バランサーは、破片を横切るチャンクの分布を監視し、バランスを維持するためにシャード間でチャンクを移動します。この移行メカニズムは、ホットスポットを回避し、クエリのパフォーマンスを改善し、リソースの利用を最適化するのに役立ちます。
チャンク移行は、新しい破片がクラスターに追加された場合、データが不均一に成長して不均衡を引き起こす場合、またはデータの局所性または規制要件のためにゾーンを再定義する必要がある場合など、シナリオで有益です。移行はチャンクレベルで動作し、1つのシャードから別のシャードにシャードキー値の全範囲を移動します。
###移行プロセスの詳細
Mongodbのチャンク移行はいくつかの段階で機能します:
1。移動するチャンクの選択:バランサーまたは管理者は、クラスターのバランスをとるために別のシャードに再割り当てする必要があるチャンクを選択します。
2。クローン相:ドナーシャード(現在チャンクを保持しているもの)は、チャンク内のすべてのドキュメントを受信者の破片にコピーします。この間、ドナーの破片の塊に新しい書き込みも追跡されます。
3。キャッチアップフェーズ:レシピエントシャードは、クローンフェーズで発生したワイトを適用して、最新のデータを確実に持っていることを確認します。
4.重要なセクションとコミット:ドナーの破片は、チャンクへの書き込み操作が一時的にブロックされ、チャンク所有権が原子的にレシピエントシャードに切り替えられる重要なセクションに入ります。
5.削除フェーズ:ドナーの破片は、受信者がチャンクを正常にコミットしたことを確認すると、移動したチャンクに属する文書を非同期に削除します。
バランサーは、シャードあたりの移動が一度に1つの移動のみが発生することを保証し、シャードのパフォーマンスへの影響を最小限に抑えます。独立している場合、異なるシャードペア全体で並行して複数の移行を実行できます。
###自動バランサー
Balancerは、構成サーバープライマリノードの背景スレッドとして実行され、Shardデータバランスを常に監視しています。チャンクあたりのデータサイズを追跡して、構成可能なバランスしきい値に従って移行が必要かどうかを判断します。シャード間のデータサイズの違いがこのしきい値を超えると、バランサーは移行を開始します。
バランサーは、アプリケーションに対してほとんど透明な方法で動作しますが、メンテナンスまたはチューニングの目的で一時的に無効にすることができます。また、クラスター内で構成されたゾーンを尊重し、適切なゾーン境界内でチャンクが移行するようにします。
###マニュアル移行コマンド
Balancerはチャンク移行を自動化しますが、Mongodbでは、「Movechunk」や「Moverange」などのコマンドを使用して手動制御も許可しています。これらのコマンドにより、特定のチャンクまたはチャンク範囲の移行が1つのシャードから別のシャードへの移行を強制します。
- 「Movechunk」は、特定のシャードのキー値を含むチャンクを指定されたシャードに移行するために使用されます。これは、負荷分散またはデータの局所性のターゲット移行に役立ちます。
- 「Moverange」は、より複雑なデータのリバランス戦略に役立つ、隣接する範囲のシャードキーを移行することを可能にします。
管理者は、これらのコマンドを使用して、プリスプリットチャンクを使用して、バルク摂取の前にデータを均等に配布したり、ウィンドウの制約のバランスをとったりすることによって引き起こされる移行の障害を解決することができます。
###孤立したドキュメントと一貫性の処理
チャンク移行中および後に、孤児の文書(ドナーシャードに割り当てられたチャンク範囲に属しなくなった文書)は、掃除されるまでドナーシャードに一時的に存在する場合があります。
MongoDBは、操作を順番に適用し、重要なセクションで書き込みをブロックする調整メカニズムを使用することにより、移行全体の一貫性を保証します。移行後、孤児のクリーンアップは、進行中のクエリへの干渉を避けながら、非同期に実行されます。
MongoDB 5.3を開始すると、変更ストリームは、移行中に孤立したドキュメントの更新のためのイベントを生成し、イベントストリームの精度を維持します。
###パフォーマンスと運用への影響
チャンク移動には、ネットワーク帯域幅の消費、CPU、およびクラスターのパフォーマンスに影響を与える可能性のあるディスクI/Oを含むオーバーヘッドがあります。 mongodbは次のことでこの影響を最小限に抑えます
- シャードの参加を一度に1つの移行に制限します。
- 移行をキューイングし、削除フェーズを重複して実行して、より速く荷降ろしすることができます。
- スロットリングオプションを使用して、移行の同時性を調整し、移行中に懸念を書きます。
移行データはまた、Orphan Cleanupフェーズ中にドキュメントを見逃す可能性のある二次読み取りにも影響を与えるため、クエリを設計する際にアプリケーションを考慮する必要があります。
###特定のシナリオでの移行
タグ範囲のゾーン間でデータを移行するなどの場合、またはシェルドされていないセットアップからシャーディングセットアップまで、MongoDBは、再構成後の更新されたシャードキー範囲またはゾーンに基づいて徐々にデータを移行します。たとえば、古いタグの範囲を削除し、新しいものを作成すると、バランサーの移行がトリガーしてデータを移動します。
MongoDBクラスターをクラウド管理されたソリューションに移動するとき、またはシャードクラスター間で、移行ツールはしばしばシャードごとの移行を実行し、シャードキー分布を維持しながらシャードデータを個別にコピーします。
###移行のツールとユーティリティ
データ送信サービス(DTS)およびその他のサードパーティツールは、MongoDBインスタンスまたはクラスター間でデータを移行し、シャーディングマッピング、データの一貫性、および増分更新を処理するのに役立ちます。これらのツールは、多くの場合、デフォルトのシャードキー値をシャードキーを欠くデータにソースデータに割り当てることにより、非シェードからシャードクラスターへの移行をサポートします。
###キーポイントの概要
-MongoDBは、シャードキーを使用してシャード全体に配布されるチャンクにデータを分割します。
- バランサーは自動的にチャンクを移行して、バランスの取れたデータ分布を維持します。
- 移行には、データのクローニング、キャッチアップの書き込み、原子ハンドオーバー、および非同期クリーンアップが含まれます。
- システムの影響を減らすために、移動はシャードごとに1つに制限されています。
- 手動移行コマンドは、チャンク分布のための管理制御を提供します。
- 孤児の文書は、移住後に非同期に掃除されます。
- 移行は、パフォーマンスと二次読み取りの一貫性に一時的に影響します。
- ゾーン間の移行またはシャードキー範囲の変化は、移行をトリガーする再構成によって処理されます。
- 移行ツールは、クラスターまたはアーキテクチャ間のデータの動きを支援します。
この移行メカニズムにより、MongoDBクラスターは、データが成長し、クラスターの構成が進化するにつれてバランスが取れ、スケーラブルで、パフォーマンスが発生し、アプリケーションの破壊を最小限に抑えて継続的な可用性を提供します。