副本集就是有自動故障恢復功能的主從集羣。主從集羣和副本集最爲明顯的區別就是副本集沒有固定的主節點:整個集羣會選舉出一個主節點,當其不能工做時,則變動到其它節點。副本集總會有一個活躍節點和一個或多個備份節點。 副本集最好的優勢就是全自動化的。 standard:常規節點,存儲一份完整的數據副本,參與選舉投票,可能稱爲活躍節點。 passive:存儲完整的數據副本,參與投票,不能成爲活躍節點。 arbiter:仲裁者只負責投票,不接受複製數據,也不能成爲活躍節點。 用於replica set的參數有兩個: --replSet <setname>,複製集的名稱。 --oplogSize <MB>,操做日誌的大小,單位爲MB。 一. MongoDB:建立Replica Set 1. 分別啓動兩臺mongodb數據庫 mongod --fork --dbpath /data/node2 --logpath /data/mongodb.log --port 10001 --logappend --replSet myrepl/test03:10002 mongod --fork --dbpath /data/node3 --logpath /data/mongodb.log --port 10002 --logappend --replSet myrepl/test02:10001 2. 初始化副本集 config = {"_id" : "myrepl", "members" : [ {"_id" : 0, "host" : "test02:10001"}, {"_id" : 1, "host" : "test03:10002"} ]} rs.initiate(config); rs.status(); myrepl:SECONDARY> rs.status(); { "set" : "myrepl", "date" : ISODate("2014-02-25T02:17:39Z"), "myState" : 2, "syncingTo" : "test03:10002", "members" : [ { "_id" : 0, "name" : "test02:10001", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 968, "optime" : Timestamp(1393294457, 1), "optimeDate" : ISODate("2014-02-25T02:14:17Z"), "errmsg" : "syncing to: test03:10002", "self" : true }, { "_id" : 1, "name" : "test03:10002", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 48, "optime" : Timestamp(1393294457, 1), "optimeDate" : ISODate("2014-02-25T02:14:17Z"), "lastHeartbeat" : ISODate("2014-02-25T02:17:38Z"), "lastHeartbeatRecv" : ISODate("2014-02-25T02:17:39Z"), "pingMs" : 1, "syncingTo" : "test02:10001" } ], "ok" : 1 } 3. 增長一個仲裁節點,只負責仲裁,不作數據存儲。 mongod --fork --dbpath /data/node1 --logpath /data/mongodb.log --port 10003 --logappend --replSet myrepl/test02:10001,test03:10002 myrepl:PRIMARY> rs.addArb("test01:10003"); { "ok" : 1 } 二. MongoDB:Replica Set 增長節點 1. 現有環境: myrepl:PRIMARY> rs.conf(); { "_id" : "myrepl", "version" : 2, "members" : [ { "_id" : 0, "host" : "test02:10001" }, { "_id" : 1, "host" : "test03:10002" }, { "_id" : 2, "host" : "test01:10003", "arbiterOnly" : true } ] } 現有三個節點,兩臺standard節點,一臺arbiter節點。 2. 增長節點 2.1 建立數據目錄和日誌文件: mkdir -p /data/node/ touch /data/mongodb.log 2.2 安裝mongodb: tar zxf mongodb-linux-x86_64-2.4.9.tgz mv mongodb-linux-x86_64-2.4.9 /opt/mongodb echo "export PATH=$PATH:/opt/mongodb/bin" >>/etc/profile source /etc/profile mongod --config ~/.mongodb.conf 2.3 建立新從節點配置文件: cat >> ~/.mongodb.conf <<EOF fork = ture port = 10005 dbpath = /data/node logpath = /data/mongodb.log logappend = true replSet = myrepl EOF 2.4 更改節點信息 cat /etc/sysconfig/network cat >> /etc/hosts << EOF 192.168.27.214 test01 192.168.27.212 test02 192.168.27.213 test03 192.168.27.215 test04 192.168.27.216 test05 EOF 2.5 判斷節點是不是主節點 myrepl:PRIMARY> rs.isMaster(); { "setName" : "myrepl", "ismaster" : true, "secondary" : false, "hosts" : [ "test02:10001", "test03:10002" ], "arbiters" : [ "test01:10003" ], "primary" : "test02:10001", "me" : "test02:10001", "maxBsonObjectSize" : 16777216, "maxMessageSizeBytes" : 48000000, "localTime" : ISODate("2014-02-25T19:23:22.286Z"), "ok" : 1 } 2.6 增長新從節點到replSet myrepl:PRIMARY> rs.add("192.168.27.215:10004"); # 增長arbiter節點的方法:myrepl:PRIMARY> rs.addArb("test01:10003"); 2.7 再次查看Replica Set狀態信息 myrepl:PRIMARY> rs.conf(); { "_id" : "myrepl", "version" : 3, "members" : [ { "_id" : 0, "host" : "test02:10001" }, { "_id" : 1, "host" : "test03:10002" }, { "_id" : 2, "host" : "test01:10003", "arbiterOnly" : true }, { "_id" : 3, "host" : "192.168.27.215:10004" } ] } 3. 測試 3.1 主節點插入數據 myrepl:PRIMARY> db.test.insert({"name" : "xiaohuan", "age" : 30}); 3.2 從節點查詢數據 myrepl:SECONDARY> rs.slaveOk(); myrepl:SECONDARY> db.test.find(); { "_id" : ObjectId("530bfc79eee2c2ce39f9cd95"), "name" : "caoqing" } { "_id" : ObjectId("530bfd8f3627cb16c15dcb32"), "name" : "xiaobao" } { "_id" : ObjectId("530ceed64770e9f00a279900"), "name" : "xiaohuan", "age" : 30 } 4. 把standard節點變爲passive節點 myrepl:PRIMARY> cfg = rs.conf() { "_id" : "myrepl", "version" : 3, "members" : [ { "_id" : 0, "host" : "test02:10001" }, { "_id" : 1, "host" : "test03:10002" }, { "_id" : 2, "host" : "test01:10003", "arbiterOnly" : true }, { "_id" : 3, "host" : "192.168.27.215:10004" } ] } myrepl:PRIMARY> cfg.members[3].priority = 0; 0 myrepl:PRIMARY> rs.reconfig(cfg); myrepl:PRIMARY> rs.conf(); { "_id" : "myrepl", "version" : 4, "members" : [ { "_id" : 0, "host" : "test02:10001" }, { "_id" : 1, "host" : "test03:10002" }, { "_id" : 2, "host" : "test01:10003", "arbiterOnly" : true }, { "_id" : 3, "host" : "192.168.27.215:10004", "priority" : 0 } ] }