シャーディング
項目一覧
シャーディングは複数のマシンにデータを分散するメソッドです。MongoDB はシャーディングを使用して、非常に大規模なデータセットと高スループット操作を伴う配置をサポートします。
データベース システムで大規模なデータセットまたは高スループットのアプリケーションを扱う場合、単一サーバーの容量が限界に達する可能性があります。たとえば、クエリ レートが高い場合、サーバーの CPU 容量が枯渇する可能性があります。ワーキングセットのサイズがシステムの RAM よりも大きい場合、ディスクドライブの I/O 容量に負荷がかかります。
システム拡大への対処方法には、垂直スケーリングと水平スケーリングの 2 通りあります。
垂直スケーリングには、より強力な CPU の使用、RAM の追加、ストレージ容量の増加など、単一サーバーの容量を増やすことが含まれます。利用可能なテクノロジーが限定的な場合、単一マシンは特定のワークロードにとって十分強力でない可能性があります。さらに、クラウドベースのプロバイダーには、利用可能なハードウェア構成に基づいた厳格な上限があります。その結果、垂直方向のスケーリングには実質的な上限があります。
水平スケーリングでは、システム データセットと負荷を複数のサーバーに分割し、必要に応じてサーバーを追加して容量を増やします。単一マシンの全体的な速度や容量は高くないかもしれませんが、各マシンが全体的なワークロードのサブセットを処理するため、単一の高速で大容量のサーバーよりも効率が向上する可能性があります。配置の容量を拡張するには、必要に応じてサーバーを追加するだけで済むため、1 台のマシン用にハイエンドのハードウェアを使用する場合よりも全体コストを抑えることができます。その反面、配置用インフラストラクチャとメンテナンスの複雑さは増します。
MongoDB はシャーディングによる水平スケーリングをサポートしています。
MongoDB Atlas 内でホストされている配置に対して、UIでコレクションをシャードできます。
シャーディングされたクラスター
MongoDB のシャーディングされたクラスターは、次の要素で構成されます。
シャード: 各シャードには、シャーディングされたデータのサブセットが含まれています。各シャードはレプリカセットとして配置する必要があります。
mongos :
mongos
はクエリ ルーターとして機能し、クライアント アプリケーションとシャーディングされたクラスター間のインターフェースとなります。レイテンシを最小限に抑えるために、mongos
ではヘッジされた読み取りをサポートしています。コンフィギュレーションサーバー: コンフィギュレーションサーバーは、クラスターのメタデータと構成設定を保存します。 コンフィギュレーションサーバーは レプリカセット (CSRS) としてデプロイする必要があります。
以下では、シャーディングされたクラスター内のコンポーネントの相互作用を図説しています。
MongoDB はコレクションレベルでデータをシャーディングし、クラスター内のシャード全体にコレクション データを分散します。
シャードキー
MongoDB はシャードキーを使用して、コレクション内のドキュメントをシャード全体に分散します。シャードキーは、ドキュメント内の 1 つまたは複数のフィールドで構成されます。
シャーディングされたコレクション内のドキュメントには、シャードキー フィールドが欠落していることがあります。欠落しているシャードキー フィールドは、ドキュメントをシャード間で分散する場合は null 値として扱われますが、クエリをルーティングする場合は null 値として扱われません。詳細については、「欠落しているシャードキー フィールド」を参照してください。
コレクションのシャーディング時に、シャードキーを選択します。
MongoDB 5.0 以降、ドキュメントのシャードキーを変更することでコレクションの再シャーディングが可能です。
既存のシャードキーにサフィックス フィールドを追加することで、シャードキーを調整できます。
ドキュメントのシャードキー値によってシャード間での分散が決定します。ドキュメントのシャードキー値は、シャードキー フィールドが不変の _id
フィールドでない限り、更新できます。詳細については、「ドキュメントのシャードキー値の変更」を参照してください。
シャードキー インデックス
入力されるコレクションには、シャードキーで始まるインデックスがシャーディングするために必要になります。MongoDB は、空のコレクションのシャーディング時に、特定のシャードキーに適したインデックスがそのコレクションにまだない場合、サポート用インデックスを作成します。詳細については、「シャードキー インデックス」を参照してください。
シャードキー戦略
シャードキーの選択は、シャーディングされたクラスターのパフォーマンス、効率、スケーラビリティに影響します。 可能な限り最高のハードウェアとインフラストラクチャを持つクラスターは、シャードキーの選択によってボトルネックが発生する可能性があります。 シャードキーとそのバッキング インデックスの選択は、クラスターが使用できるシャーディング戦略にも影響する可能性があります。
チャンク
MongoDB はシャーディングされたデータをチャンクに分割します。各チャンクは、シャードキーに基づいて、下限が含まれる範囲と上限が含まれない範囲を持っています。
バランサーと均等なデータ分散
クラスター内のすべてのシャード間でデータを均等に分散するために、バランサーがバックグラウンドで実行され、範囲がシャード間で移行されます。
シャーディングの利点
読み取り / 書込み
MongoDB はシャーディングされたクラスター内のシャード全体に読み取りおよび書込みのワークロードを分散し、各シャードがクラスター操作のサブセットを処理できるようにします。シャードを追加することで、読み取りと書込みの両方のワークロードをクラスター全体で水平方向にスケーリングできます。
シャードキー、または複合シャードキーのプレフィックスを含むクエリの場合、mongos
は特定のシャードまたはシャードのセットをクエリの対象にすることができます。これらのターゲット操作は、通常、クラスター内のすべてのシャードにブロードキャストするよりも、効率的です。
レイテンシを最小限に抑えるために、mongos
ではヘッジされた読み取りをサポートしています。
ストレージ容量
シャーディングはクラスター内のシャード全体にデータを分散する操作であり、クラスターの全データのサブセットを各シャードに含めることができます。データセットが大きくなるにつれてシャードが追加され、クラスターのストレージ容量が増大します。
高可用性
レプリカセットとしてコンフィギュレーションサーバーとシャードを配置すると可用性が向上します。
1 つ以上のシャード レプリカセットが完全に利用できなくなった場合でも、シャーディングされたクラスターは引き続き読み取りと書込みを部分的に実行できます。つまり、利用できないシャード上のデータにはアクセスできませんが、利用可能なシャードでは読み取りや書込みは引き続き成功します。
シャーディング前の考慮事項
シャーディングされたクラスターのインフラストラクチャの要件と複雑さには、慎重な計画、実行、メンテナンスが必要です。
MongoDB には、いったんシャーディングされたコレクションで、シャーディングを解除するメソッドがありません。
コレクションの再シャーディングは後でも可能ですが、スケーラビリティやパフォーマンスの問題を回避するために、シャードキーの選択を慎重にすることが重要になります。
コレクションをシャーディングするための運用上の要件と制限については、「シャーディングされたクラスターの運用上の制限」を参照してください。
クエリにシャードキーまたは複合シャードキーのプレフィックスが含まれない場合、mongos
はブロードキャスト操作を実行し、シャーディングされたクラスター内のすべてのシャードにクエリを実行します。このようなスキャッター/ギャザー クエリは、操作の実行時間が長引く可能性があります。
MongoDB 5.1 以降では、起動、再起動、または追加する際に、 で シャードサーバー sh.addShard()
を起動、再起動、または追加する際に、 クラスター全体の書込み保証(CWWC) を設定する必要があります。
CWWC
が設定されておらず、デフォルトの書込み保証(write concern)が{ w : 1 }
になるようにシャードが構成されている場合、シャード サーバーは起動または追加に失敗し、エラーが返されます。
デフォルトの書込み保証(write concern)の詳細な計算方法については、「デフォルトの書込み保証の計算」を参照してください。
注意
MongoDB とのサポート契約が有効な場合は、シャード化クラスターの計画および配置に関する支援を受けるために、アカウント担当者に連絡することを検討してください。
シャーディングされたコレクションとされていないコレクション
シャーディングされたコレクションとシャーディングされていないコレクションがデータベースに混在している場合があります。シャーディングされたコレクションは分割され、クラスター内のシャード全体に分散されます。シャーディングされていないコレクションは、プライマリシャードに保存されます。各データベースには、独自のプライマリシャードがあります。
シャーディングされたクラスターへの接続
シャーディングされたクラスター内の任意のコレクションとやり取りするには、mongos ルーターに接続する必要があります。これには、、シャーディングされたコレクションだけでなく、シャーディングされていないコレクションも含まれます。読み取りまたは書込み操作を実行するには、クライアントを単一シャードに接続しないでください。
または MongoDBmongos
mongod
mongosh
ドライバー を使用して に接続するのと同じ方法で に接続できます。
シャーディング戦略
MongoDB はシャーディングされたクラスター全体にデータを分散するための 2 つのシャーディング戦略をサポートしています。
ハッシュされたシャーディング
ハッシュされたシャーディングでは、まず、シャードキー フィールドの値のハッシュが計算されてから、各チャンクにハッシュされたシャードキー値に基づく範囲が割り当てられます。
Tip
MongoDB は、ハッシュされたインデックスを使用してクエリを解決するときに、ハッシュを自動計算するため、アプリケーションでハッシュを計算する必要がありません。
シャードキーの範囲は「近い」場合でも、そのハッシュ値が同じチャンクにある可能性は低くなります。ハッシュ値に基づくデータ分散により、シャードキーが単調に変化するデータセットにおいて、より均一なデータ分散が促進されます。
ただし、ハッシュ値に基づく分散では、シャードキーに基づく範囲ベースのクエリの対象が単一シャードに絞られる可能性が低くなるため、クラスター全体でのブロードキャスト操作が増加します。
詳細については、「ハッシュされたシャーディング」を参照してください。
範囲ベースのシャーディング
範囲ベースのシャーディングでは、まず、シャードキー値に基づいてデータが範囲ごとに分割されます。各チャンクは、その後、シャードキー値に基づいて範囲が割り当てられます。
値が「近い」シャードキーの範囲は、同じチャンクにある可能性が高くなります。これにより、ターゲット操作が可能になり、mongos
は、必要なデータを含むシャードのみに操作をルーティングできます。
範囲ベースのシャーディングの効率は、選択したシャードキーによって異なります。シャードキーを十分に考慮しないと、データ分散が不均一になり、シャーディングの利点が一部損なわれたり、パフォーマンスのボトルネックが発生したりする恐れがあります。詳細については、「範囲ベースのシャーディングでのシャードキー選択」を参照してください。
詳細については、「範囲ベースのシャーディング」を参照してください。
シャーディングされたクラスター内のゾーン
ゾーンは、シャーディングされたクラスターが複数のデータセンターにまたがる場合に、データローカリティを向上させるのに役立ちます。
シャーディングされたクラスターでは、シャードキーに基づきシャーディングされたデータのゾーンを作成できます。各ゾーンはクラスター内の 1 つまたは複数のシャードに関連付けることができ、シャードは任意の数のゾーンに関連付けることができます。MongoDB はバランスの取れたクラスター内で、ゾーンによってカバーされるチャンクをそのゾーンに関連付けられているシャードのみに移行します。
各ゾーンは、1 つ以上の範囲のシャードキー値をカバーします。任意のゾーンがカバーする各範囲は、常に下限を含み、上限を含まない範囲です。
カバーされるゾーンに新しい範囲を定義する場合、シャードキーに含まれるフィールドを使用する必要があります。複合シャードキーを使用する場合、シャードキーのプレフィックスを範囲に含める必要があります。詳細については、「ゾーン内のシャードキー」を参照してください。
シャードキーの選択時には、将来ゾーンがどのように使用される可能性があるかを考慮してください。
Tip
空のコレクションまたは存在しないコレクションをシャーディングする前にゾーンとゾーンの範囲を設定することで、ゾーンシャーディングの設定を迅速化できます。
詳細については、「ゾーン」を参照してください。
シャーディングの照合
shardCollection
コマンドを collation :
{ locale : "simple" }
オプションと併用して、デフォルトの照合があるコレクションをシャーディングします。シャーディングを成功させるには、次の条件を満たす必要があります。
コレクションには、プレフィックスがシャードキーのインデックスが必要です
インデックスには照合が必要です
{ locale: "simple" }
照合を使用して新しいコレクションを作成する場合、コレクションのシャーディング前にこれらの条件が確実に満たされるようにします。
注意
シャーディングされたコレクションに対するクエリでは、そのコレクション向けに構成されたデフォルトの照合を引き続き使用します。シャードキー インデックスの simple
照合を使用するには、クエリの照合ドキュメントに{locale : "simple"}
を指定します。
シャーディングと照合の詳細については、「shardCollection
」を参照してください。
変更ストリーム
MongoDB 3.6 以降では、レプリカセットとシャーディングされたクラスターでストリーム変更を利用できます。ストリーム変更を使用すると、oplog を追尾する複雑さやリスクなく、アプリケーションがリアルタイムデータの変更にアクセスできます。アプリケーションはストリーム変更を使用して、1 つまたは複数のコレクションのすべてのデータ変更をサブスクライブできます。
トランザクション
分散トランザクションの導入により、シャーディングされたクラスターでマルチドキュメントトランザクションが利用できるようになります。
トランザクションがコミットされるまで、トランザクションで行われたデータ変更はトランザクションの外部には表示されません。
ただし、トランザクションが複数のシャードに書き込む場合、すべての外部読み取り操作が、コミットされたトランザクションの結果がシャード全体で表示されるまで待機する必要はありません。たとえば、トランザクションがコミットされ、書込み 1 がシャード A で表示されているものの、書込み 2 がシャード B にまだ表示されていない場合、読み取り保証(read concern) "local"
での外部読み取りは、書き込み 2 を見ることなく書き込み 1 の結果を読み取ることができます。
詳細
Practical MongoDB Aggregations(電子書籍)
シャーディングと集計の連携方法に関する詳細については、『Practical MongoDB Aggregations』(電子書籍)のシャーディングの章をお読みください。