読者です 読者をやめる 読者になる 読者になる

日頃の行い

個人的な日頃の行いをつらつら書いてます\\\\ ٩( 'ω' )و ////

MongoDBでレプリカセットを試してみた。

MongoDB Replication

仕事で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>

こんな感じに簡単にレプリカセットを組めるようです。
もうちょっと色々遊べたらいいなーと思います。