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を実現している。

参考:MongoDB ReplicaSets



* mkdir のオプションが大文字だったのを修正