最近需要用到mongodb的副本集來進行數(shù)據(jù)的冗余備份决采。以前參照《mongodb權威指南》來玩過test replicaSet。
replicaSet = new ReplSetTest({"nodes": 3})
replicaSet.startSet()
replicaSet.initiate()
導致印象當中,以為配置副本集就是在原來的mongo之外起一個爱谁,自動連主mongo孝偎。
帶著這種認知,直接被帶到溝里去了衣盾。怎么配的不對,最后才發(fā)現(xiàn)阻塑,這玩意兒跟elasticsearch的組織方式是類似的。
參照網(wǎng)上搜到的資料陈莽,配置如下:
mongod --dbpath /path/mongo1 --logpath /path/mongo1/log.log --replSet shard1 --port 10001 --bind_ip 127.0.0.1
mongod --dbpath /path/mongo2 --logpath /path/mongo2/log.log --replSet shard1 --port 10002 --bind_ip 127.0.0.1
注意兩個mongod存放數(shù)據(jù)和日志的路徑虽抄,以及端口是不同的。
用mongo連接第一個mongod:
mongo --port 10001
然后配置primary和secondary:
cfg = {_id:"shard1", members:[{_id:0,host:'127.0.0.1:10001'}, {_id:1, host:'127.0.0.1:10002'}]}
rs.initiate(cfg)
rs.status()
這個時候基本上就可以了,其間遇到一些問題群嗤,原因是第二個mongod沒有起得來。
如果再添加一個副本集, 除了按照上述方法之外狂秘,由于已經(jīng)配置了rs,因此可以使用reconfig函數(shù)來更新副本集的配置:
mongod --dbpath /path/mongo3 --logpath /path/mongo3/log.log --replSet shard1 --port 10003 --bind_ip 127.0.0.1
cfg = {_id:"shard1", members:[{_id:0,host:'127.0.0.1:10001'}, {_id:1, host:'127.0.0.1:10002'}, {_id:2, host:'127.0.0.1:10003'}]}
rs.reconfig(cfg)
假設我們在primary里插入一條記錄:
use my_test
db.test1.insert({'greeting':'my lord'})
然后從secondary里查看:
use my_test
db.test1.find()
直接報錯:
error: { "$err" : "not master and slaveOk=false", "code" : 13435 }
原因在于mongo副本集實現(xiàn)了讀寫分離破衔,默認的副本無法讀寫钱烟,需要在secondary里運行:
rs.slaveOk()
這個時候就可以在副本中查詢了。
當然读第,副本是無法進行寫的。