NoSQL データベースの1つで、非構造データを JSON 形式で保持できる mongoDB を「レプリカセット」と呼ばれる方法でクラスタリングします。

今回は3台の CentOS マシンによるクラスタ構成を行います。1台がプライマリ、1台がスレーブ、そして1台がアービターと呼ばれるフェイルオーバー時のマスター選択専用ノード(データは保持しない)で構成します。


プライマリ/スレーブ/アービターそれぞれのマシンの IP アドレスは P.P.P.P / S.S.S.S / A.A.A.A であると仮定して以下を記載します。


まず、3台のマシンそれぞれに MongoDB をインストールします。MongoDB の導入手順にそのものについては以下を参照してください:
mongoDB を CentOS 上にインストールする

上記手順最後のコマンド "chkconfig mongod on" までが実行されていれば、3台のマシン上それぞれで MongoDB が(独立して)稼働している状態になっています。


ここからがレプリカセット環境構築のための設定になります。まずそれぞれのマシン上で /etc/mongod.conf を編集します。編集内容は2点で (1) bind_ip 行をコメントアウト、 (2) replSet 行を追加 します:
# vi /etc/mongod.conf
  :
  :
# bind_ip=127.0.0.1 (コメントアウト)
  :
  :
replSet=testRS (この1行を追加)
  :
  :
なお、replSet=XXX で追加する行の XXX 部分は同じ文字列(上記例では testRS )を指定します。これによって3台の mongoDB サーガーが同一のレプリカセット環境上にあることを指定します。

bind_ip 行は接続を受け付ける元のアドレス範囲を指定する行です。127.0.0.1 が指定されていると localhost のみが指定されたことになり、他のマシンからの接続を受け付けなくなってしまうのでコメントアウトします。

ここまで出来た所で、3台のマシンそれぞれで mongoDB を再起動します:
# /etc/init.d/mongod restart


次にプライマリサーバー(P.P.P.P) 上で、各マシンの役割を指定します。プライマリサーバー上でコンソールにログインします:
# mongo

> 

コンソール画面内で以下を実行します:
> config = { _id:"testRS", 
  members:[
    { _id:0, host:"A.A.A.A:27017", arbiterOnly:true }, 
    { _id:1, host:"P.P.P.P:27017" },
    { _id:2, host:"S.S.S.S:27017" }
  ]
}
 :
:
> rs.initiate( config ) :
:
>

上記コマンドで testRS(replSet に指定した文字列値)に属する3台のマシンの IP アドレスとポート番号を指定し、A.A.A.A のマシンについてはアービターのノードであることも指示しています。 そしてその内容を rs.initiate コマンドで実行して初期化しています。

これが成功するとレプリカセットの完成です。rs.status() コマンドでレプリカセットの設定状況を確認することもできます:
> rs.status()
{
  "set": "testRS",
  "date": ISODate("2014-06-02T12:34:56Z"),
  "myState": 1,
  "members": [
    {
      "_id": 0,
      "name": "A.A.A.A:27017",
      "health": 1,
      "state": 7,
      "stateStr": "ARBITER",
      "uptime": 30,
      "lastHeartbeat": ISODate("2014-06-02T12:34:56Z"),
      "pingMs": 1
    },
    {
      "_id": 1,
      "name": "P.P.P.P:27017",
      "health": 1,
      "state": 1,
      "stateStr": "PRIMARY",
      "uptime": 80,
      "optime": Timestamp(1357209986000, 1),
      "optimeDate" : ISODate("2014-06-02T12:34:56Z"),
      "self": true
    },
    {
      "_id": 2,
      "name": "S.S.S.S:27017",
      "health": 1,
      "state": 2,
      "stateStr": "SECONDARY",
      "uptime": 30,
      "optime": Timestamp(1357209986000, 1),
      "optimeDate" : ISODate("2014-06-02T12:34:56Z"),
      "lastHeartbeat": ISODate("2014-06-02T12:34:56Z"),
      "pingMs": 1
    }
  ],
  "ok": 1 
}

> 

_id = 0 のマシンがアービター、1 のマシンがプライマリ、2 のマシンがスレーブになっていることを確認します。


一応これでレプリカセット環境としては動くようになりました。が、このままだとスレーブサーバーはプライマリサーバー以外のマシンからの接続を許可しないため色々不便です。というわけで、最後にスレーブサーバーにプライバリサーバー以外からも接続できるよう設定します。

スレーブサーバー上でコンソールにログインし、db.getMongo().setSlaveOk() コマンドを実行します:
# mongo

> db.getMongo().setSlaveOk()

>

これでスレーブサーバーに他のマシンから接続して状況を確認することもできるようになりました。