日頃の行い

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

MongoDBでArbiterをSecondaryにしたくなったときにする方法

みなさんこんばんは。
brew installするとmongoの3系統が入るようになったんだなぁと
老害気分を感じてしまいました。
そんなにMongoDB詳しくないんですけどね。

概要

今日はArbiterとして登録してしまったレプリカセットを
Secondaryにする方法を探し求めた時の話をします。

方法自体の流れは簡単です。

1. Arbiterをレプリカセットから外す
2. データを消す
3. 再起動
4. レプリカセットにSecondaryとして追加する

です。
参考はこちら

Convert a Secondary to an Arbiter - MongoDB Manual v7.0
(SecondaryからArbiterにするには)

ということでこの記事の流れ

1. 環境の説明
2. master用サーバでの操作(Arbiterをレプリカセットから外す)
3. arbiter用サーバでの操作(データを消す+再起動)
4. master用サーバでの操作(レプリカセットにSecondaryとして追加する)

1. 環境の説明

vagrantで3台起動しています。
MongoDBは2.6
インストールは本家または過去の記事を参考にしてください。

arata.hatenadiary.com

など

Vagrantfile

# -*- mode: ruby -*-
# vi: set ft=ruby :

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "centos"
  config.vm.box_url = "http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.5-x86_64-v20140110.box"

  config.vm.define :web1 do |web|
    web.vm.network :private_network, ip: "192.168.56.101"
  end

  config.vm.define :web2 do |web|
    web.vm.network :private_network, ip: "192.168.56.102"
  end

  config.vm.define :web3 do |web|
    web.vm.network :private_network, ip: "192.168.56.103"
  end
end


そして、レプリカセット用の設定は以下のようなコマンドを実行しました。

$vagrant ssh web1
$mongo --quiet --eval="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)"

2. master用サーバでの操作(Arbiterをレプリカセットから外す)

ここではっと気が付きます。
Arbiterじゃなくて、私はSecondaryにしたかったんだと。
そこで公式ページを確認した所、上で書いた通り、
SecondaryからArbiterにする場合というチュートリアルを発見しました。
同様の方法で、逆のことも出来るはずなので、行いました。

ここではまずArbiterをレプリカセットから外します。
はじめに、masterに設定したweb1にログインして操作します。

repl:PRIMARY> rs.remove("192.168.56.103:27017")
2015-05-04T17:05:38.056+0000 DBClientCursor::init call() failed
2015-05-04T17:05:38.056+0000 Error: error doing query: failed at src/mongo/shell/query.js:81
2015-05-04T17:05:38.058+0000 trying reconnect to 127.0.0.1:27017 (127.0.0.1) failed
2015-05-04T17:05:38.060+0000 reconnect 127.0.0.1:27017 (127.0.0.1) ok
repl:PRIMARY> rs.remove("192.168.56.103:27017")
rror: couldn't find 192.168.56.103:27017 in [
	{
		"_id" : 0,
		"host" : "192.168.56.101:27017"
	},
	{
		"_id" : 1,
		"host" : "192.168.56.102:27017"
	}
]

なんか一回目エラー出てたけど、
ちゃんと消されていたので、問題ないと判断して続けます。

3. arbiter用サーバでの操作(データを消す+再起動)

次にArbiterに設定したweb3にログインして操作します。
mongoのデータ用のPATHは/var/lib/mongoを指定しています

$vagrant ssh web3
[vagrant@localhost ~]$ sudo service mongod stop
[vagrant@localhost ~]$ cp -r /var/lib/mongo/ /tmp/mongo.bk
[vagrant@localhost ~]$ cat /etc/mongod.conf
systemLog:
    destination: file
    path: /var/log/mongodb/mongod.log
    logAppend: true

processManagement:
    fork: true
    pidFilePath: /var/run/mongodb/mongod.pid

replication:
    replSetName: repl

storage:
    dbPath: /var/lib/mongo
[vagrant@localhost ~]$ sudo rm -rf /var/lib/mongo/*
[vagrant@localhost ~]$ sudo service mongod start
Starting mongod: 

これで過去のデータが完全に消えました。
次から行うのはInitialSyncと同じですね。

InitialSyncについてはこちら
arata.hatenadiary.com

4. master用サーバでの操作(レプリカセットにSecondaryとして追加する)

後は新規にSecondaryとしてレプリカセットに追加するだけです。

repl:PRIMARY> rs.add("192.168.56.103:27017")
{ "down" : [ "192.168.56.103:27017" ], "ok" : 1 }

以上。
これで、レプリカセットに追加されました。

Arbiterにしてしまったら完全に新しいインスタンスとして
登録しないといけないみたいですね。

これがデータ量大きくなった時にどうなるのかなぁ
まあArbiterからSecondaryに移したい時って、本番環境だとさほどないのかな。