MongoDBでゆるふわDB体験

第5回 MongoDBのシャーディングを試してみよう

この記事を読むのに必要な時間:およそ 3 分

はじめに

今回は,MongoDBのシャーディングについて説明します。

シャーディングとは,データを複数のサーバに分散させる機能です。今回は,最初にシャーディングのメリットを説明し,続けてシャーディングの概要,さらにシャーディングに登場する重要キーワードを解説します。2ページ目以降ではシャーディングの構築手順について解説します。

シャーディングはMongoDBの機能の中でも重要かつ複雑なもののひとつです。手元の環境で構築することが,シャーディングを理解する大きな助けになりますので,本記事を参考にぜひ構築してみてください。

シャーディングのメリット

シャーディングはMongoDBを水平スケーリングさせる機能で,以下のようなメリットをもたらします。

負荷分散による性能の向上

データを複数のサーバに分散させることにより,CPUやI/O負荷を分散させることが可能です。後述しますが,MongoDBはキーの範囲でデータを分散させます。適切なキー範囲を設定することにより,負荷を水平スケーリングさせることが可能となります。

リソース分散によるコストパフォーマンスの向上

近年,メモリやディスクの価格は大変安くなってきましたが,サイズの大きなモジュールほど価格が高く,また価格の上昇幅が大きくなることは変わりません。

メモリを例にあげますと,合計で64GBのメモリが必要になったとき,4GBメモリモジュール16枚の価格より16GBメモリモジュール4枚の価格の方が,一般的にコストがかかります。メモリもディスクも1台のサーバに積めるユニット数には制限があります。このような背景から,複数のサーバにデータを分散させることが,コストパフォーマンスの向上につながります。MongoDBではメモリが性能に直結するため,十分なサイズのメモリを確保することが推奨されています。

MongoDBのシャーディングの概要

シャーディングについて,データ分散と自動バランシングという2つの特徴を説明します。

シャードキーのレンジ(範囲)によるデータ分散

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

シャーディングのイメージを図で表すと,図1のようになります。図1に出てくる用語に関して後ほど説明しますので,まずは全体的なイメージを押さえてください。

図1 シャーディングの概要図

図1 シャーディングの概要図

※1)
データ分散という点のみで見ると,MySQLのレンジ指定によるパーティショニングとほぼ同じです。

自動バランシング

キー範囲の調整と,調整に伴うサーバ間のデータの移動まで全部MongoDBが行う自動バランシング※2という機能を備えています。自動バランシングにより,サーバ間のデータの偏りをユーザが意識しなくてもよいように設計されています。また,新たにサーバを追加した場合も,同様にデータの移動を行い偏りがなくなるように自動調整します。

※2)
設定で自動バランシングをオフにすることも可能です。

重要キーワードの説明

シャーディングに登場するキーワードに関して説明します。

シャード

実際にデータが格納されているmongodプロセスです。1つのドキュメントは1つのシャードに格納され,シャード間でデータの複製は行いません。必須ではありませんがレプリケーション構成とすることを推奨されています。

configサーバ

シャーディングのメタデータを管理しているmongodプロセスです。単一障害点となるので,複数のconfigサーバで構成することが推奨されています。

mongosサーバ

シャーディングにおけるルーティングプロセスです。シャードとクライアントを連携させます。必要があれば複数のmongosサーバをたてることが可能です。mongodプロセスではないので,状態やデータを持っていません。

シャードキー

データを分散する範囲のキーです。複数指定もできます。キー上のどの範囲のデータがどのシャードに格納されるかは,MongoDBが管理し,データの偏りによって自動調整を行います。シャーディングにおいて,シャードキーの設計が非常に重要になります。

チャンク

シャーディングにおけるチャンクとは,分散するデータの単位です。具体的には,あるコレクションの連続した範囲のデータで,複数のドキュメントとなります。チャンクの最大サイズに達すると分割され,シャードが持っているチャンク数に応じて必要ならば他のシャードに移動されます。チャンクの最大サイズは変更可能です。

これまでに説明したキーワードは,現時点では明確にイメージできなくても心配いりません。次のページ以降で実際にシャーディング環境を構築してみることで,理解を深めていきましょう。

著者プロフィール

藤崎祥見(ふじさきしょうけん)

野村総合研究所 OpenStandia所属。オープンソースのR&Dとセミナー講師を担当。

Debian,Ubuntu,Liferayのコミュニティで活動した後,MongoDBの翻訳に関わり,丸の内MongoDB勉強会を始める。

実家がお寺で,住職の資格を所持する坊主系エンジニア。

Twitter:@syokenz


渡部徹太郎(わたなべてつたろう)

野村総合研究所 OpenStandia所属。オープンソースを使ったSIやサポートの業務に従事。

藤崎と共同で丸の内MongoDB勉強会を始める。

趣味は自宅サーバ。好きなものはLinuxとRuby。

Twitter:@fetarodc


林田敦(はやしだあつし)

野村総合研究所 OpenStandia所属。オープンソースを使ったSIや製品開発業務に従事。

丸の内MongoDB勉強会では広報兼雑用係を務める。

趣味はレザークラフト,ダイビング,スキー,キャンプ,ジェットスキー,カメラ等々。作って滑って撮って潜れるエンジニア。

Facebook:Atsushi Hayashida

コメント

コメントの記入