標籤:
工作中使用到了mongo,就自己研究了一下,總結了一下,會遇到的一些問題,有不對的地方還請各位牛人指導。
簡單說一下
複本集具有多個副本保證了容錯性,就算一個副本掛掉了還有很多副本存在
主節點掛掉了,整個叢集內會自動切換
複本集中的副本節點在主節點掛掉後通過心跳機制檢測到後,就會在叢集內發起主節點的選舉機制,自動選舉一位新的主伺服器
我們來看看mongoDB複本集的架構圖:(註:此圖是網上切下來的,比我畫的好)
主伺服器掛掉後的架構如:
如下是我的布署操作
我用的是VMware 11虛擬機器
系統是CentOS-6.3-x86_64 系統
使用的資料庫是 mongodb-linux-x86_64-2.0.4
用了三個虛擬系統
ip 192.168.216.128 192.168.216.129 192.168.216.130
用到的端品分別是 10001 10002 10003
192.168.216.128當複本集主節點 其它做為複本集副本節點
開始布署
1、 分別在每個系統中使用 su切換使用者身份如:
2、切記一定要在每個系統中關閉系統防火牆,因為在後面配置複本集時,這三台系統會互相求請,如果未關防火牆,配置是通不過的,這也是我在配置時遇到的問題
命令: service iptables stop
3,把你下載的mongodb的安裝程式包上傳到每個系統然後解壓
4. 分別在每個系統下棄置站台集檔案夾
如何該命令執行不了請檢查許可權
mkdir -p replSet/data
5.分別在每個系統上啟動mongodb 並使用 ps -aux|grep mongod 命令查看是否啟動
mongodb-linux-x86_64-2.0.4/bin/mongod --replSet application --dbpath replSet/data/ --port 10001 -logpath replSet/replSet.log -fork
mongodb-linux-x86_64-2.0.4/bin/mongod --replSet application --dbpath replSet/data/ --port 10002 --logpath replSet/replSet.log -fork
mongodb-linux-x86_64-2.0.4/bin/mongod --replSet application --dbpath replSet/data/ --port 10003 --logpath replSet/replSet.log -fork
如其中一個切圖:
6.初始化複本集
在其中一個系統中登陸mongodb
命令 mongodb-linux-x86_64-2.0.4/bin/mongo 192.168.216.128:10001
使用admin資料庫
如:
定義複本集組態變數,這裡的 _id:”application” 和上面命令參數“ –replSetapplication” 要保持
config ={_id:"application",members:[{_id:0,host:"192.168.216.128:10001"},{_id:1,host:"192.168.216.129:10002"},{_id:2,host:"192.168.216.130:10003"}]}
命令和輸出
初始化副本配置
命令: rs.initiate(config);
輸出結果:
{
"info" : "Config now saved locally. Should come online in about a minute.",
"ok" : 1
}
如果輸出如下:表示192.168.216.129:10002連接埠訪問不到請檢查該系統下10002連接埠的mongodb是否啟動
rs.initiate(config);
{
"errmsg" : "couldn‘t initiate : need all members up to initiate, not ok : 192.168.216.129:10002",
"ok" : 0
}
查看叢集節點的狀態
命令:
rs.status();
輸出結果如
此時整個複本集已經搭建成功
7.開始測試
在主節點上串連到資料庫
命令:mongodb-linux-x86_64-2.0.4/bin/mongo 192.168.216.128:10001
建立test 資料庫。
命令: use test;
往testdb表插入資料。
命令: db.testdb.insert({"mongodb":"mongodbtest"})
在副本節點 192.168.216.129 192.168.216.130 上串連到mongodb查看資料是否複製過來。
如我在130上查看命令如下
mongodb-linux-x86_64-2.0.4/bin/mongo 192.168.216.130:10003
進入後輸入如下命令進入test資料庫
use test
執行 db.testdb.find()查看錶
報如下錯:
error: { "$err" : "not master and slaveok=false", "code" : 13435 }
解決辦法如下
輸入 rs.slaveOk();
然後再執行如上查看錶操作
#輸出如下
{ "_id" : ObjectId("55bb3495ce19b28f7ea77e81"), "mongodb" : "mongodbtest" }
操作如下切圖
8.測試複本集容錯移轉功能,也就是主節點掛掉後,副節點變為主節點
先停落主節點 128
我是直接kill 掉
在主節點系統上:
命令: ps -aux|grep mongod 查出mongodb啟動的連接埠並殺掉
我查出的連接埠是 25305
命令 : kill -9 25305
串連到其它兩個系統進入mongodb資料庫,會有其中一個變為主節點,辨認是否為主機點 如:出現primary表示為主節點
如下查看示範例子
查看整個叢集的狀態,可以看到128為狀態不可達。
mongodb-linux-x86_64-2.0.4/bin/mongo 192.168.216.129:10002
rs.status();
輸出如下
{
"set" : "application",
"date" : ISODate("2015-07-31T09:04:00Z"),
"myState" : 1,
"syncingTo" : "192.168.216.128:10001",
"members" : [
{
"_id" : 0,
"name" : "192.168.216.128:10001",
"health" : 0,
"state" : 8,
"stateStr" : "(not reachable/healthy)",
"uptime" : 0,
"optime" : {
"t" : 1438332053000,
"i" : 1
},
"optimeDate" : ISODate("2015-07-31T08:40:53Z"),
"lastHeartbeat" : ISODate("2015-07-31T09:00:17Z"),
"pingMs" : 0,
"errmsg" : "socket exception"
},
{
"_id" : 1,
"name" : "192.168.216.129:10002",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"optime" : {
"t" : 1438332053000,
"i" : 1
},
"optimeDate" : ISODate("2015-07-31T08:40:53Z"),
"self" : true
},
{
"_id" : 2,
"name" : "192.168.216.130:10003",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 2044,
"optime" : {
"t" : 1438332053000,
"i" : 1
},
"optimeDate" : ISODate("2015-07-31T08:40:53Z"),
"lastHeartbeat" : ISODate("2015-07-31T09:03:59Z"),
"pingMs" : 0
}
],
"ok" : 1
}
再啟動原主節點128 發現變為 SECONDARY
此不再錄入代碼自己可以試試
至此複本集搭建好了
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
搭建高可用MongoDB叢集 副本