Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

シャーディング: MongoDBによる水平スケールを実現する仕組み

More than 3 years have passed since last update.

MongoDBに関する基本的な内容をまとめてみたものです。MongoDBに関する、Web上にすでにある良識な解説コンテンツをまとめたサイトの抜粋です。
シャーディング: MongoDBによる水平スケールを実現する仕組み

シャーディングとは

シャーディングとは、複数のノードに渡るデータのディストリビューションを指します。
複数のノードに渡って異なるデータを保存することで、読み取りや書き込みのパフォーマンスのための水平方向のスケーラビリティが実現します。

データセットが大きい場合、単一ノードでは CPU または I/O パフォーマンスによってボトルネックが発生することがあります。シャーディングは、シャードノードが処理するオペレーションの数を減らし、クラスター全体のパフォーマンスを向上させることで、このボトルネックを解決します。

シャーディングは水平スケーリングさせることを可能にし、下記のメリットをもたらします。

負荷分散により性能の向上:
データを複数のサーバに分散させることにより,CPUやI/O負荷を分散させることが可能です。

リソース分散によるコストパフォーマンスの向上:
メモリやディスクは、サイズの大きなモジュールほど単価が価格が高くなります。複数のサーバにデータを分散させて、それぞれのサーバにのせるメモリやディスクの容量を小さくすることが,コストパフォーマンスの向上につながります。

MongoDBにおけるオートシャーディングの仕組み

MongoDBのシャーディングはレンジパーティション方式を採用しています。シャードキーを指定することで,各サーバに格納されるデータの範囲が決定されます。サーバ間で重複データは持たず,1つのデータが格納されるサーバはシャードキーの範囲によって1つに決定されます。

分散するデータの単位は、「チャンク」とよばれ、あるコレクションの連続した範囲のデータで、複数のドキュメントとなります。チャンクは設定された最大サイズに達すると分割され、シャードが持っているチャンク数に応じて必要であれば他のシャードに自動的に移動されます。もちろんチャンクの分割と移動はパフォーマンスに与えるインパクトは大きく、チャンクの移動や分割中には一部リクエストは正しい情報を返せないので、できるだけチャンクの移動や分割が少なくなるような適切なシャードキーの選択が肝となります。

チャンクを自動的に分割していくリバランシングの仕組み

MongoDBのオートバランシングでは、各シャードにおいて、最大のチャンク数を持つシャードと最小のチャンク数を持つシャードの差が規定値を超えると、均等化の処理としてチャンクの移動が行われます。
(新規にシャードを追加した場合も同様にリバランシング処理が行われる)

たとえば、Shard1にチャンクAのみがある状態から、Shard1にチャンクBも追加されて
さらにShard1にチャンクCも追加されたとします。規定値が2であると、規定値を超えていますのでチャンクCがShard2に自動的に移動されます(下図参照ください)。

uenohara
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away