很多公司都在用MongoDb ,一直沒有時間研究,最近好好的整了一下,做下筆記,直接上操作步驟,關於Mongodb的理論知識可以搜索其他資料,也可以聯系我索取
mongoDB官方已經不建議使用主從模式了,替代方案是采用副本集的模式,主從模式其實就是一個單副本的應用,沒有很好的擴展性和容錯性。而副本集具有多個副本保證了容錯性,就算一個副本掛掉了還有很多副本存在,並且解決了上面 第一個問題“主節點掛掉了,整個集群內會自動切換”。難怪mongoDB官方推薦使用這種模式。我們來看看mongoDB副本集的架構圖:
由圖可以看到客戶端連接到整個副本集,不關心具體哪一台機器是否掛掉。主服務器負責整個副本集的讀寫,副本集定期同步數據備份,一但主節點掛掉,副本節點就會選舉一個新的主服務器,這一切對於應用服務器不需要關心。我們看一下主服務器掛掉后的架構:
副本集中的副本節點在主節點掛掉后通過心跳機制檢測到后,就會在集群內發起主節點的選舉機制,自動選舉一位新的主服務器。看起來很牛X的樣子,我們趕緊操作部署一下!
官方推薦的副本集機器數量為至少3個,那我們也按照這個數量配置測試。
1、准備兩台機器 192.168.176.129、192.168.176.130、192.168.176.131。 192.168.176.129 當作副本集主節點,192.168.176.130、192.168.176.131作為副本集副本節點。
2、分別在每台機器上建立mongodb副本集測試文件夾及Data目錄
3、分別啟動三台機器的MongoDB服務:
#cd /opt/soft/mongodb/mongodb-linux-x86_64-3.2.1/bin #啟動時指定數據文件路徑 和副本集名稱 #./mongod --dbpath /opt/soft/mongodb/data/ --replSet repset
4、初始化副本集 登錄三台機器中的任意一台,比如:129這台
#/opt/soft/mongodb/mongodb-linux-x86_64-3.2.1/bin/mongo
........日志信息省略
#>>config = { _id:"repset", members:[ {_id:0,host:"192.168.176.129:27017"}, {_id:1,host:"192.168.176.130:27017"}, {_id:2,host:"192.168.176.131:27017"}] }
打印信息:
{ "_id" : "repset", "members" : [ { "_id" : 0, "host" : "192.168.176.129:27017" }, { "_id" : 1, "host" : "192.168.176.130:27017" }, { "_id" : 2, "host" : "192.168.176.131:27017" } ] }
#初始化副本集配置
rs.initiate(config);
#如果成功了返回
{ "ok" : 1 }
#如果出現一下信息,查看一下服務器的防火牆
{
"ok" : 0,
"errmsg" : "replSetInitiate quorum check failed because not all proposed set members responded affirmatively: 192.168.176.129:27017 failed with No route to host, 192.168.176.131:27017 failed with No route to host",
"code" : 74
}
5、查看集群狀態
到此整個副本集已經搭建完成。下面趕快測試一下吧
主節點負責寫操作,所以我們在130這台機器上執行寫操作
repset:PRIMARY> db.benxq.insert({"name":"zhangsan"})
在131機器上執行讀操作讀一下
repset:SECONDARY> db.benxq.find()
#mongodb默認是從主節點讀寫數據的,副本節點上不允許讀,需要設置副本節點可以讀。 Error: error: { "ok" : 0, "errmsg" : "not master and slaveOk=false", "code" : 13435 }
repset:SECONDARY> db.getMongo().setSlaveOk();
#可以看到數據已經復制到了副本集。
repset:SECONDARY> db.benxq.find();
6、故障轉移測試
我們將130這台主節點停掉模仿服務器故障,在129上執行rs.status()
我們可以看到已經將131這台服務器選舉為了新的主節點,這是我們重新啟動130,就會自動的成為了副節點。