MongoDBのReplica Setsについての概要
MongoDBによるレプリケーションの一種、Replica Setsについての概要
MongoDBでは各種RDBMSで採用されているMaster/Slaveでのレプリケーション方式の他にReplica Setsという仕組みを利用することができる。
これは複数のDBプロセスをクラスタリングすることで冗長性を確保する仕組みで、
従来のレプリケーションと違って自動でのFailOverを実現している。
具体的にはPrimaryであるメンバが各種クエリを受付、Read,Writeを行う。
書き込まれた内容はSecondaryにミラーリングされる。
下記図を参照。
実際にReplica Setsを構築する為の手順を以下に示します。
複数のmongodプロセスを立ち上げる。
その為のデータディレクトリを作成。
$ mkdir -p ./data/repltest1 $ mkdir -p ./data/repltest2 $ mkdir -p ./data/repltest3
mongodプロセスの立ち上げ
$ mongod --replSet repltest --port 27017 --dbpath ./data/repltest1 --rest $ mongod --replSet repltest --port 27018 --dbpath ./data/repltest2 --rest $ mongod --replSet repltest --port 27019 --dbpath ./data/repltest3 --rest
--restオプションを付与するとHTTP Admin UIでの詳細表示が可能となる。
Replica Setsの設定
$ mongo localhost:27017
以下mongoコンソールで入力
クラスタを定義
_idにはmongod立ち上げ時の--replSetの値をセットする。
config = {_id: 'repltest', members: [ {_id: 0, host: 'localhost:27017'}, {_id: 1, host: 'localhost:27018'}, {_id: 2, host: 'localhost:27019'}] }
定義したクラスタをrs.initiate()に流しこむ。
> rs.initiate(config); { "info" : "Config now saved locally. Should come online in about a minute.", "ok" : 1 }
状態を確認
> rs.status(); { "set" : "repltest", "date" : "Tue Oct 05 2010 11:56:23 GMT+0900 (JST)", "myState" : 1, "members" : [ { "_id" : 0, "name" : "HOSTNAME.local:27017", "health" : 1, "state" : 1, "self" : true }, { "_id" : 1, "name" : "localhost:27018", "health" : 1, "state" : 2, "uptime" : 14, "lastHeartbeat" : "Tue Oct 05 2010 11:56:21 GMT+0900 (JST)" }, { "_id" : 2, "name" : "localhost:27019", "health" : 1, "state" : 2, "uptime" : 14, "lastHeartbeat" : "Tue Oct 05 2010 11:56:21 GMT+0900 (JST)" } ], "ok" : 1 }
詳細はHTTP Admin UIで確認できる。
ブラウザでhttp://localhost:28017を開く。
(Admin UIはデフォルトではmongodでのportに1000を加えたものが割り当てられる)
Replica Setsの詳細は下記URLより確認。
http://localhost:28017/_replSet
Secondaryの生存確認は2秒間隔で実施される。
この状態でPrimaryをctrl + c等で停止してみる。
すると下記の状態に遷移する。
従来のSecondaryがPrimaryに昇格しているのがわかる。
再び停止していたプロセスを立ち上げるとSecondaryとしてデータの同期が行われる。
このようにPrimaryが落ちた場合でも自動で他のプロセスが昇格することでauto failoverを実現している。
* mkdir のオプションが大文字だったのを修正