標籤:
MongoDB支援在多個機器中通過非同步複製達到容錯移轉和實現冗餘。多機器中同一時刻只有一台機器是用於寫操作,正因為如此,MongoDB提供了資料一致性的保障。而擔當primary角色的機器,可以把讀的操作分發給slave。
MongoDB高可用分兩種:
Master-Slave 主從複製
只需要在某一個服務啟動時加上–master 參數,而另一個服務加上–slave 與–source 參數,即可實現同步。MongoDB 的最新版本已不再推薦此方案。
Replica Sets 複製集
MonoDB在1.6版本上開發了新功能Replica Sets,這比之前的replication功能要強大一些,增加了故障自動切換和自動修複成員節點,各個DB之間資料完全一致,大大降低了維護成本。auto shard 已經明確說明不支援replication paris,建議使用replica set。
Replica Sets的結構非常類似一個叢集。是的,你完全可以把它當作一個叢集,因為它實現的功能和叢集是一樣的,其中一個節點如果出現故障,其它節點馬上會將業務接過來,而無需停機操作。
節點的類型:
standard:常規節點,它儲存一份完整的資料副本,參與選舉投票,有可能成為primary節點。
passive:儲存了完整的資料副本,參與投票,不能成為primary節點。
arbiter:仲裁節點,只參與投票,不接收複製的資料,也不能成為primary節點。
一個repica sets節點數量最好為奇數(odd)。
配置執行個體(三節點)
兩個standard節點(這兩個節點直接可以互切primary secondary)。
一個arbiter節點,它手中握著一張選票,決定上面兩個standard節點中的哪一個可以成為primay。
圖例:
配置步驟:
1、啟動三個節點
啟動第一個standard節點(ip:192.168.0.11)
/mongodb/bin/mongod --dbpath=/mongodb/mongodb_date --logpath=/mongodb/mongodb_log/mongod.log --port 27017 --replSet test/192.168.0.12:27017 --maxConns=2000 --logappend
啟動第二個standard節點 (ip:192.168.0.12)
/mongodb/bin/mongod --dbpath=/mongodb/mongodb_date --logpath=/mongodb/mongodb_log/mongod.log --port 27017 --replSet test/192.168.0.11:27017 --maxConns=2000 --logappend
啟動arbiter節點,也就是仲裁節點 (ip:192.168.0.13)。注意!--replSet test/後面寫的是兩個standard節點的ip和連接埠
/mongodb/bin/mongod --dbpath=/mongodb/mongodb_date --logpath=/mongodb/mongodb_log/mongod.log --port 27017 --replSet test/192.168.0.11:27017,192.168.0.12:27017 --logappend
參數說明:
--dbpath 資料檔案路徑
--logpath 記錄檔路徑
--port 連接埠號碼,預設是27017.我這裡使用的也是這個連接埠號碼.
--replSet 複製集的名字,一個replica sets中的每個節點的這個參數都要用一個複製集名字,這裡是test.
--replSet test/ 這個後面跟的是其他standard節點的ip和連接埠
--maxConns 最大串連數
--fork 後台運行
--logappend 記錄檔迴圈使用,如果記錄檔已滿,那麼新日誌覆蓋最久日誌。
2、很關鍵的一步,配置完上面,下面開始初始化各個節點。在第二個啟動的節點上,運行mongo
db.runCommand({"replSetInitiate" : { "_id" : "test", "members" : [ { "_id" : 0, "host" : "192.168.0.11:27017" }, { "_id" : 1, "host" : "192.168.0.12:27017" } ]}})View Code
3、加入arbiter節點
PRIMARY> rs.addArb("192.16.0.13:27017");
注意!!!
添加新節點前,一定要配置好防火牆,開放對應的IP及PORT.
添加普通資料節點:
PRIMARY> rs.add("ip:port")
刪除節點
PRIMARY> rs.remove("ip:port")
顯示當前誰是primary
PRIMARY> rs.isMaster()
將一個普通資料節點修改為passive節點
除了仲裁節點,其他每個節點都有個優先權,我們可以通過設定優先權來決定誰的成為primay的權重最大。MongoDB replica sets中通過設定priority的值來決定優先權的大小,這個值的範圍是0--100,值越大,優先權越高。如果值是0,那麼不能成為primay。
1、通過rs.conf()命令查看出節點列表
PRIMARY> rs.conf() { "_id" : "test", "version" : 22, "members" : [ { "_id" : 3, "host" : "192.168.22.36:27017" }, { "_id" : 5, "host" : "192.168.22.10:27017" }, { "_id" : 6, "host" : "192.168.22.12:27017", "priority" : 0, "arbiterOnly" : true }, { "_id" : 7, "host" : "192.168.22.115:27017" } ] }View Code
2、將上面紅色的192.168.22.10節點的priority值修改成0,讓它只接收資料,不參與成為primary的競爭。
命令格式如下:
cfg = rs.conf() cfg.members[0].priority = 0.5 cfg.members[1].priority = 2 cfg.members[2].priority = 2 rs.reconfig(cfg)
紅色中括弧中的數字是執行rs.conf()得出的節點順序,第一個節點在這裡寫0,第二個節點寫1,依次類推。
執行命令
cfg = rs.conf() cfg.members[1].priority = 0 rs.reconfig(cfg)
3.查看結果,192.168.22.10的優先權變為0.
PRIMARY> rs.conf() { "_id" : "test", "version" : 22, "members" : [ { "_id" : 3, "host" : "192.168.22.36:27017" }, { "_id" : 5, "host" : "192.168.22.10:27017" "priority" : 0 }, { "_id" : 6, "host" : "192.168.22.12:27017", "priority" : 0, "arbiterOnly" : true }, { "_id" : 7, "host" : "192.168.22.115:27017" } ] }View Code
MongoDB整理筆記のReplica Sets