您好,登錄后才能下訂單哦!
下面的操作主要分為兩個(gè)部分:
主要包括:
將Primary節(jié)點(diǎn)降級(jí)為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)先級(jí)
阻止Secondary節(jié)點(diǎn)升級(jí)為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)降級(jí)為Secondary節(jié)點(diǎn)
share:PRIMARY> rs.stepDown()
這個(gè)命令會(huì)讓primary降級(jí)為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升級(jí)為Primary。
原Primary node3:27018降低為Secondary
凍結(jié)Secondary節(jié)點(diǎn)
如果需要對(duì)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),客戶端不會(huì)發(fā)送讀請(qǐng)求給它,同時(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)先級(jí)
cfg = rs.conf()
cfg.members[0].priority = 0.5
cfg.members[1].priority = 2
cfg.members[2].priority = 2
rs.reconfig(cfg)
優(yōu)先級(jí)的有效取值是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)先級(jí)設(shè)置的大于Primary節(jié)點(diǎn)的優(yōu)先級(jí),會(huì)導(dǎo)致當(dāng)前Primary節(jié)點(diǎn)的退位。
阻止Secondary節(jié)點(diǎn)升級(jí)為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)。
之所以作此限制,主要是考慮到心跳請(qǐng)求導(dǎo)致的網(wǎng)絡(luò)流量,畢竟每個(gè)成員都要向其它所有成員發(fā)送心跳請(qǐng)求,和選舉花費(fèi)的時(shí)間。
從MongoDB 3.2開始,任何priority大于0的節(jié)點(diǎn)都不可將votes設(shè)置為0
所以,對(duì)于沒有投票權(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)情況下,允許級(jí)聯(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ā)送心跳請(qǐng)求,就可以得知心跳請(qǐng)求所耗費(fèi)的時(shí)間。MongoDB維護(hù)著不同節(jié)點(diǎn)間心跳請(qǐng)求的平均花費(fèi)時(shí)間,選擇同步源時(shí),會(huì)選擇一個(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)然,級(jí)聯(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)都會(huì)從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 }
從上述測(cè)試中可以看出,如果要將節(jié)點(diǎn)的buildIndexes設(shè)置為false,必須同時(shí)將priority設(shè)置為0。
參考
1.《MongoDB權(quán)威指南》
MongoDB官方文檔
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。