MongoDB叢集上複本集(replica set)建立
1複本集的配置
在單機上成功運行MongoDB後,要使用複本集來建立Mongodb叢集,需要先關閉mongod守護進程,然後:
mongod --replSet setname --fork
來使用自己設定的複本集的名字setname並啟動mongodb。注意,--fork可以不用,它的意義是讓mongod 在後台執行,以方便在shell中運行別的程式。
如果要在設定檔中使用這些選項,可以在設定檔mongo.conf中加入
replSet=setname
fork=true
oplogSize=1024 #記錄檔大小,兆(M)為單位。mongod啟動時會建立相應大小的檔案,如果設定太大會報磁碟空間不足的錯誤
然後使用 mongod -f mongo.conf 來啟動進程
其他選項參見 http://docs.mongodb.org/manual/reference/program/mongod/#cli-mongod-replica-set
2.啟動和增加節點
在各個節點上使用了1.中的配置啟動後,有兩種方法來建立複本集的串連:
1)初始化複本集,增加節點配置
用用戶端登陸進入mongo使用
rs.initiate()
初始化複本集,等待一段時間(主要是建立記錄檔oplog)後,看到提示符顯示setname:PRIMARY> 也就是成功了,然後:
rs.config()
可以查看複本集的配置狀態,比如:
{
"_id" : "clover",
"version" : 5,
"members" : [
{
"_id" : 0,
"host" : "host1:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : 0,
"votes" : 1
}
] ...
目前只有一個主節點(primary),在確保可以訪問另外兩個節點的mongo服務的情況下,在原生mongo shell中輸入:
rs.add("hostname:port")
來增加節點,成功後使用:
[html] view plain copy print?rs.status()
rs.status()來查看副本狀態。
2)使用叢集配置文檔來棄置站台集
這個方法我沒有驗證,如果要利用配置文檔,在進入mongod shell之後,先要建立一個文檔:
config = {
"_id" : "setname",
"members" : [
{"_id" : 0, "host" : "host1:port"},
{"_id" : 1, "host" : "host2:port"},
{"_id" : 2, "host" : "host3:port"},
...
]
}
然後使用這個文檔來啟動複本集:
rs.initiate(config)
使用這種方法必須要用mongo shell來先建立配置文檔,而不能使用設定檔。
3.測試複本集
首先,使用
rs.isMaster()
得到:
{
"setName" : "clover",
"setVersion" : 7,
"ismaster" : true,
"secondary" : false,
"hosts" : [
"host1:27017",
"host2:27017",
"host3:27017"
],
"primary" : "host1:27017",
"me" : "host1:27017",
"electionId" : ObjectId("5535c57b872d670c6331e5bf"),
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 1000,
"localTime" : ISODate("2015-04-21T05:01:31.370Z"),
"maxWireVersion" : 3,
"minWireVersion" : 0,
"ok" : 1
}
這樣來查看主節點和複本集的狀態,值得一提的是,備份節點(secondary)如果設定屬性hidden為0,則rs.isMaster()將不能觀察到此節點,例如下面的代碼:
[html] view plain copy print?cfg=rs.config() #擷取當前的配置
cfg.members[2].priority=0 #讓_id為2的節點優先順序降為0
cfg.members[2].hidden=1 #設定此節點隱藏,僅當其優先順序為0時有效
rs.reconfig(cfg) #應用配置
cfg=rs.config() #擷取當前的配置
cfg.members[2].priority=0 #讓_id為2的節點優先順序降為0
cfg.members[2].hidden=1 #設定此節點隱藏,僅當其優先順序為0時有效
rs.reconfig(cfg) #應用配置將_id為2的節點設為隱藏,使得其狀態不被rs.isMaster看到,但它可以被rs.status()看到。
接著,在mongo shell插入一個文檔:
for(i=0;i<1000;i++){test.coll.insert({count:i})}
db.coll.count() #測試插入文檔是否成功
1000
然後檢查備份節點上的情況:
new Mongo("host2:27017")
db.coll.count()
1000
說明在host2上的資料庫也更新了。
然後,嘗試將host1上的mongod進程宕掉,這種情況在實際生產中可能出現,查看host2和host3的情況:
在host1的bash上:
sudo bin/mongod --shutdown
killing process with pid: 15910
然後登陸host2上的mongo shell,發現提示符已經變為:setname>primary 表示host2已經變為主節點,在host2上db.coll.count()得到1000,表示備份的資料還在。
重新使用之前的叢集設定檔來啟動mongod -f mongo.conf ,發現提示符為setname:SECONDARY>表示其變為備份節點,在host2上用rs.isMaster()測試顯示:
"setName" : "clover",
"setVersion" : 9,
"ismaster" : true,
"secondary" : false,
"hosts" : [
"host1:27017",
"host2:27017"
],
"passives" : [
"host3:27017"
],
"primary" : "host2:27017",
"me" : "zookeeper2:27017",<
複本集重新變為3台主機。host2仍為主節點,host3因為設定優先權為0變為消極(passives)狀態,它不會被選為主節點。
更多MongoDB相關教程見以下內容:
CentOS 編譯安裝 MongoDB與mongoDB的php擴充
CentOS 6 使用 yum 安裝MongoDB及伺服器端配置
Ubuntu 13.04下安裝MongoDB2.4.3
MongoDB入門必讀(概念與實戰並重)
Ubunu 14.04下MongoDB的安裝指南
《MongoDB 權威指南》(MongoDB: The Definitive Guide)英文文字版[PDF]
Nagios監控MongoDB分區叢集服務實戰
基於CentOS 6.5作業系統搭建MongoDB服務
MongoDB 的詳細介紹:請點這裡
MongoDB 的:請點這裡
本文永久更新連結地址: