仕事でMongoDBを利用しているので、ちょっと遊びに作ってみました。
tarata/mongo-replication-try · GitHub
レプリカセットをPRIMARY / SECONDARY / ARBITERそれぞれ1台で組んで
コピーされてるか見たり、PRIMARYを落としてみたりしようと思います。
Install
$git clone https://github.com/tarata/mongo-replication-try.git $cd mongo-replication-try $vagrant up $vagrant ssh web1 $sh /vagrant/script/master-setup.sh
で3台構成のレプリカセットが起動します。
簡単ですね。
何をやったか。
最新版のMongoDBのインストール
(vagrant up時に行っています。)
Install MongoDB on Red Hat Enterprise, CentOS, Fedora, or Amazon Linux — MongoDB Manual 2.6.3
ここを参考にインストールしました。
[mongodb]
name=MongoDB Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
gpgcheck=0
enabled=1
これを
/etc/yum.repos.d/mongodb.repo
に書いて
$sudo yum install mongo-org
でおkらしいです。
レプリカセットのための設定
(vagrant up時に行っています。)
https://github.com/tarata/mongo-replication-try/blob/master/script/mongod.conf
とりあえず、
replSet = repltry
でレプリカセットのIDを設定しました。
レプリカセットを組む
$sh /vagrant/script/master-setup.sh
この部分の内容です。
以下のコマンドを実行するのと同様です。
[vagrant@localhost ~]$mongo MongoDB shell version: 2.6.3 connecting to: test > config = {_id: 'repltry', members: [ {_id: 0, host: '192.168.56.101:27017'}, {_id: 1, host: '192.168.56.102:27017'}, {_id: 2, host: '192.168.56.103:27017', arbiterOnly: true} ] } > rs.initiate(config)
これでレプリカセットが組まれます。
ちゃんとコピーされているか確認
PRIMARYとSECONDARYのサーバにアクセスしてデータがコピーされるか見てみましょう。
1. SECONDARYにデータがないことを確認します。
$vagrant ssh web2 Last login: Tue Jul 8 13:33:47 2014 from 10.0.2.2 Welcome to your Vagrant-built virtual machine. [vagrant@localhost ~]$mongo MongoDB shell version: 2.6.3 connecting to: test repltry:SECONDARY> show collections 2014-07-08T14:01:22.730+0000 error: { "$err" : "not master and slaveOk=false", "code" : 13435 } at src/mongo/shell/query.js:131 repltry:SECONDARY> repltry:SECONDARY> //SECONDARYなので怒られました。 repltry:SECONDARY> //slaveでクエリを流す時はrs.slaveOk()を実行します。 repltry:SECONDARY>rs.slaveOk() repltry:SECONDARY> show collections repltry:SECONDARY>
2. PRIMARYにデータを流します。
$vagrant ssh web1 Last login: Tue Jul 8 13:33:47 2014 from 10.0.2.2 Welcome to your Vagrant-built virtual machine. [vagrant@localhost ~]$mongo MongoDB shell version: 2.6.3 connecting to: test repltry:PRIMARY>show collections repltry:PRIMARY>//まだデータは空です。 repltry:PRIMARY> db.hoge.insert({}) WriteResult({ "nInserted" : 1 }) repltry:PRIMARY> show collections hoge system.indexes repltry:PRIMARY> db.hoge.find() { "_id" : ObjectId("53bbfa620ef471853a6a9a3e") } repltry:PRIMARY>
3. SECONDARYでデータの確認をします。
・・・中略 repltry:SECONDARY>rs.slaveOk() repltry:SECONDARY> show collections hoge system.indexes repltry:SECONDARY> db.hoge.find() { "_id" : ObjectId("53bbfa620ef471853a6a9a3e") } repltry:SECONDARY>
ちゃんとコピーされてますね。
PRIMARYを落としてみる。
1. SECONDARYで状態を確認
repltry:SECONDARY> rs.status() { "set" : "repltry", "date" : ISODate("2014-07-08T14:06:04Z"), "myState" : 2, "syncingTo" : "192.168.56.101:27017", "members" : [ { "_id" : 0, "name" : "192.168.56.101:27017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 3362, "optime" : Timestamp(1404828258, 1), "optimeDate" : ISODate("2014-07-08T14:04:18Z"), "lastHeartbeat" : ISODate("2014-07-08T14:06:03Z"), "lastHeartbeatRecv" : ISODate("2014-07-08T14:06:03Z"), "pingMs" : 0, "electionTime" : Timestamp(1404825008, 1), "electionDate" : ISODate("2014-07-08T13:10:08Z") }, { "_id" : 1, "name" : "192.168.56.102:27017", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 3691, "optime" : Timestamp(1404828258, 1), "optimeDate" : ISODate("2014-07-08T14:04:18Z"), "self" : true }, { "_id" : 2, "name" : "192.168.56.103:27017", "health" : 1, "state" : 7, "stateStr" : "ARBITER", "uptime" : 3362, "lastHeartbeat" : ISODate("2014-07-08T14:06:03Z"), "lastHeartbeatRecv" : ISODate("2014-07-08T14:06:03Z"), "pingMs" : 0 } ], "ok" : 1 }
PRIMARYが生きてますね。
2. PRIMARYを落としてSECONDARYで状態を確認する。
PRIMARY
repltry:PRIMARY> use admin switched to db admin repltry:PRIMARY> db.shutdownServer()
これを実行した直後にSECONDARYの方で状態を確認すると
まだweb2のサーバがSECONDARYになっていますが、
すぐにPRIMARYに変わります。
repltry:SECONDARY> rs.status() { "set" : "repltry", "date" : ISODate("2014-07-08T14:08:30Z"), "myState" : 2, "members" : [ { "_id" : 0, "name" : "192.168.56.101:27017", "health" : 0, "state" : 8, "stateStr" : "(not reachable/healthy)", "uptime" : 0, "optime" : Timestamp(1404828258, 1), "optimeDate" : ISODate("2014-07-08T14:04:18Z"), "lastHeartbeat" : ISODate("2014-07-08T14:08:29Z"), "lastHeartbeatRecv" : ISODate("2014-07-08T14:08:25Z"), "pingMs" : 0 }, { "_id" : 1, "name" : "192.168.56.102:27017", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 3837, "optime" : Timestamp(1404828258, 1), "optimeDate" : ISODate("2014-07-08T14:04:18Z"), "infoMessage" : "syncing to: 192.168.56.101:27017", "self" : true }, { "_id" : 2, "name" : "192.168.56.103:27017", "health" : 1, "state" : 7, "stateStr" : "ARBITER", "uptime" : 3508, "lastHeartbeat" : ISODate("2014-07-08T14:08:29Z"), "lastHeartbeatRecv" : ISODate("2014-07-08T14:08:29Z"), "pingMs" : 0 } ], "ok" : 1 } repltry:SECONDARY>rs.status() { "set" : "repltry", "date" : ISODate("2014-07-08T14:08:57Z"), "myState" : 1, "members" : [ { "_id" : 0, "name" : "192.168.56.101:27017", "health" : 0, "state" : 8, "stateStr" : "(not reachable/healthy)", "uptime" : 0, "optime" : Timestamp(1404828258, 1), "optimeDate" : ISODate("2014-07-08T14:04:18Z"), "lastHeartbeat" : ISODate("2014-07-08T14:08:57Z"), "lastHeartbeatRecv" : ISODate("2014-07-08T14:08:25Z"), "pingMs" : 0 }, { "_id" : 1, "name" : "192.168.56.102:27017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 3864, "optime" : Timestamp(1404828258, 1), "optimeDate" : ISODate("2014-07-08T14:04:18Z"), "electionTime" : Timestamp(1404828515, 1), "electionDate" : ISODate("2014-07-08T14:08:35Z"), "self" : true }, { "_id" : 2, "name" : "192.168.56.103:27017", "health" : 1, "state" : 7, "stateStr" : "ARBITER", "uptime" : 3535, "lastHeartbeat" : ISODate("2014-07-08T14:08:57Z"), "lastHeartbeatRecv" : ISODate("2014-07-08T14:08:57Z"), "pingMs" : 0 } ], "ok" : 1 } repltry:PRIMARY>
こんな感じに簡単にレプリカセットを組めるようです。
もうちょっと色々遊べたらいいなーと思います。