notebook

都内でWEB系エンジニアやってます。

レプリカセットを試す

全てmongodで起動する

どのサーバがPRIMARYか決めるのはreplicaset内で投票して決める

全サーバのうち過半数を超えたサーバがPRIMARYになる

一般的にはPRIMARY,SECONDARY,ARBITER(データを持たない投票のためだけのサーバ、調整用)の最小構成になる

今回はPRIMARY,SECONDARY2台の構成でやってみる

本番運用ではPRIMARYが結構変わるのでmonogsを挟まなと使えない

構成

f:id:swfz:20161119151017p:plain

  • 起動
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