iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 21
1
Big Data

30天之你好MongoDB系列 第 21

30-21 之MongoDB的副本集 replica set(1)

  • 分享至 

  • xImage
  •  

黑色好看版 - 傳送門


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

  • 副本集原理
  • 副本集建立(單機版給你好測試)

~副本集原理~


首先我們先看看mongodb官網所提供的圖。

上面這張圖,你可以想成這個系統它有三個mongodb,其中primary節點接受所有client端的讀或寫,整個副本集只有一個primary,並且每當有資料新增時,primary會同步到其它兩個secondary

然後當primary節點GG的話,會變成下面這張圖的結果(一樣來至官網)。

在這裡面,各節點都是通過一個叫心跳請求(heartbeat request)的機制來通信,如果當primary節點如果在10秒內無法和其它節點進行通信,這系統會自動從secondary節點中選取一個當主節點。

~副本集建立~


在上面大概簡單的了解完它的原理後,我們就實際上的來操作看看,首先我們執行下面指令,
來進行到沒有dbmongodb shell環境。

mongo --nodb

然後通過下面的指令,就可以建立一個副本集,其中nodes : 3代表三個節點,一個primary其它兩個為secondary

replicaSet = new ReplSetTest({"nodes":3})

不過執行完上面這行指令它還沒啟動喔,還需要執行下面兩行,startSet為啟動那三個節點的進程,而initiate為設定複制功能。

replicaSet.startSet()
replicaSet.initiate()

當執行完上面兩行後,我們就要跳到另一個Shell,然後連接到primary的節點,喲~?那它的port是啥?雖然有些文章中說預設是310003100131002但我的電腦卻不是,所以建議還是在執行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~

~參考資料~


上一篇
30-20之運用研究---PO文情境模擬(3)
下一篇
30-22之MongoDB的副本集 replica set(2)---使用Docker建立MongoDB Cluster
系列文
30天之你好MongoDB30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言