本篇文章將要說明,mongodb的副本集,嗯~想想一個情況,現在咱們只使用一台server來存放資料,我們現在只是測試和開發,GG囉也只是啊一聲,但如果是正式上線環境呢 ?GG囉可不是啊一聲就可以解決的,你可能就被老闆不要不要的,很慘的~ 而副本集就是用來解決這問題,事實上也就只是被備份。
首先我們先看看mongodb官網所提供的圖。

上面這張圖,你可以想成這個系統它有三個mongodb,其中primary節點接受所有client端的讀或寫,整個副本集只有一個primary,並且每當有資料新增時,primary會同步到其它兩個secondary。
然後當primary節點GG的話,會變成下面這張圖的結果(一樣來至官網)。

在這裡面,各節點都是通過一個叫心跳請求(heartbeat request)的機制來通信,如果當primary節點如果在10秒內無法和其它節點進行通信,這系統會自動從secondary節點中選取一個當主節點。
在上面大概簡單的了解完它的原理後,我們就實際上的來操作看看,首先我們執行下面指令,
來進行到沒有db的mongodb shell環境。
mongo --nodb
然後通過下面的指令,就可以建立一個副本集,其中nodes : 3代表三個節點,一個primary其它兩個為secondary。
replicaSet = new ReplSetTest({"nodes":3})
不過執行完上面這行指令它還沒啟動喔,還需要執行下面兩行,startSet為啟動那三個節點的進程,而initiate為設定複制功能。
replicaSet.startSet()
replicaSet.initiate()
當執行完上面兩行後,我們就要跳到另一個Shell,然後連接到primary的節點,喲~?那它的port是啥?雖然有些文章中說預設是31000、31001、31002但我的電腦卻不是,所以建議還是在執行startSet時看一下,它應該會輸出下面這張圖的資訊。

嗯看到了吧,通常第一個就是primary,不是的話就試試其它的,然後我們這時就可以執行下面指令進入到它的裡面了。
conn1 = new Mongo("127.0.0.1:20000")
接下來我們就可以執行一些指令來看看這個副本集的狀態。
primaryDB = conn1.getDB("test")
primaryDB.isMaster()
結果如下,其中isMaster這欄位就是說明這節點是primary節點。

secondary節點~首先我們先新增一些資料。
var objs = [];
for (var i=0;i<10;i++){
objs.push({"name":"user"+i});
}
primaryDB.users.insert(objs);
然後我們這時連到secondary。
conn2 = new Mongo("127.0.0.1:20001")
進去後在輸入。
secondaryDB = conn2.getDB("test")
secondaryDB.find()
然後你會看到下面的錯誤訊息。
error : { "$err" : "not master and slaveok=false","code" :13435 }
這時要要再執行這行指令才能在seoncdary才能開啟。
coon2.setSlaveOk()
這時你在執行一次搜尋應該就可以看到結果囉~如下。

對不起我今天真的想不到結啥語,只能說+u~