一、寫在前面的話
MongoDB支援不同服務之間的非同步資料複製,來實現failover(容錯移轉,故障切換,故障恢複) and redundancy(資料冗餘)。同一時間,只有一個服務節點(primary或者master)支援寫入。MongoDB支援兩種複製的模式:
Master/Slave,主從複製,角色包括master和slave。Replica Set,複製集複製,角色包括primary和secondary。
mongoDB官方推薦使用Replica Set模式,複本集就是有自動故障恢複功能的主從叢集。主從叢集和複本集最為明顯的區別就是複本集沒有固定的主節點:整個叢集會選舉出一個主節點,當其不能工作時,則變更到其它節點。複本集總會有一個活躍節點和一個或多個備份節點。複本集最好的優點就是全自動化的。 二、複本集及叢集介紹
1、節點類型
standard:常規節點,它儲存一份完整的資料副本,參與選舉投票,有可能成為primary節點。
passive:儲存了完整的資料副本,參與投票,不能成為primary節點。
arbiter:仲裁節點,只參與投票,不接收複製的資料,也不能成為primary節點。
一個repica sets節點數量最好為奇數(odd)。
2、參數
用於replica set的參數有兩個:
–replSet ,複製集的名稱。
–oplogSize ,動作記錄的大小,單位為MB。
3、叢集三節點分布
兩個standard節點(這兩個節點直接可以互切primary secondary)。
一個arbiter節點,它手中握著一張選票,決定上面兩個standard節點中的哪一個可以成為primay。 三、配置步驟
1、參照上一篇博文(http://blog.csdn.net/u012859691/article/details/44680249),將三個節點中mongodb.conf的內容修改如下:
port=10001dbpath=data/logpath=log/mongodb.loglogappend=truereplSet=shard1
說明: port=10001,代表連接埠號碼,如果不指定則預設為 27017
replSet=shard1(複製集的名字),一個replica sets中的每個節點的這個參數要一致
logappend=true,記錄檔自動累加,而不是覆蓋
2、啟動第一個standard節點 (ip:192.168.58.135)
hadoop@h1:~/mongodb$ bin/mongod -f mongodb.confall output going to: /home/hadoop/mongodb/log/mongodb.log
啟動第一個standard節點 (ip:192.168.58.136)
hadoop@h2:~/mongodb$ bin/mongod -f mongodb.confall output going to: /home/hadoop/mongodb/log/mongodb.log
3、初始化複本集
在任意一個standard節點上登入mongdb,我們這裡選擇h1(ip:192.168.58.135)
hadoop@h1:~/mongodb$ bin/mongo localhost:10001
並執行如下命令:
cfg={_id:'shard1',members:[ {_id:0,host:'192.168.58.135:10001'}, {_id:1,host:'192.168.58.136:10001'}] }rs.initiate(cfg)
出現下面的提示資訊就代表成功了
{ "info" : "Config now saved locally. Should come online in about a minute.", "ok" : 1 }
4、查看replica set的狀態
hadoop@h1:~/mongodb$ bin/mongo localhost:10001MongoDB shell version: 2.4.6connecting to: localhost:10001/testshard1:SECONDARY> rs.status(){ "set" : "shard1", "date" : ISODate("2015-03-27T11:24:23Z"), "myState" : 2, "syncingTo" : "192.168.58.136:10001", "members" : [ { "_id" : 0, "name" : "192.168.58.135:10001", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 468, "optime" : Timestamp(1427446232, 1), "optimeDate" : ISODate("2015-03-27T08:50:32Z"), "self" : true }, { "_id" : 1, "name" : "192.168.58.136:10001", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 258, "optime" : Timestamp(1427446232, 1), "optimeDate" : ISODate("2015-03-27T08:50:32Z"), "lastHeartbeat" : ISODate("2015-03-27T11:24:23Z"), "lastHeartbeatRecv" : ISODate("2015-03-27T11:24:22Z"), "pingMs" : 0 } ], "ok" : 1}
在replica set的資訊中,其中重要的是:
myState,如果是1代表當前登入的是primary;如果是2代表當前登入的是secondary。
成員資訊中比較重要的是
state:1表示該host是當前可以進行讀寫,2:不能讀寫
health:1表示該host目前是正常的,0:異常
5、測試複本集資料複製功能
(1)登入primary的mongod,插入一條資料
hadoop@h2:~/mongodb$ bin/mongo localhost:10001MongoDB shell version: 2.4.6connecting to: localhost:10001/testshard1:PRIMARY> db.book.insert({'title':'computer'})
(2)登入secondary查看是否有資料
shard1:SECONDARY> use testswitched to db testshard1:SECONDARY> db.book.find()error: { "$err" : "not master and slaveOk=false", "code" : 13435 }
發現報錯了,沒有關係,在secondary讀取資料還需要我們做最後的一步,在需要讀取資料的secondary上執行
shard1:SECONDARY> db.getMongo().setSlaveOk()shard1:SECONDARY> db.book.find(){ "_id" : ObjectId("55153fd08ebbb2c6f1ad3a11"), "title" : "computer" }
ok,測試成功了。
6、增加一個仲裁節點,只負責仲裁,不做資料存放區
shard1:PRIMARY> rs.addArb("192.168.58.137:10001");{ "ok" : 1 }
7、查看現有環境
shard1:PRIMARY> rs.conf(){ "_id" : "shard1", "version" : 3, "members" : [ { "_id" : 0, "host" : "192.168.58.135:10001" }, { "_id" : 1, "host" : "192.168.58.136:10001" }, { "_id" : 2, "host" : "192.168.58.137:10001", "arbiterOnly" : true } ]}