mongodb的副本集Replica Set

mongodb不推薦主從複製,推薦建立副本集(Replica Set)來保證1個服務掛了,可以有其他服務頂上,程序正常運行,幾個服務的數據都是一樣的,後臺自動同步


【要搭建一個穩定的mongodb工程,副本集是必須的,因爲他可以當你的主服務器掛掉後,根據選舉機制自動選舉出1個最適合的從服務器來做主服務器繼續運行】


參考http://snoopyxdy.blog.163.com/blog/static/60117440201241694254441/

Replica Set使用的是n個mongod節點,構建具備自動的容錯功能(auto-failover),自動恢復的(auto-recovery)的高可用方案。
使用Replica Set來實現讀寫分離。通過在連接時指定或者在主庫指定slaveOk,由Secondary來分擔讀的壓力,Primary只承擔寫操作。
對於Replica Set中的secondary 節點默認是不可讀的。 


--------------------------------------------------------
創建4個,3個MONGODB服務器,1個仲裁服務器
步驟1【創建數據存放目錄】
分別創建4個節點分配數據存放的位置空間
$  mkdir -p /scmgt/data/r0
$  mkdir -p /scmgt/data/r1
$  mkdir -p /scmgt/data/r2
$  mkdir -p /scmgt/data/r3


步驟2【開啓3個mondodb服務】
後臺開啓3個服務,查看端口是否暫用命令netstat -apn|grep 1000 
/scmgt/mongodb/mongodb/bin/mongod  --replSet gtSet --dbpath=/scmgt/data/r0 --logpath=/scmgt/mongodb/ro_log --logappend --port=9933 --fork
/scmgt/mongodb/mongodb/bin/mongod  --replSet gtSet --rest --dbpath=/scmgt/data/r1 --logpath=/scmgt/mongodb/r1_log --logappend --port=9934 --fork
/scmgt/mongodb/mongodb/bin/mongod  --replSet gtSet --dbpath=/scmgt/data/r2 --logpath=/scmgt/mongodb/r2_log --logappend --port=9935 --fork
/scmgt/mongodb/mongodb/bin/mongod  --replSet gtSet --dbpath=/scmgt/data/r3 --logpath=/scmgt/mongodb/r3_log --logappend --port=9936 --fork

【-replSet gtSet:表示副本集的名字爲“wzh”,這裏的名字可以任意取;】
【--rest:是打開web監控頁面,比如我們這裏監聽10001端口,則打開http://10.1.49.225:9934/就可以看到這個mongodb數據庫進程的信息】
【啓動不起來,如果出現 child process failed, exited with error number 100報錯,請刪除data下面的mongod.lock】
【查看logpath日誌,提示replSet can't get local.system.replset config from self or any seed (EMPTYCONFIG),這是因爲我們還沒有初始化這個set.沒有執行第三步】






步驟3【初始化SET】
登陸mongodb後臺:
cd /scmgt/mongodb/mongodb/bin          
./mongo --port 9933
把下面config寫入控制檯
config = {_id: 'gtSet', members: [
      {_id: 0, host: 'localhost:9933'},
      {_id: 1, host: 'localhost:9934'},
      {_id: 2, host: 'localhost:9935'},
      {_id: 3, host: 'localhost:9936',arbiterOnly:true}]
}
 然後執行rs.initiate(config);
 
【arbiterOnly(false):如果是true,則表示這個成員爲仲裁節點,不接收數據;】
【priority(1.0):權重,更高的權重會被選舉爲主節點】
查看日誌,如果出現
 rs.initiate(config); rs.initiate(config);
{
        "info" : "Config now saved locally.  Should come online in about a minute.",
        "ok" : 1
}表示將在1分鐘後初始化完畢


之後執行 rs.status(),查看詳細
【這裏有個值"myState",如果這個值爲1,說明是主控節點(master);如果是 2 ,說明是從屬節點(slave).】




----------------------搭建完畢,添加數據,來需要驗證的--------------------
1:主從服務器數據是否同步,從服務器沒有讀寫權限
a:向主服務器寫入數據   ok   後臺自動同步到從服務器,從服務器有數據
b:向從服務器寫入數據  false 從服務器不能寫
c:主服務器讀取數據  ok 
d:從服務器讀取數據  false 從服務器不能讀




2:關閉主服務器,從服務器是否能頂替
kill -2 9933的pid
mongo的命令行執行rs.status()  發現PRIMARY替換了主機了


3:關閉的服務器,再恢復,以及主從切換
a:直接啓動關閉的服務,rs.status()中會發現,原來掛掉的主服務器重啓後變成從服務器了
b:額外刪除新的服務器  rs.remove("localhost:9933"); rs.status()
c:額外增加新的服務器 rs.add({_id:0,host:"localhost:9933",priority:1});
d:讓新增的成爲主服務器   rs.stepDown(),注意之前的 priority投票
     
4:從服務器讀寫
db.getMongo().setSlaveOk();
db.getMongo().slaveOk();//從庫只讀,沒有寫權限,這個方法java裏面不推薦了
db.setReadPreference(ReadPreference.secondaryPreferred());//在複製集中優先讀secondary,如果secondary訪問不了的時候就從master中讀
db.setReadPreference(ReadPreference.secondary());//只從secondary中讀,如果secondary訪問不了的時候就不能進行查詢


-------------------------------------------------------------------
日誌查看
MongoDB的Replica Set 架構是通過一個日誌來存儲寫操作的,這個日誌就叫做”oplog”,它存在於”local”數據庫中,oplog的大小是可以通過mongod的參數”—oplogSize”來改變oplog的日誌大小。


use local
switched to db local
db.oplog.rs.find()
{ "ts" : { "t" : 1342511269000, "i" : 1 }, "h" : NumberLong(0), "op" : "n", "ns" : "", "o" : { "msg" : "initiating set" } }


字段說明:
ts: 某個操作的時間戳
op: 操作類型,如下:
i: insert
d: delete
u: update
ns: 命名空間,也就是操作的collection name
o: document的內容
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章