Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs Menu
Docs Home
/

シャーディング

シャーディングは複数のマシンにデータを分散するメソッドです。MongoDB はシャーディングを使用して、非常に大規模なデータセットと高スループット操作を伴う配置をサポートします。

データベース システムで大規模なデータセットまたは高スループットのアプリケーションを扱う場合、単一サーバーの容量が限界に達する可能性があります。たとえば、クエリ レートが高い場合、サーバーの CPU 容量が枯渇する可能性があります。ワーキングセットのサイズがシステムの RAM よりも大きい場合、ディスクドライブの I/O 容量に負荷がかかります。

システム拡大への対処方法としては、垂直スケーリングと水平スケーリングの 2 通りあります。

垂直スケーリング では、より強力な CPU の使用、 RAM の追加、またはストレージの拡張 により、単一サーバーのキャパシティーを増やします。利用可能なテクノロジーとクラウドプロバイダーのハードウェア構成により、垂直スケーリングには実質的な上限が課されます。

水平スケーリング では、システム データセットと負荷を複数のサーバーに分割し、必要に応じてサーバーを追加してキャパシティーを増やします。各マシンは全体的なワークロードのサブセットを**取り扱う**ため、1 台のマシン用にハイエンドのハードウェアを使用する場合よりも低コスト可能性があります。その反面、インフラストラクチャとメンテナンスの複雑さは増します。

MongoDB Atlas でホストされている配置向けに、UIで クラスターをシャード化できます。

注意

MongoDB のシャーディングされたクラスターは、次の要素で構成されます。

  • シャード: 各シャードには、シャーディングされたデータのサブセットが含まれています。各シャードはレプリカセットとして配置する必要があります。

  • mongos によるルーティング : mongos はクエリ ルーターとして機能し、クライアントアプリケーションとシャーディングされたクラスター間のインターフェースとなります。

  • コンフィギュレーションサーバー: コンフィギュレーションサーバーは、クラスターのメタデータと構成設定を保存します。 コンフィギュレーションサーバーは レプリカセット (CSRS) としてデプロイする必要があります。

以下では、シャーディングされたクラスター内のコンポーネントの相互作用を図説しています。

3 個のコンフィギュレーションサーバー、 2+個の ``mongos`` ルーター、およびレプリカセット シャードを含むシャーディングされたクラスターの例。

MongoDB はコレクションレベルでデータをシャーディングし、クラスター内のシャード全体にコレクション データを分散します。

MongoDB はシャードキーを使用して、コレクション内のドキュメントをシャード全体に分散します。シャードキーは、ドキュメント内の 1 つまたは複数のフィールドで構成されます。

シャーディングされたコレクション内のdocumentには、シャードキーフィールドがないことがあります。欠落しているシャードキーフィールドは、documentをシャードに分散する場合は null 値を持つものとして扱われますが、クエリをルーティングする場合はそのように扱われません。詳細については、「欠落しているシャードキー フィールドの設定」を参照してください。

コレクションのシャーディング時に、シャードキーを選択します。

ドキュメントのシャードキー値によってシャード間での分散が決定します。ドキュメントのシャードキー値は、シャードキー フィールドが不変の _id フィールドでない限り、更新できます。詳細については、「ドキュメントのシャードキー値の変更」を参照してください。

入力されるコレクションには、シャードキーで始まるインデックスがシャーディングするために必要になります。MongoDB は、空のコレクションのシャーディング時に、特定のシャードキーに適したインデックスがそのコレクションにまだない場合、サポート用インデックスを作成します。詳細については、「シャードキー インデックス」を参照してください。

シャードキーとそのバッキングインデックスの選択は、クラスターが使用できるシャーディング戦略にも影響する可能性があります。

Tip

MongoDB はシャーディングされたデータをチャンクに分割します。各チャンクは、シャードキーに基づいて、下限が含まれる範囲と上限が含まれない範囲を持っています。

データを均等に分散するために、バランサー がバックグラウンドで実行され、範囲シャード 間で移行されます。

MongoDB はシャーディングされたクラスター内のシャード全体に読み取りおよび書込みのワークロードを分散し、各シャードがクラスター操作のサブセットを処理できるようにします。シャードを追加することで、読み取りと書込みの両方のワークロードをクラスター全体で水平方向にスケーリングできます。

シャードキー、または複合シャードキーのプレフィックスを含むクエリの場合、mongos は特定のシャードまたはシャードのセットをクエリの対象にすることができます。これらのターゲット操作は、通常、クラスター内のすべてのシャードにブロードキャストするよりも、効率的です。

シャーディングはクラスター内のシャード全体にデータを分散する操作であり、クラスターの全データのサブセットを各シャードに含めることができます。データセットが大きくなるにつれてシャードが追加され、クラスターのストレージ容量が増大します。

レプリカセットとしてコンフィギュレーションサーバーとシャードを配置すると可用性が向上します。

1 つ以上のシャード レプリカセットが完全に利用できなくなった場合でも、シャーディングされたクラスターは引き続き読み取りと書込みを部分的に実行できます。つまり、利用できないシャード上のデータにはアクセスできませんが、利用可能なシャードでは読み取りや書込みは引き続き成功します。

シャーディングされたクラスターのインフラストラクチャの要件と複雑さには、慎重な計画、実行、メンテナンスが必要です。

コレクションの再シャーディング は後でも可能ですが、スケーラビリティやパフォーマンスの問題を回避するために、シャードキーの選択を慎重にしてください。

コレクションをシャーディングするための運用上の要件と制限については、「シャーディングされたクラスターの運用上の制限」を参照してください。

クエリにシャードキーまたは複合シャードキーのプレフィックスが含まれない場合mongosブロードキャスト操作を実行し、シャーディングされたクラスター内のすべてのシャードにクエリを実行します。このようなスキャッター/ギャザー クエリは、操作の実行時間が長引く可能性があります。

MongoDB 5.1 以降では、sh.addShard()シャード サーバーを起動、再起動または追加する際に、クラスター全体の書込み保証(CWWC)を設定する必要があります。

CWWC が設定されておらず、デフォルトの書込み保証(write concern){ w : 1 } になるようにシャードが構成されている場合、シャード サーバーは起動または追加に失敗し、エラーが返されます。

デフォルトの書込み保証(write concern)の詳細な計算方法については、「デフォルトの書込み保証の計算」を参照してください。

注意

MongoDB とのサポート契約が有効な場合は、シャード化クラスターの計画および配置に関する支援を受けるために、アカウント担当者に連絡することを検討してください。

sh.shardCollection() メソッドを実行すると、バランサークラスター内の他のシャードへのコレクションデータの分散が開始されます。単一のシャードが一度に参加できるチャンク移行には、1 つのシャードのみです。MongoDB があるシャードから別のシャードにデータ範囲のコピーが成功すると、ドナー シャードの範囲は 範囲削除 によって削除対象としてマークされます。このプロセスは遅く、リソースを集中的に消費します。

MongoDB 8.0 以降では、配置が リソース要件 を満たしている場合は、sh.shardAndDistributeCollection() メソッドを使用してコレクションをシャーディングすることをお勧めします。このメソッドは、shardCollection コマンドと reshardCollection コマンドをラップしてコレクションをシャードし、すぐに同じキーに再シャードします。これにより、 MongoDB はバランサーを待たずにシャード間でデータを再バランス化します。

詳細については、「同じシャードキーへの再シャーディング」を参照してください。

シャーディングされたコレクションとシャーディングされていないコレクションがデータベースに混在している場合があります。シャーディングされたコレクションは分割され、クラスター内のシャード全体に分散されます。シャーディングされていないコレクションは任意のシャードに配置できますが、複数のシャードにまたがることはできません。

シャーディングされていないコレクションとシャーディングされたコレクション ドキュメントのチャンクを含むプライマリ シャード (シャード A)

シャーディングされたクラスター 内の任意のコレクションとやり取りするには、 mongos ルーターに接続する必要があります。これには、シャーディングされたコレクションだけでなく、シャーディングされていないコレクションも含まれます。読み取りまたは書込み操作を実行するには、クライアントを単一シャードに 決して 接続しないでください。

MongoDB 8.3 以降では、すべてのシャーディングされたクラスターの mongosDDL 操作applyOps のみを実行できます。レプリカセットからシャーディングされたクラスターに移行している間は、これらの操作が一時的に利用できなくなることがあります。

シャーディングされたコレクションとシャーディングされていないコレクションの両方に対して mongos をクエリーするアプリケーション。

または MongoDBmongos mongodmongoshドライバー を使用して に接続するのと同じ方法で に接続できます。

注意

MongoDB 8.0 以降では、シャーディングされたクラスター内のノードで特定のコマンドのみを実行できます。ノードに直接接続してサポートされていないコマンドを実行すると、MongoDB はエラーを返します。

"You are connecting to a sharded cluster improperly by connecting directly
to a shard. Please connect to the cluster via a router (mongos)."

サポートされていないデータベースコマンドをシャーディングされたクラスター内のノードに対して直接実行するには、mongos に接続するか、メンテナンス専用の directShardOperations ロールが必要です。

MongoDB はシャーディングされたクラスター全体にデータを分散するための 2 つのシャーディング戦略をサポートしています。

ハッシュされたシャーディングは、シャードキーフィールドの値のハッシュを計算します。各チャンクにハッシュされたシャードキー値に基づく範囲が割り当てられます。

Tip

MongoDB は、ハッシュされたインデックスを使用してクエリを解決するときに、ハッシュを自動計算するため、アプリケーションでハッシュを計算する必要がありません

ハッシュベースのセグメンテーションの図。

ハッシュされた値が同じチャンクを共有する可能性は低く、特に単調に変化するシャードキーの場合、より均等なデータ分散が提供されます。

ただし、ハッシュされた分散では、シャードキーに基づく範囲ベースのクエリの対象が単一シャードに絞られる可能性が低くなるため、クラスター全体での ブロードキャスト操作 が増加します。

詳細については、「ハッシュされたシャーディング」を参照してください。

範囲ベースのシャーディングでは、シャードキー値に基づいてデータが範囲ごとに分割され、各チャンクにはそれらの範囲が割り当てられます。

より小さな範囲またはチャンクに分割されたシャードキー値空間の図。

値が「近い」シャードキーの範囲は、同じチャンクにある可能性が高くなります。これにより、ターゲット操作が可能になり、mongosは、必要なデータを含むシャードのみに操作をルーティングできます。

範囲ベースのシャーディングの効率は、選択したシャードキーによって異なります。シャードキーを十分に考慮しないと、データ分散が不均一になり、シャーディングの利点が一部損なわれたり、パフォーマンスのボトルネックが発生したりする恐れがあります。詳細については、「範囲ベースのシャーディングでのシャードキー選択」を参照してください。

詳細については、「範囲ベースのシャーディング」を参照してください。

ゾーンにより、シャーディングされたクラスターが複数のデータセンターにまたがる場合に、データローカリティが向上します。

シャーディングされたクラスターでは、シャードキーに基づきシャーディングされたデータのゾーンを作成できます。各ゾーンはクラスター内の 1 つまたは複数のシャードに関連付けることができ、シャードは任意の数のゾーンに関連付けることができます。MongoDB はバランスの取れたクラスター内で、ゾーンによってカバーされるチャンクをそのゾーンに関連付けられているシャードのみに移行します。

各ゾーンは、1 つ以上の範囲のシャードキー値をカバーします。任意のゾーンがカバーする各範囲は、常に下限を含み、上限を含まない範囲です。

シャーディングされたクラスター内のゾーンに基づくデータの分散図
クリックして拡大します

カバーされるゾーンに新しい範囲を定義する場合、シャードキーに含まれるフィールドを使用する必要があります。複合シャードキーを使用する場合、シャードキーのプレフィックスを範囲に含める必要があります。詳細については、「ゾーン内のシャードキー」を参照してください。

シャードキーを選択する際には、将来ゾーンの使用可能性を考慮してください。

Tip

空のコレクションまたは存在しないコレクションをシャーディングする前にゾーンとゾーンの範囲を設定することで、ゾーンシャーディングの設定を迅速化できます。

詳細については、「ゾーン」を参照してください。

shardCollection コマンドを collation : { locale : "simple" } オプションと併用して、デフォルトの照合があるコレクションをシャーディングします。シャーディングを成功させるには、次の条件を満たす必要があります。

  • コレクションには、プレフィックスがシャードキーのインデックスが必要です

  • インデックスには照合が必要です { locale: "simple" }

照合を使用して新しいコレクションを作成する場合、コレクションのシャーディング前にこれらの条件が確実に満たされるようにします。

注意

シャーディングされたコレクションに対するクエリでは、そのコレクション向けに構成されたデフォルトの照合を引き続き使用します。シャードキー インデックスの simple 照合を使用するには、クエリの照合ドキュメント{locale : "simple"} を指定します。

シャーディングと照合の詳細については、「shardCollection」を参照してください。

変更ストリームは、レプリカセット と シャーディングされたクラスター で使用できます。ストリーム変更を使用すると、 oplogを追尾する複雑さやリスクなく、アプリケーションがリアルタイムデータの変更にアクセスできます。

分散トランザクションは、シャーディングされたクラスターでのマルチドキュメントトランザクションをサポートします。

トランザクションがコミットされるまで、トランザクションで行われたデータ変更はトランザクションの外部には表示されません。

ただし、トランザクションが複数のシャードに書き込む場合、すべての外部読み取り操作が、コミットされたトランザクションの結果がシャード全体で表示されるまで待機する必要はありません。たとえば、トランザクションがコミットされ、書込み 1 がシャード A で表示されているものの、書込み 2 がシャード B にまだ表示されていない場合、読み取り保証(read concern) "local" での外部読み取りは、書き込み 2 を見ることなく書き込み 1 の結果を読み取ることができます。

シャーディングと集計の連携方法に関する詳細については、『Practical MongoDB Aggregations(電子書籍)のシャーディングの章をお読みください。

戻る

ローカル データベース

ルール バッジを取得する

「シャーディング戦略」を無料でマスターします。

詳細