在上一篇博客中介紹了MongoDB複製和副本集的概念,這次將我查閱資料在單機下搭建的副本集展現給大家。
下面是在單機上搭建一個三個節點的副本集。一個主節點(primary),兩個從節點(secondary),其中一個是仲裁者(arbiter)。
環境:Ubuntu14.04,MongoDB3.2
sudo mkdir /data
sudo mkdir /data/node1
sudo mkdir /data/node2
sudo mkdir /data/arbiter
運行三個節點,其中,replica是副本集的名稱;端口號分別爲10001,10002,10003,而10001爲主節點的端口。
sudo /usr/local/mongodb/bin/mongod --replSet replica --dbpath /data/node1/ --port 10001 --oplogSize 1024
sudo /usr/local/mongodb/bin/mongod --replSet replica --dbpath /data/node2/ --port 10002 --oplogSize 1024
sudo /usr/local/mongodb/bin/mongod --replSet replica --dbpath /data/arbiter/ --port 10003 --oplogSize 1024
另外打開一個shell,進入主節點。
sudo /usr/local/mongodb/bin/mongo localhost:10001
初始化副本集需要配置表並逐步添加節點的數據信息,_id和副本集啓動的共享名稱一致。
config = {_id: "replica", members: []}
config.members.push({_id: 0, host: "localhost:10001"})
config.members.push({_id: 1, host: "localhost:10002"})
config.members.push({_id: 2, host: "localhost:10003", arbiterOnly: true})
初始化副本集
rs.initiate(config)
執行命令確認配置,可以看到10001的端口實例ismaster爲true,secondary爲false,爲主節點。hosts有兩個實例,arbiters有一個實例。
rs.isMaster()
輸入命令查看副本集的狀態信息。
rs.status()
查看當前副本集的配置表
rs.conf()
插入測試數據:
for(i=1;i<=10;i++) {db.users.insert({"username":"user"+i})}
進入從節點10002,查看集合信息,顯示查詢失敗,這是爲了避免從節點讀取到過期的數據。
sudo /usr/local/mongodb/bin/mongo localhost:10002
show collections
設置標識並查詢集合信息。
rs.slaveOk()
show collections
查詢測試數據
<span style="font-size:12px;">db.users.find()</span>
在從節點插入數據,寫入錯誤,不是主節點。
db.users.insert({username: "user11"})
進入端口10003,可以看到爲仲裁節點。
sudo/usr/local/mongodb/bin/mongo localhost:10003
replica:ARBITER>
關掉10001端口的mongod實例,shell顯示10001處於down狀態,進入之前的從節點10002,發現它變成了主節點,提示符爲
“replica:PRIMARY>”,再將10001上線,它有恢復成主節點。這就是MongoDB副本集的故障轉移。
到這裏,MongoDB單機搭建副本集就結束了,關於在多臺機器上部署的例子會在以後的文章中給大家帶來。