一、MongoDB Replica Sets(副本集)簡單的說就是有自動故障恢複功能的主從叢集,主從叢集和副本集的最為明顯的差別是副本集沒有固定的"主節點":整個叢集會選舉出來一個"主節點"當其不能正常工作時則變更到其他的節點,提高了系統的穩定性。
MongoDB Replica Sets的架構如圖所示:
如上圖所示,MongoDB Replica Sets的結構類似于以叢集,完全可以把他當成一個叢集,因為他确實與叢集實作的作用是一樣的:如果其中一個節點出現故障,其他的節點會馬上将業務接管過來。而無需停機操作
二、MongoDB Replica Sets的配置步驟:
1:首先要做是啟動三個節點
介紹一下涉及到的參數
--oplogSize 日志操作檔案的大
--dbpath 資料檔案路徑
--logpath 日志檔案路徑
--port 端口号,預設是27017.我這裡使用的也是這個端口号.
--replSet 複制集的名字,一個replica sets中的每個節點的這個參數都要用一個複制集名字,這裡是test.
--replSet test/ 這個後面跟的是其他standard節點的ip和端口
--maxConns 最大連接配接數
--fork 背景運作
--logappend 日志檔案循環使用,如果日志檔案已滿,那麼新日志覆寫最久日志。
--keyFile 辨別同一叢集的認證私鑰
其中在啟動節點時一定要加上oplogSize 的參數 為其設定大小,不然在64位作業系統上的mongodb,oplogs都相當大-可能是5%的磁盤空間,要根據情況設定個合理的值。
2:啟動三個節點
啟動第一個節點:/usr/local/mongodb/bin/mongod --port 28010 --oplogSize 10 --dbpath=/sdb1/liujijun/data/data/r0/ --logpath=/sdb1/liujijun/data/log/r0.log --replSet rs1/127.0.0.1:28011,127.0.0.1:28012 --maxConns 800 --fork --logappend
啟動第二個節點: /usr/local/mongodb/bin/mongod --port 28012 --oplogSize 10 --dbpath=/sdb1/liujijun/data/data/r2/ --logpath=/sdb1/liujijun/data/log/r2.log --replSet rs1/127.0.0.1:28010,127.0.0.1:28011 --maxConns 800 --fork --logappend
啟動第三個節點:/usr/local/mongodb/bin/mongod --port 28011 --oplogSize 10 --dbpath=/sdb1/liujijun/data/data/r1/ --logpath=/sdb1/liujijun/data/log/r1.log --replSet rs1/127.0.0.1:28010,127.0.0.1:28012 --maxConns 800 --fork --logappend
3:連結任選一個節點
# /usr/local/mongodb/bin/mongo --port 28010
> config={_id : 'rs1',members : [{_id : 0, host : 'localhost:28010'},{_id : 1, host : 'localhost:28011'},{_id : 2, host : 'localhost:28012'}]}//配置節點資訊
{
"_id" : "rs1",
"members" : [
{
"_id" : 0,
"host" : "localhost:28010"
},
"_id" : 1,
"host" : "localhost:28011"
"_id" : 2,
"host" : "localhost:28012"
}
]
}
> rs.initiate(config)//這個過程可能要等個一到兩分鐘的時間。
"info" : "Config now saved locally. Should come online in about a minute.",
"ok" : 1
> rs.status()
"set" : "rs1",
"date" : ISODate("2012-02-19T06:01:34Z"),
"myState" : 1,
"name" : "localhost:28010",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"optime" : {
"t" : 1329630925000,
"i" : 1
},
"optimeDate" : ISODate("2012-02-19T05:55:25Z"),
"self" : true
"name" : "localhost:28011",
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 367,
"lastHeartbeat" : ISODate("2012-02-19T06:01:33Z"),
"pingMs" : 0
"name" : "localhost:28012",
],
PRIMARY>
配置到此結束。
備注:
如果要讀寫分離的話:db.getMongo().setSlaveOk()指令實作從庫的可以查詢的目的。在利用副本集時最好不要設定使用者名和密碼,因為這樣會影響效率的,權限系統,非常耗資源,需要大量的運算。