標籤:
MongoDB Replica Sets 不僅提供高可用性的解決方案,它也同時提供負載平衡的解決方案,增減Replica Sets 節點在實際應用中非常普遍,例如當應用的讀壓力暴增時,3 台節點的環境已不能滿足需求,那麼就需要增加一些節點將壓力平均分配一下。
兩種方式:一是通過oplog增加節點,二是通過資料庫快照集和oplog來增加節點
通過oplog增加節點
1、配置並啟動新節點,啟用28013這個連接埠給新的節點
[email protected] ~]# mkdir -p /data/data/r3[[email protected] ~]# echo "this is rs1 super secret key" > /data/key/r3[[email protected] ~]# chmod 600 /data/key/r3[[email protected] ~]# /Apps/mongo/bin/mongod --replSet rs1 --keyFile /data/key/r3 --fork --port28013 --dbpath /data/data/r3 --logpath=/data/log/r3.log --logappendall output going to: /data/log/r3.logforked process: 10553[[email protected] ~]#
View Code
2、添加此新節點到現有的Replica Sets
rs1:PRIMARY> rs.add("localhost:28013"){ "ok" : 1 }
3、查看Replica Sets,我們可以清晰的看到內部是如何添加28013這個新節點的
(1)進行初始化
rs1: PRIMARY > rs.status(){"set" : "rs1","date" : ISODate("2012-05-31T12:17:44Z"),"myState" : 1,"members" : [……{"_id" : 3,"name" : "localhost:28013","health" : 0,"state" : 6,"stateStr" : "(not reachable/healthy)","uptime" : 0,"optime" : {"t" : 0,"i" : 0},"optimeDate" : ISODate("1970-01-01T00:00:00Z"),"lastHeartbeat" : ISODate("2012-05-31T12:17:43Z"),"errmsg" : "still initializing"}],"ok" : 1}View Code
(2)進行資料同步
rs1:PRIMARY> rs.status(){"set" : "rs1","date" : ISODate("2012-05-31T12:18:07Z"),"myState" : 1,"members" : [……{"_id" : 3,"name" : "localhost:28013","health" : 1,"state" : 3,"stateStr" : "RECOVERING","uptime" : 16,"optime" : {"t" : 0,"i" : 0},"optimeDate" : ISODate("1970-01-01T00:00:00Z"),"lastHeartbeat" : ISODate("2012-05-31T12:18:05Z"),"errmsg" : "initial sync need a member to be primary or secondaryto do our initial sync"}],"ok" : 1}View Code
(3)初始化同步完成
rs1:PRIMARY> rs.status(){"set" : "rs1","date" : ISODate("2012-05-31T12:18:08Z"),"myState" : 1,"members" : [……{"_id" : 3,"name" : "localhost:28013","health" : 1,"state" : 3,"stateStr" : "RECOVERING","uptime" : 17,"optime" : {"t" : 1338466661000,"i" : 1},"optimeDate" : ISODate("2012-05-31T12:17:41Z"),"lastHeartbeat" : ISODate("2012-05-31T12:18:07Z"),"errmsg" : "initial sync done"}],"ok" : 1}View Code
(4)節點添加完成,狀態正常
rs1:PRIMARY> rs.status(){"set" : "rs1","date" : ISODate("2012-05-31T12:18:10Z"),"myState" : 1,"members" : [……{"_id" : 3,"name" : "localhost:28013","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 19,"optime" : {"t" : 1338466661000,"i" : 1},"optimeDate" : ISODate("2012-05-31T12:17:41Z"),"lastHeartbeat" : ISODate("2012-05-31T12:18:09Z")}],"ok" : 1}View Code
4、驗證資料已經同步過來
[[email protected] data]# /Apps/mongo/bin/mongo -port 28013MongoDB shell version: 1.8.1connecting to: 127.0.0.1:28013/testrs1:SECONDARY> rs.slaveOk()rs1:SECONDARY> db.c1.find(){ "_id" : ObjectId("4fc760d2383ede1dce14ef86"), "age" : 10 }rs1:SECONDARY>
通過資料庫快照集和oplog增加節點
通過oplog 直接進行增加節點操作簡單且無需人工幹預過多,但oplog 是capped collection,採用迴圈的方式進行Tlog,所以採用oplog 的方式進行增加節點,有可能導致資料的不一致,因為日誌中儲存的資訊有可能已經重新整理過了。不過沒關係,我們可以通過資料庫快照集(--fastsync)和oplog 結合的方式來增加節點,這種方式的操作流程是,先取某一個複製整合員的物理檔案來做為初始化資料,然後剩餘的部分用oplog 日誌來追,最終達到資料一致性。
(1)取某一個複製整合員的物理檔案來作為初始化資料
[[email protected] ~]# scp -r /data/data/r3 /data/data/r4[[email protected] ~]# echo "this is rs1 super secret key" > /data/key/r4[[email protected] ~]# chmod 600 /data/key/r4
(2)在取完物理檔案後,在c1集中插入一條新文檔,用於最後驗證此更新也同步了
rs1:PRIMARY> db.c1.find(){ "_id" : ObjectId("4fc760d2383ede1dce14ef86"), "age" : 10 }rs1:PRIMARY> db.c1.insert({age:20})rs1:PRIMARY> db.c1.find(){ "_id" : ObjectId("4fc760d2383ede1dce14ef86"), "age" : 10 }{ "_id" : ObjectId("4fc7748f479e007bde6644ef"), "age" : 20 }rs1:PRIMARY>
(3)啟用28014這個連接埠給新的節點
/Apps/mongo/bin/mongod --replSet rs1 --keyFile /data/key/r4 --fork --port 28014 --dbpath/data/data/r4 --logpath=/data/log/r4.log --logappend --fastsync
(4)添加28014節點
rs1:PRIMARY> rs.add("localhost:28014"){ "ok" : 1 }
(5)驗證資料已經同步過來
[[email protected] data]# /Apps/mongo/bin/mongo -port 28014MongoDB shell version: 1.8.1connecting to: 127.0.0.1:28014/testrs1:SECONDARY> rs.slaveOk()rs1:SECONDARY> db.c1.find(){ "_id" : ObjectId("4fc760d2383ede1dce14ef86"), "age" : 10 }{ "_id" : ObjectId("4fc7748f479e007bde6644ef"), "age" : 20 }rs1:SECONDARY>View Code
MongoDB整理筆記の增加節點