以下圖片摘自MongoDB官方文檔:http://docs.mongodb.org/manual/core/replication-introduction/
Primary節(jié)點接收客戶端所有的寫操作,整個副本集只會有一個primary節(jié)點。MongoDB副本集提供嚴格的一致性。主節(jié)點將所有的操作寫入一個叫oplog的capped collection(這個collection的大小一般為磁盤剩余空間的5%,不同的系統(tǒng)可能不一樣,詳見http://docs.mongodb.org/manual/core/replica-set-oplog/)中,secondary節(jié)點通過復制oplog并執(zhí)行oplog中的所有操作,因為對oplog的執(zhí)行是冪等的,所以secondary節(jié)點上的數(shù)據(jù)可以保持和primary節(jié)點一樣,當然這有一個“追趕”(catch up)的過程,會存在一定的落后(Lag)有時候因為網(wǎng)絡延遲或宕機導致從節(jié)點永遠趕不上主節(jié)點,這時候需要采取人為的干預了(后面會說到Resyncing Member of Replica Set)。
默認所有的讀操作也是走的primary節(jié)點,當然客戶端可以選擇從secondary節(jié)點進行讀取操作以減小主節(jié)點的壓力(后面會對讀寫分離有詳細說明)。
各個節(jié)點之間是通過心跳機制來維持聯(lián)系的,當主節(jié)點無法和集群中其他節(jié)點通信超過10秒,集群會從剩下的節(jié)點中選擇一個secondary作為primary,這個過程叫做選舉(election),每個secondary節(jié)點都有一個優(yōu)先級priority來參與投票(也可以有沒有投票權的secondary節(jié)點),priority值越大就越優(yōu)先成為主節(jié)點(所有的節(jié)點可以有相同的優(yōu)先級,默認值都是1)。election的策略不僅僅就是根據(jù)priority值來,會綜合很多其他的因素。總之MongoDB通過heartbeat和election機制實現(xiàn)了自動的Failover:
副本集要求參與選舉投票(vote)的節(jié)點數(shù)為奇數(shù),這很容易理解。當我們實際環(huán)境中因為機器等原因限制只有兩個(或偶數(shù))的節(jié)點,這時為了實現(xiàn)Automatic Failover引入另一類節(jié)點:仲裁者(arbiter),仲裁者只參與投票不擁有實際的數(shù)據(jù),因此它對物理資源要求不嚴格。
上面已經(jīng)提到了primary,secondary和arbiter,整個MongoDB副本集群中除了這三種類型的節(jié)點還有其他幾種:
Secondary-Only:這種類型的節(jié)點和secondary節(jié)點一樣擁有數(shù)據(jù)副本,但是它們在任何情形下都成為不了primary節(jié)點。
Hidden:這種類型的節(jié)點對客戶端程序來說是不可見的,同樣也不能成為primary節(jié)點,但是Hidden成員能夠參與選舉投票。
Delayed:這種類型的成員通過人為的設置,可以指定一個時間來延遲從primary節(jié)點同步數(shù)據(jù)。Delayed成員的作用在于幫助集群從一些誤操作中恢復,比如管理員誤刪除了某個集合。不至于迅速擴散到整個集群中。因此Delayed節(jié)點必須不能成為primary節(jié)點(priority為0)并且是Hidden的。
Non-Voting:這就是上面提到了沒有選舉權的secondary節(jié)點。這種類型的節(jié)點一般當集群節(jié)點數(shù)超過12才會需要。
主:192.168.1.100
從:192.168.1.101,192.168.1.102
1.首先已經(jīng)安裝完mongodb(我們使用rpm安裝)。
mongodb默認端口為:27017
2.修改兩個從節(jié)點配置文件
service mongod stop vim /etc/mongod.conf取消注釋replSet,設置其名稱;并添加replIndexPrefetch項。如下:
重啟服務:
service mongod start3.登錄到主節(jié)點命令行中
mongo>rs.status() { "startupStatus" : 3, "info" : "run rs.initiate(...) if not yet done for the set", "ok" : 0, "errmsg" : "can't get local.system.replset config from self or any seed (YCONFIG)" }啟動一個新的副本集
>rs.initiate() { "info2" : "no configuration explicitly specified -- making one", "me" : "Centos:27017", "info" : "Config now saved locally. Should come online in about a minute "ok" : 1 }在Mongo客戶端使用命令rs.initiate()來啟動一個新的副本集。
我們可以使用rs.conf()來查看副本集的配置
查看副本集狀態(tài)使用 rs.status() 命令
副本集添加成員
添加副本集的成員,我們需要使用多條服務器來啟動mongo服務。進入Mongo客戶端,并使用rs.add()方法來添加副本集的成員。
rs.add() 命令基本語法格式如下:
>rs.add(Host_NAME:PORT)添加兩個從節(jié)點成員:
testSet:PRIMARY> rs.add("192.168.1.101") --默認27017不用指定 { "ok" : 1 } testSet:PRIMARY> rs.add("192.168.1.102") { "ok" : 1 }此時,查看副本集狀態(tài):
testSet:PRIMARY> rs.status() { "set" : "testSet", "date" : ISODate("2017-03-22T07:58:26Z"), "myState" : 1, "members" : [ { "_id" : 0, "name" : "Centos:27017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 1293, "optime" : Timestamp(1490168420, 1), "optimeDate" : ISODate("2017-03-22T07:40:20Z"), "electionTime" : Timestamp(1490168213, 11), "electionDate" : ISODate("2017-03-22T07:36:53Z"), "self" : true }, { "_id" : 1, "name" : "192.168.1.101:27017", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 1146, "optime" : Timestamp(1490168420, 1), "optimeDate" : ISODate("2017-03-22T07:40:20Z"), "lastHeartbeat" : ISODate("2017-03-22T07:58:25Z"), "lastHeartbeatRecv" : ISODate("2017-03-22T07:58:25Z"), "pingMs" : 1, "syncingTo" : "Centos:27017" }, { "_id" : 2, "name" : "192.168.1.102:27017", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 1086, "optime" : Timestamp(1490168420, 1), "optimeDate" : ISODate("2017-03-22T07:40:20Z"), "lastHeartbeat" : ISODate("2017-03-22T07:58:25Z"), "lastHeartbeatRecv" : ISODate("2017-03-22T07:58:24Z"), "pingMs" : 1, "lastHeartbeatMessage" : "syncing to: Centos:27017", "syncingTo" : "Centos:27017" } ], "ok" : 1 }測試:
在主節(jié)點創(chuàng)建新庫,并插入新數(shù)據(jù):
testSet:PRIMARY> show dbs; admin (empty) local 6.075GB testSet:PRIMARY> use test switched to db test testSet:PRIMARY> show dbs admin (empty) local 6.075GB testSet:PRIMARY> db.test.insert({"name":"菜鳥教程"}) WriteResult({ "nInserted" : 1 }) testSet:PRIMARY> show dbs admin (empty) local 6.075GB test 0.078GB查看從節(jié)點信息:
testSet:SECONDARY> show dbs; admin (empty) local 6.075GB test 0.078GB testSet:SECONDARY> db.test.find() { "_id" : ObjectId("58d231485934aa983f070c99"), "name" : "菜鳥教程" }問題及解決:
1.初始化副本集時報錯:
解決:編輯hosts文件添加主機名稱解析,之后重新初始化副本集。
[root@Centos ~]# vim /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 127.0.0.1 Centos2.添加副本集成員時報錯:
testSet:PRIMARY> rs.add("192.168.1.101:27017") { "errmsg" : "exception: need most members up to reconfigure, not ok : 192.1.101:27017", "code" : 13144, "ok" : 0 }解決:由于從節(jié)點配置文件中bind綁定為127.0.0.1的ip信息,從而導致不能添加192端的ip,將其bind注釋掉。
3.添加完成員,查看副本集狀態(tài)時,節(jié)點一直 顯示如:"stateStr" : "UNKNOWN"
解決:問題的原因是rs.initiate()默認將primary的host鍵設置成機器的主機名,如下:
1)可以編輯兩個從節(jié)點的hosts文件添加主節(jié)點主機名和Ip信息,如:
[root@RedHat-1 ~]# vim /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.1.100 Centos2)可以將primary的主機名改成IP地址:
cfg = rs.conf() cfg.members[0].host = "192.168.1.100:27017" rs.reconfig(cfg)另外有需要云服務器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
本文名稱:Mongodb副本集實現(xiàn)-創(chuàng)新互聯(lián)
新聞來源:http://jinyejixie.com/article32/ccpjsc.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、微信小程序、網(wǎng)頁設計公司、域名注冊、關鍵詞優(yōu)化、App設計
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容