下面的操作主要分為兩個(gè)部分:
目前成都創(chuàng)新互聯(lián)公司已為近1000家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬主機(jī)、網(wǎng)站改版維護(hù)、企業(yè)網(wǎng)站設(shè)計(jì)、簡陽網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。主要包括:
將Primary節(jié)點(diǎn)降級為Secondary節(jié)點(diǎn)
凍結(jié)Secondary節(jié)點(diǎn)
強(qiáng)制Secondary節(jié)點(diǎn)進(jìn)入維護(hù)模式
2.?修改副本集的配置
添加節(jié)點(diǎn)
刪除節(jié)點(diǎn)
將Secondary節(jié)點(diǎn)設(shè)置為延遲備份節(jié)點(diǎn)
將Secondary節(jié)點(diǎn)設(shè)置為隱藏節(jié)點(diǎn)
替換當(dāng)前的副本集成員
設(shè)置副本集節(jié)點(diǎn)的優(yōu)先級
阻止Secondary節(jié)點(diǎn)升級為Primary節(jié)點(diǎn)
如何設(shè)置沒有投票權(quán)的Secondary節(jié)點(diǎn)
禁用chainingAllowed
為Secondary節(jié)點(diǎn)顯式指定復(fù)制源
禁止Secondary節(jié)點(diǎn)創(chuàng)建索引
首先查看MongoDB副本集支持的所有操作
rs.help()
rs.status() { replSetGetStatus : 1 } checks repl set status
rs.initiate() { replSetInitiate : null } initiates set with default settings
rs.initiate(cfg) { replSetInitiate : cfg } initiates set with configuration cfg
rs.conf() get the current configuration object from local.system.replset
rs.reconfig(cfg) updates the configuration of a running replica set with cfg (disconnects)
rs.add(hostportstr) add a new member to the set with default attributes (disconnects)
rs.add(membercfgobj) add a new member to the set with extra attributes (disconnects)
rs.addArb(hostportstr) add a new member which is arbiterOnly:true (disconnects)
rs.stepDown([stepdownSecs, catchUpSecs]) step down as primary (disconnects)
rs.syncFrom(hostportstr) make a secondary sync from the given member
rs.freeze(secs) make a node ineligible to become primary for the time specified
rs.remove(hostportstr) remove a host from the replica set (disconnects)
rs.slaveOk() allow queries on secondary nodes
rs.printReplicationInfo() check oplog size and time range
rs.printSlaveReplicationInfo() check replica set members and replication lag
db.isMaster() check who is primary
reconfiguration helpers disconnect from the database so the shell will display
an error, even if the command succeeds.
修改節(jié)點(diǎn)狀態(tài)
將Primary節(jié)點(diǎn)降級為Secondary節(jié)點(diǎn)
share:PRIMARY> rs.stepDown()
這個(gè)命令會讓primary降級為Secondary節(jié)點(diǎn),并維持60s,如果這段時(shí)間內(nèi)沒有新的primary被選舉出來,這個(gè)節(jié)點(diǎn)可以要求重新進(jìn)行選舉。
也可手動(dòng)指定時(shí)間
share:PRIMARY> rs.stepDown(30)
在執(zhí)行完該命令后,原Secondary node3:27017升級為Primary。
原Primary node3:27018降低為Secondary
凍結(jié)Secondary節(jié)點(diǎn)
如果需要對Primary做一下維護(hù),但是不希望在維護(hù)的這段時(shí)間內(nèi)將其它Secondary節(jié)點(diǎn)選舉為Primary節(jié)點(diǎn),可以在每次Secondary節(jié)點(diǎn)上執(zhí)行freeze命令,強(qiáng)制使它們始終處于Secondary節(jié)點(diǎn)狀態(tài)。
share:SECONDARY> rs.freeze(100)
注:只能在Secondary節(jié)點(diǎn)上執(zhí)行
share:PRIMARY> rs.freeze(100)
{
"ok" : 0,
"errmsg" : "cannot freeze node when primary or running for election. state: Primary",
"code" : 95,
"codeName" : "NotSecondary"
}
如果要解凍Secondary節(jié)點(diǎn),只需執(zhí)行
share:SECONDARY> rs.freeze()
強(qiáng)制Secondary節(jié)點(diǎn)進(jìn)入維護(hù)模式
當(dāng)Secondary節(jié)點(diǎn)進(jìn)入到維護(hù)模式后,它的狀態(tài)即轉(zhuǎn)化為“RECOVERING”,在這個(gè)狀態(tài)的節(jié)點(diǎn),客戶端不會發(fā)送讀請求給它,同時(shí)它也不能作為復(fù)制源。
進(jìn)入維護(hù)模式有兩種觸發(fā)方式:
譬如Secondary上執(zhí)行壓縮
share:SECONDARY> db.adminCommand({"replSetMaintenance":true})
修改副本集的配置
添加節(jié)點(diǎn)
share:PRIMARY> rs.add("node3:27017")
share:PRIMARY> rs.add({_id: 3, host: "node3:27017", priority: 0, hidden: true})
也可通過配置文件的方式
cfg={
"_id" : 3,
"host" : "node3:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : true,
"priority" : 0,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
}
rs.add(cfg)
刪除節(jié)點(diǎn)
第一種方式
share:PRIMARY> rs.remove("node3:27017")
第二種方式
share:PRIMARY> cfg = rs.conf()
share:PRIMARY> cfg.members.splice(2,1)
share:PRIMARY> rs.reconfig(cfg)
注:執(zhí)行rs.reconfig并不必然帶來副本集的重新選舉,加force參數(shù)同樣如此。
The rs.reconfig() shell method can trigger the current primary to step down in some situations.
修改節(jié)點(diǎn)的配置
將Secondary節(jié)點(diǎn)設(shè)置為延遲備份節(jié)點(diǎn)
cfg = rs.conf()
cfg.members[1].priority = 0
cfg.members[1].hidden = true
cfg.members[1].slaveDelay = 3600
rs.reconfig(cfg)
將Secondary節(jié)點(diǎn)設(shè)置為隱藏節(jié)點(diǎn)
cfg = rs.conf()
cfg.members[0].priority = 0
cfg.members[0].hidden = true
rs.reconfig(cfg)
替換當(dāng)前的副本集成員
cfg = rs.conf()
cfg.members[0].host = "mongo2.example.net"
rs.reconfig(cfg)
設(shè)置副本集節(jié)點(diǎn)的優(yōu)先級
cfg = rs.conf()
cfg.members[0].priority = 0.5
cfg.members[1].priority = 2
cfg.members[2].priority = 2
rs.reconfig(cfg)
優(yōu)先級的有效取值是0~1000,可為小數(shù),默認(rèn)為1
從MongoDB 3.2開始
Non-voting members must have priority of 0.
Members with priority greater than 0 cannot have 0 votes.
注:如果將當(dāng)前Secondary節(jié)點(diǎn)的優(yōu)先級設(shè)置的大于Primary節(jié)點(diǎn)的優(yōu)先級,會導(dǎo)致當(dāng)前Primary節(jié)點(diǎn)的退位。
阻止Secondary節(jié)點(diǎn)升級為Primary節(jié)點(diǎn)
只需將priority設(shè)置為0
fg = rs.conf()
cfg.members[2].priority = 0
rs.reconfig(cfg)
如何設(shè)置沒有投票權(quán)的Secondary節(jié)點(diǎn)
MongoDB限制一個(gè)副本集最多只能擁有50個(gè)成員節(jié)點(diǎn),其中,最多只有7個(gè)成員節(jié)點(diǎn)擁有投票權(quán)。
之所以作此限制,主要是考慮到心跳請求導(dǎo)致的網(wǎng)絡(luò)流量,畢竟每個(gè)成員都要向其它所有成員發(fā)送心跳請求,和選舉花費(fèi)的時(shí)間。
從MongoDB 3.2開始,任何priority大于0的節(jié)點(diǎn)都不可將votes設(shè)置為0
所以,對于沒有投票權(quán)的Secondary節(jié)點(diǎn),votes和priority必須同時(shí)設(shè)置為0
cfg = rs.conf()
cfg.members[3].votes = 0
cfg.members[3].priority = 0
cfg.members[4].votes = 0
cfg.members[4].priority = 0
rs.reconfig(cfg)
禁用chainingAllowed
默認(rèn)情況下,允許級聯(lián)復(fù)制。
即備份集中如果新添加了一個(gè)節(jié)點(diǎn),這個(gè)節(jié)點(diǎn)很可能是從其中一個(gè)Secondary節(jié)點(diǎn)處進(jìn)行復(fù)制,而不是從Primary節(jié)點(diǎn)處復(fù)制。
MongoDB根據(jù)ping時(shí)間選擇同步源,一個(gè)節(jié)點(diǎn)向另一個(gè)節(jié)點(diǎn)發(fā)送心跳請求,就可以得知心跳請求所耗費(fèi)的時(shí)間。MongoDB維護(hù)著不同節(jié)點(diǎn)間心跳請求的平均花費(fèi)時(shí)間,選擇同步源時(shí),會選擇一個(gè)離自己比較近而且數(shù)據(jù)比自己新的節(jié)點(diǎn)。
如何判斷節(jié)點(diǎn)是從哪個(gè)節(jié)點(diǎn)處進(jìn)行復(fù)制的呢?
share:PRIMARY> rs.status().members[1].syncingTo
node3:27018
當(dāng)然,級聯(lián)復(fù)制也有顯而易見的缺點(diǎn):復(fù)制鏈越長,將寫操作復(fù)制到所有Secondary節(jié)點(diǎn)所花費(fèi)的時(shí)間就越長。
可通過如下方式禁用
cfg=rs.conf()
cfg.settings.chainingAllowed=false
rs.reconfig(cfg)
將chainingAllowed設(shè)置為false后,所有Secondary節(jié)點(diǎn)都會從Primary節(jié)點(diǎn)復(fù)制數(shù)據(jù)。
為Secondary節(jié)點(diǎn)顯式指定復(fù)制源
rs.syncFrom("node3:27019")
禁止Secondary節(jié)點(diǎn)創(chuàng)建索引
有時(shí),并不需要Secondary節(jié)點(diǎn)擁有和Primary節(jié)點(diǎn)相同的索引,譬如這個(gè)節(jié)點(diǎn)只是用來處理數(shù)據(jù)備份或者離線的批量任務(wù)。這個(gè)時(shí)候,就可以阻止Secondary節(jié)點(diǎn)創(chuàng)建索引。
在MongoDB 3.4版本中,不允許直接修改,只能在添加節(jié)點(diǎn)時(shí)顯式指定
share:PRIMARY> cfg=rs.conf()
share:PRIMARY> cfg.members[2].buildIndexes=false
false
share:PRIMARY> rs.reconfig(cfg)
{
"ok" : 0,
"errmsg" : "priority must be 0 when buildIndexes=false",
"code" : 103,
"codeName" : "NewReplicaSetConfigurationIncompatible"
}
share:PRIMARY> cfg.members[2].buildIndexes=false
false
share:PRIMARY> cfg.members[2].priority=0
0
share:PRIMARY> rs.reconfig(cfg)
{
"ok" : 0,
"errmsg" : "New and old configurations differ in the setting of the buildIndexes field for member node3:27017; to make this c
hange, remove then re-add the member", "code" : 103,
"codeName" : "NewReplicaSetConfigurationIncompatible"
}
share:PRIMARY> rs.remove("node3:27017")
{ "ok" : 1 }
share:PRIMARY> rs.add({_id: 2, host: "node3:27017", priority: 0, buildIndexes:false})
{ "ok" : 1 }
從上述測試中可以看出,如果要將節(jié)點(diǎn)的buildIndexes設(shè)置為false,必須同時(shí)將priority設(shè)置為0。
參考
1.《MongoDB權(quán)威指南》
MongoDB官方文檔
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
分享標(biāo)題:MongoDB副本集的常用操作及原理-創(chuàng)新互聯(lián)
網(wǎng)站鏈接:http://jinyejixie.com/article30/csdcso.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、品牌網(wǎng)站制作、ChatGPT、靜態(tài)網(wǎng)站、虛擬主機(jī)、微信小程序
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容