MongoDB はコレクションに関連付けられた シャードキーを使用して、データを特定のシャードが所有するチャンクに分割します。チャンクは、シャーディングされたデータの範囲で構成されます。各チャンクにはシャードキーに基づく包括的下限と排他的上限があります。
チャンクが表現できるデータの最小単位は、ユニークなシャードキー値 1 件です。
最初のチャンク
入力済みのコレクション
シャーディング操作では、すべてのシャードキー値をカバーする大きな初期チャンクが 1 件作成されます。
初期チャンクの作成後、データのバランシングが必要になった時に、バランサーによって最初のチャンクから一定の範囲が分割されます。
空のコレクション
空、または存在しないコレクションに対してゾーンとゾーン範囲が定義されている場合。
シャーディング操作では、定義されたゾーン範囲の空のチャンクと、シャードキー値の全範囲をカバーする追加のチャンクが作成され、ゾーン範囲に基づいて初期チャンク分散が実行されます。このように初期チャンクを作成して分散することで、 ゾーンシャーディングの設定を迅速に行うことができます。
初期分散後、バランサーは今後のチャンク分散を管理します。
空、または存在しないコレクションにゾーンとゾーン範囲が定義されていない場合。
ハッシュされたシャーディングの場合:
シャーディング操作では、シャードキー値の全範囲をカバーする空のチャンクが作成され、初期チャンクの分散が実行されます。デフォルトでは、この操作はシャードごとに 2 つのチャンクを作成し、クラスター全体に移行します。
初期分散後、バランサーは今後のチャンク分散を管理します。
範囲シャーディングの場合:
シャーディング操作では、シャードキー値の全範囲をカバーする空のチャンクが 1 つ作成されます。
最初のチャンク作成後、必要に応じて、バランサー最初のチャンクがシ複数のシャードに移行され、将来のチャンク分散がバランサーで管理されます。
範囲サイズ
MongoDB のデフォルトの範囲サイズは 128 メガバイトです。チャンクのサイズは増減させることができます。デフォルトのチャンク サイズを変更した場合の影響を検討します。
範囲サイズが小さいと、移行の頻度が増える代わりに、データがより均等に分散されるため、クエリルーティング(
mongos)レイヤーのオーバーヘッドが増加します。範囲サイズが大きければ、移行の頻度は減り、 クエリルーティングレイヤーのネットワークと内部のオーバーヘッドは減りますが、データの分散が不均等になる可能性があります。
範囲サイズは、移行する範囲ごとの最大ドキュメント数に影響します。
ほとんどの配置では、頻繁に移行を行うより、データ分散がわずかに不均等になる方が適しています。
範囲の移行
MongoDB では、シャーディングされたクラスター内のデータ範囲が移行され、シャーディングされたコレクションのデータをシャード間で均等に分散します。 移行は次のいずれかの手段で行います。
手動一括挿入の間ににデータを分散する場合など、限られた場合にのみ手動移行を使用します。詳細についてはチャンクの手動移行を参照してください。
シャーディングされたクラスターのバランサーの詳細については、 シャーディングされたクラスターのバランサーを参照してください。
バランシング
バランサーは、データの移行を管理するバックグラウンドプロセスです。最大シャードと最小シャードのデータの差が移行しきい値を超えると、バランサーにより複数のクラスターにわたるデータの移行が開始されます。
バランサーの一部の要素を管理することができます。また、バランサーは、シャーディングされたクラスターの構成ゾーンの一部として作成されたどのゾーンも尊重します。
バランサーの詳細についてはシャーディングされたクラスターのバランサーを参照してください。
バランス調整のための再シャーディング
sh.shardCollection() メソッドを実行すると、バランサークラスター内の他のシャードへのコレクションデータの分散が開始されます。単一のシャードが一度に参加できるチャンク移行には、1 つのシャードのみです。MongoDB があるシャードから別のシャードにデータ範囲のコピーが成功すると、ドナー シャードの範囲は 範囲削除 によって削除対象としてマークされます。このプロセスは遅く、リソースを集中的に消費します。
MongoDB 8.0 以降では、配置が リソース要件 を満たしている場合は、sh.shardAndDistributeCollection() メソッドを使用してコレクションをシャーディングすることをお勧めします。このメソッドは、shardCollection コマンドと reshardCollection コマンドをラップしてコレクションをシャードし、すぐに同じキーに再シャードします。これにより、 MongoDB はバランサーを待たずにシャード間でデータを再バランス化します。
詳細については、「同じシャードキーへの再シャーディング」を参照してください。
不可分 / ジャンボチャンク
指定のチャンク サイズを超えて大きくなるが分裂できないチャンクは、ジャンボチャンクと呼ばれます。最も一般的な原因は、チャンクが単一のシャードキー値を表す場合です。シャードキー値の発生する 頻度 が高い場合、 ジャンボ チャンクはパフォーマンスのボトルネックになる可能性があります。
MongoDB 5.0 以降では、ドキュメントのシャードキーを変更することでコレクションの再シャーディングが可能です。
refineCollectionShardKey コマンドは、よりきめの細かいデータ分散を可能にし、シャードキーの濃度が不十分なために発生する ジャンボ チャンクを解決できます。
コレクションを再シャーディングすべきか、シャードキーを改善すべきかについては、シャードキーの変更を参照してください。
詳細については、以下を参照してください。