みなさんこんばんは。
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
インストールは本家または過去の記事を参考にしてください。
など
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に移したい時って、本番環境だとさほどないのかな。