一、MongoDB副本集(repl set)介紹
早起版本使用master-slave,一主一從和MySQL類似,但slave在此架構中為只讀,當主庫宕機后,從庫不能自動切換為主;
目前已經淘汰了master-slave模式,改為副本集,這種模式下有一個主(primary),和多個從(secondary),只讀,支持給他們設置權重,當主宕掉后,權重最高的從切換為主;
在此架構中還可以建立一個仲裁(arbiter)的角色,它只負責裁決,而不存儲數據
在此架構中讀寫數據都是在主上,要想實現負載均衡的目的需要手動指定讀庫的目標server
二、MongoDB副本集搭建
服務器環境准備
三台服務器都是CentOS release 6.5 (Final)
192.168.1.203(primary)
192.168.1.201(secondary)
192.168.1.202(secondary)
編輯三台機器的配置文件,加入如下內容
replication:
oplogSizeMB: 20 #oplog大小
replSetName: fansik #名稱自定義
重啟三台MongoDB服務
連接主,在主上運行命令mongo,然后
> use admin
>config={_id:"fanjinbao",members:[{_id:0,host:"192.168.1.203:27017"},{_id:1,host:"192.168.1.201:27017"},{_id:2,host:"192.168.1.202:27017"}]}
> rs.initiate(config)
> rs.add("192.168.1.201")
> rs.add("192.168.1.202")
> rs.status() # 查看狀態
如果兩台從上的狀態為"stateStr" : "STARTUP",則需要進行如下操作> var config={_id:"fanjinbao",members:[{_id:0,host:"192.168.1.203:27017"},{_id:1,host:"192.168.1.201:27017"},{_id:2,host:"192.168.1.202:27017"}]}
> rs.initiate(config)
此時再次查看rs.status()會發現從的狀態變為SECONDARY
三、MongoDB副本集測試
主上建庫建集合
use mydb
db.acc.insert({AccountID:1,UserName:"123",passwd:"123456"})
show dbs
從上查看
show dbs如果出現系列錯誤
2016-05-13T00:03:36.719+0800 E QUERY Error: listDatabases failed:{ "note" : "from execCommand", "ok" : 0, "errmsg" : "not master" }
執行
rs.slaveOk()
show dbs就可以看到創建的數據庫了
四、副本集更改權重模擬主宕機
默認三台機器權重都為1,如果任何一個權重設置為比其他的高,則該台機器馬上切換為primary角色,所以我們預設三台機器的權重為別為203:3,201:2,202:1
在主上執行:
cfg = rs.conf()
cfg.members[0].priority = 3
cfg.members[1].priority = 2
cfg.members[2].priority = 1
rs.reconfig(cfg)
這樣的話,第二個節點將會成為候選節點
主上丟棄掉從端口27017進入的數據包
iptables -I INPUT -p tcp --dport 27017 -j DROP
五、MongoDB備份和恢復
備份指定庫
# mongodump -h ip -d dbname -o dir #-h后面跟服務器ip,-d后面跟database名字,不加則備份所有庫,-o指定備份到哪里,他是一個目錄
備份所有庫
# mongodump -h 192.168.1.203 -o /tmp/
備份指定集合
# mongodump -d fansik -c zhangsan -o /tmp/fansik #-c指定集合的名字
導出集合為json文件
# mongoexport -d mydb -c fansik -o /tmp/test.json #-o后面跟的是一個文件的名字
恢復所有庫
# mongorestore --drop dir/ #其中dir是備份所有庫的目錄名字 其中--drop可選,意思恢復前先將數據刪除,不建議使用
恢復指定庫
# mongorestore -d mydb /mydb #-d恢復的庫名字,mydb是該庫備份目錄
恢復集合
# mongorestore -d mydb -c zhangsan /fansik/zhangsan.bson #-c后面是要恢復的集合的名字,然后指定恢復的集合文件,bson格式的文件
導入集合
# mongoimport -d mydb -c test --file /tmp/test.json
