チャンクを使用したデータのパーティショニング
MongoDB はコレクションに関連付けられたシャードキーを使用してデータをチャンクに分割します。 チャンクは、シャーディングされたデータのサブセットで構成されます。 各チャンクは、シャードキー に基づいて、下限が含まれる範囲と上限が含まれない範囲を持っています。
MongoDB では、構成されたチャンク サイズを超えた場合にチャンクを分裂させます。 挿入と更新の両方によってチャンクの分裂がtriggerされます。
チャンクが表現できる最小の範囲は、一意のシャードキー値 1 件です。 シャードキー値が 1 つのドキュメントのみを含むチャンクは分割できません。
最初のチャンク
入力済みのコレクション
シャーディング操作では、シャードキー値の全範囲をカバーする初期チャンクが作成されます。 作成されるチャンクの数は、構成されたチャンク サイズによって異なります。
最初のチャンク作成後、必要に応じて、バランサーはこれらの最初のチャンクをシャード全体に移行し、将来のチャンク分散を管理します。
空のコレクション
空、または存在しないコレクションに対してゾーンとゾーン範囲が定義されている場合。
シャーディング操作では、定義されたゾーン範囲の空のチャンクと、シャードキー値の全範囲をカバーする追加のチャンクが作成され、ゾーン範囲に基づいて初期チャンク分散が実行されます。このようにチャンクを最初に作成して分散することで、ゾーン シャーディングの設定を迅速に行うことができます。
初期分散後、バランサーは今後のチャンク分散を管理します。
空、または存在しないコレクションにゾーンとゾーン範囲が定義されていない場合。
ハッシュされたシャーディングの場合:
シャーディング操作では、シャードキー値の全範囲をカバーする空のチャンクが作成され、初期チャンクの分散が実行されます。デフォルトでは、この操作はシャードごとに 2 つのチャンクを作成し、クラスター全体に移行します。
numInitialChunks
オプションを使用すると、異なる初期チャンク数を指定できます。このように初期チャンクを作成して分散することで、シャーディングの設定を迅速に行うことができます。初期分散後、バランサーは今後のチャンク分散を管理します。
範囲シャーディングの場合:
シャーディング操作では、シャードキー値の全範囲をカバーする空のチャンクが 1 つ作成されます。
最初のチャンク作成後、必要に応じて、バランサーによって最初のチャンクがシ複数のシャードに移行されます。また、将来のチャンク分散もバランサーで管理されます。
チャンク サイズ
MongoDB のデフォルトのチャンクサイズは 64 メガバイトです。 チャンクのサイズは増減させることが できます。 デフォルトのチャンク サイズを変更した場合の影響を検討します。
チャンクが小さいと、移行の頻度が増える代わりに、データがより均等に分散されます。 これにより、クエリルーティング(
mongos
)層でコストが発生します。チャンクが大きいほど、移行の頻度は減ります。 これはネットワークの観点、およびクエリルーティング層の内部オーバヘッドの観点の 両面で より効率的です。 ただし効率性と引き換えに、データの分散は不均等になる可能性があります。
チャンクのサイズは、移行するチャンクあたりの最大ドキュメント数 に影響します。
チャンク サイズは、既存の コレクションをシャーディングする場合、最大コレクション サイズに影響します。 シャーディング後は、 チャンク サイズ はコレクション サイズを制限しません。
多くの配置では、データセットの分散がやや不均等になる可能性と引き換えに、頻度が高く誤りが生じる可能性のある移行を避ける方が理にかなっています。
制限
チャンク サイズを変更すると、チャンクの分割時に影響しますが、その効果にはいくつか制限があります。
自動分割は、挿入または更新中にのみ発生します。 チャンク サイズを小さくすると、すべてのチャンクが新しいサイズに分割されるまでに時間がかかる可能性があります。
分裂を「元に戻す」ことはできません。 チャンク サイズを増やす場合、既存のチャンクが新しいサイズになるまで、挿入またはアップデートによって拡張される必要があります。
チャンクの分裂
分割は、チャンクが大きくなりすぎるのを防ぐプロセスです。 チャンクが指定された チャンク サイズを超えた場合、またはチャンク内のドキュメント数が 移行するチャンクあたりの最大ドキュメント数 を超えた場合、MongoDB は、チャンクが表す シャードキー 値に基づいてチャンクを分割します。 必要に応じて、 チャンク は複数のチャンクに分割できます。 挿入と更新により分裂がtriggerされる可能性があります。 分割は効率的なメタデータの変更です。 分裂を作成するために、MongoDB はデータを移行したり、シャードに影響を与えたりすることはありません。
分裂により、コレクションのチャンクがシャード間で不均一に分散する可能性があります。 このような場合、バランサーはシャード全体にチャンクを再分配します。 シャード間でチャンクのバランシングの詳細については、「クラスター バランサー」を参照してください。
チャンク移行
MongoDB では、 シャーディングされたクラスター 内の チャンクが移行 され、シャーディングされたコレクションのチャンクをシャード間で均等に分散します。 移行は次のいずれかの手段で行います。
手動一括挿入の間ににデータを分散する場合など、限られた場合にのみ手動移行を使用します。詳細についてはチャンクの手動移行を参照してください。
シャーディングされたクラスターのバランサーの詳細については、 シャーディングされたクラスターのバランサーを参照してください。
バランシング
バランサーは 、チャンクの移行を管理するバックグラウンドプロセスです。 最大シャードと最小シャードのチャンク数の差が移行しきい値を超えると、バランサーにより複数のクラスターにわたるチャンクの移行が開始され、データの均等な分散が維持されます。
バランサーの一部の要素を管理 することができます。 また、バランサーは、シャーディングされたクラスターの構成 ゾーン の一部として作成されたどの ゾーン も尊重します。
バランサーの詳細についてはシャーディングされたクラスターのバランサーを参照してください。
不可分 / ジャンボチャンク
場合によっては、チャンクは指定されたチャンク サイズを超えて大きくなりますが、分裂することはありません。 最も一般的なシナリオは、チャンクが単一のシャードキー値を表す場合です。 チャンクは分裂しないため、チャンク サイズを超えて拡大し続け、ジャンボチャンクになります。 これらのジャンボチャンクは、シャードキー値の発生する頻度 が高い場合、増加するにつれてパフォーマンスのボトルネックになる可能性があります。
MongoDB 5.0 以降では、ドキュメントのシャードキーを変更することでコレクションの再シャーディングが可能です。
MongoDB はrefineCollectionShardKey
コマンドを提供します。 コレクションのシャードキーを調整すると、よりきめの細かいデータ分散が可能になり、既存のキーの濃度が不十分でジャンボチャンクが発生する状況に対応できます。
コレクションを再シャーディングすべきか、シャードキーを改善すべきかについては、シャードキーの変更を参照してください。
詳細については、以下を参照してください。
moveChunk
ディレクトリ
MongoDB 2.6 と MongoDB 3.0 では、 sharding.archiveMovedChunks
はデフォルトで有効になっています。 他のすべての MongoDB バージョンでは、これはデフォルトで無効になっています。 sharding.archiveMovedChunks
を有効にすると、ソースシャードは移行したチャンク内のドキュメントを、storage.dbPath
のmoveChunk
ディレクトリの下にあるコレクション名前空間にちなんで命名されたディレクトリにアーカイブします
移行中にエラーが発生した場合、これらのファイルは、移行中に影響を受けたドキュメントを回復するのに役立つ可能性があります。
移行が正常に完了し、これらのファイルからドキュメントを復元する必要がなくなったら、これらのファイルを安全に削除できます。 または、リカバリに使用できるデータベースの既存のバックアップがある場合は、移行後にこれらのファイルを削除することもできます。
すべての移行が完了しているかどうかを確認するには、sh.isBalancerRunning()
インスタンスに接続した状態でmongos
を実行します。