MongoDBのReplica Setを設定するMongoDB, how to set up “Replica Set”

パリのワインサロンに参加して、大量にワインを購入しました。松浦です。
ワインサロンとは1,000に迫る数の生産者が集結し、広い会場で試飲をしまくって、生産者からお手頃な値段で直接ワインを買うというイベントです。フラ ンス人は随分適当で事務処理とか窓口対応の酷さでは定評がありますが、ワインサロンでは所狭しと並んだカウンターに皆が効率よく並び、買い手売り手共に素 晴らしく統率が取れていました。フランス人(好きなことは)こんなにちゃんと出来るのかと驚いた次第です。

今日はMongoDBの話題です。昔はちょっとしたアプリのプロトタイピングではSQLiteを使っていました。が、今ではMongoDBを使うと、この手の事をやるときは殆ど何もしなくても十分に使える環境が手に入るので、重宝しています。

ここではMongoDBのReplica Setの設定方法を紹介します。VMWare上に作成した1台のlinuxにmongodを3つ立ち上げて、その中で動作確認をするというものです。

0. テスト環境と事前準備

下記の環境でReplica Setの動作確認を行いました。

後でMongoDB用の仮想マシンを複数台つかったテストの予定があったので、雛形(各種設定とMongoDBのインストールまで終了したもの)を 用意し、そこからコピーして作成しておきました。ここから発展して色々と試したい方は雛形の作成をお勧めします。またMongoDBは相当ディスク容量を 消費するので、VMWareデフォルトの20GBは避けた方が良いです(一瞬で埋まります)。環境が許す範囲で、台数と検討の上、多めに割り当てた方が無 難です。

VMWare fusionで仮想マシンを作成したら、次はネットワークの設定です。ローカルで完結しかつ何度も実験を繰り返すのであれば、下記の様に名前を付けて固定 IPアドレスを振っておくと何かと便利です。取りあえず、3台分の固定アドレスを振った様子を示します。この作業は全てMac上です。仮想マシンのMAC アドレスを調べた後、下記の様に2つのファイルの末尾に追記するだけです。

後は個別の仮想マシンにログインして、/etc/hostnameを上記に合わせて例えば’mngVM01′の様に設定しておけば完了です。一度全 ての仮想マシンを終了し、VMWare fusion事態を立ち上げ直せば、固定のアドレスが振られますし、もちろん’ssh mng01.vm’の様な事が出来るようになります。

1. Replica Setを作成する

ここではmng01.vmにログインしているとして、Replica Setの作成方法を説明します。また既にMongoDB事態のインストールは終わっているとします。インストール自体は10genのレポジトリを利用してapt-getでインストールするのが簡単です。

3つのmongodが立ち上がった状態です。だたし、このままではお互いの存在を知らずレプリケーション等は出来ません。replica setを動作させるためにはprimary候補のmongodに対してrs.initiateを行う必要があります。

上記の設定を施すことでreplica setが動作します。下記のようにrs.status()で確認できます。この状態でデータの書き込みや読み込みを行い、その後に mng01.vm:27018(プライマリ)に対応するプロセスをkillしてみて下さい。mng01.vm:27019に対応するmongodがセカン ダリからプライマリに役割を変え、データの読み書きを継続する様子が確認できると思います。もう一度mng01.vm:27018に対応するmongod を立ち上げると今度はセカンダリとなります。

2. おわりに

動作確認が終わったり、もう一度最初からやりたい場合は、mongodのプロセスをkillし、該当フォルダ(/data/mongo/)を削除し て上記のステップを繰り返すだけです。また何度も実験を繰り返す場合は各種設定やダミーデータを書き込むスクリプト等を作成しておくことをお勧めします。 MongoDBは主要言語のドライバーが用意されているので、プログラムを書くのは非常に簡単です。

ここでは、簡単のために1つの仮想マシン上でReplica Setのテストをしました。他にも仮想マシンを幾つか立ち上げて、同様のテストを行ったり、Shardingも併せて動かしてみるなど、環境を発展させてみて下さい。

Replica Setを利用する事で障害時にもデータの読み書きが継続可能になるという観点はもちろん大事です。もう一つReplica Setの効果は読み込み性能に現れます。プライマリ、セカンダリから読み込みを可能としておくことでデータ読み込みのクエリーを分散させることが出来ま す。大量のデータを扱うためにMongoDBのクラスタを生成する必要があるならば、読み込み性能はReplica Setの台数を増やして対応し、書き込み性能はShardingの台数を増やして対応すると押さえておくと良いと思います。なぜShardingが書き込 み性能に効果があるか知らなければ、調べておく価値はあります。

参考文献

・Replica Set
http://www.mongodb.org/display/DOCSJP/Replica+Sets
・Replica Set Tutorial
http://www.mongodb.org/display/DOCSJP/Replica+Set+Tutorial
・スケーリング MongoDB
http://www.oreilly.co.jp/books/9784873115221/
・Install MongoDB on Ubuntu
http://docs.mongodb.org/manual/tutorial/install-mongodb-on-ubuntu/
・VMware Fusion 4のネットワーク構成の変更
http://d.hatena.ne.jp/chocoring/20111218/p2

by MATSUURA Satoshi