全てmongodで起動する
どのサーバがPRIMARYか決めるのはreplicaset内で投票して決める
全サーバのうち過半数を超えたサーバがPRIMARYになる
一般的にはPRIMARY,SECONDARY,ARBITER(データを持たない投票のためだけのサーバ、調整用)の最小構成になる
今回はPRIMARY,SECONDARY2台の構成でやってみる
本番運用ではPRIMARYが結構変わるのでmonogsを挟まなと使えない
構成
- 起動
sudo mongod --port 27041 --dbpath /data/mongo/repl1 --logpath /data/mongo/repl1/log --fork --replSet rs1 sudo mongod --port 27042 --dbpath /data/mongo/repl2 --logpath /data/mongo/repl2/log --fork --replSet rs1 sudo mongod --port 27043 --dbpath /data/mongo/repl3 --logpath /data/mongo/repl3/log --fork --replSet rs1
1台(primaryにするノード)で実行する
$ mongo localhost:27041 > config = {_id: "rs1", members: [ {_id: 0, host: 'localhost:27041'}, {_id: 2, host: 'localhost:27042'},{_id: 3, host: 'localhost:27043'} ] } > rs.initiate(config) { "ok" : 1 }
- データを入れてみる
use sample rs1:PRIMARY> db.sample.insert({ category: "A", name: "aaaaaaaaaaa", age: 25 }) WriteResult({ "nInserted" : 1 })
- slaveでデータが入ったか確認する
rs1:SECONDARY> db.sample.find() Error: error: { "ok" : 0, "errmsg" : "not master and slaveOk=false", "code" : 13435 }
masterでもslaveOkでもないと
そのセッション内で読み出しOKにする
rs1:SECONDARY> db.getMongo().setSlaveOk() rs1:SECONDARY> db.sample.find() { "_id" : ObjectId("580db71a781294ca1b8f4a95"), "category" : "A", "name" : "aaaaaaaaaaa", "age" : 25 }
rs.slaveOk()
でも可
確認できた、OK
その他
レプリカセットの設定として下記がある
- votes
- 投票に参加するかどうか
- hidden
- primaryにはならないノードとして指定
- 投票には参加させるけどslaveDelayとあわせてバックアップ用に、などの使い方がある
- slaveDelay
- レプリケーションを遅らせる時間(秒)を指定