1. 程式人生 > 實用技巧 >Mongodb副本集常用操作

Mongodb副本集常用操作

手動主從切換

方法一:

修改主節點狀態

將Primary節點降級為Secondary節點

myapp:PRIMARY> rs.stepDown()

這個命令會讓primary降級為Secondary節點,並維持60s,如果這段時間內沒有新的primary被選舉出來,這個節點可以要求重新進行選舉。也可手動指定時間

myapp:PRIMARY> rs.stepDown(30)

凍結Secondary節點

不打算在維護的這段時間內將其它Secondary節點選舉為Primary節點,可以在每次Secondary節點上執行freeze命令,強制使它們始終處於Secondary節點狀態。

myapp:SECONDARY> rs.freeze(100)

注:只能在Secondary節點上執行

如果要解凍Secondary節點,只需執行

myapp:SECONDARY> rs.freeze()

方法二:優先順序設定

思路:
1.為了保證資料的一致性,必須先關閉應用的寫服務。
2.提升要升級為Primary節點的Secondary節點的優先順序。

arps:PRIMARY> config=rs.conf()                //檢視當前配置,存入config變數中。
arps:PRIMARY> config.members[2].priority = 3  //
修改config變數,第三組成員的優先順序為3. arps:PRIMARY> rs.reconfig(config) //配置生效

修改副本集相關配置

新增節點

myapp:PRIMARY> rs.add("node3:27017")  #新增節點
myapp:PRIMARY> rs.add({_id: 3, host: "node3:27017", priority: 0, hidden: true})
rs.addArb("192.168.1.102:27017")      #新增仲裁節點

也可以通過配置檔案的方式

> cfg={
    "_id" : 3,
    "host" : "node3:27017",
    "arbiterOnly" : false,
    "buildIndexes" : true,
    "hidden" : true,
    "priority" : 0,
    "tags" : {
        
    },
    "slaveDelay" : NumberLong(0),
    "votes" : 1
}
> rs.add(cfg)

刪除節點

第一種方式

myapp:PRIMARY> rs.remove("node3:27017")

第二種方式

myapp:PRIMARY> cfg = rs.conf()
myapp:PRIMARY> cfg.members.splice(2,1)
myapp:PRIMARY> rs.reconfig(cfg)

注:執行rs.reconfig並不必然帶來副本集的重新選舉,加force引數同樣如此。

修改節點

將Secondary節點設定為延遲備份節點

cfg = rs.conf()
cfg.members[1].priority = 0
cfg.members[1].hidden = true
cfg.members[1].slaveDelay = 3600
rs.reconfig(cfg)

將Secondary節點設定為隱藏節點

cfg = rs.conf()
cfg.members[0].priority = 0
cfg.members[0].hidden = true
rs.reconfig(cfg)

替換當前的副本整合員

cfg = rs.conf()
cfg.members[0].host = "mongo2.example.net"
rs.reconfig(cfg)

設定副本集節點的優先順序

cfg = rs.conf()
cfg.members[0].priority = 0.5
cfg.members[1].priority = 2
cfg.members[2].priority = 2
rs.reconfig(cfg)

優先順序的有效取值是0~1000,可為小數,預設為1

注:如果將當前Secondary節點的優先順序設定的大於Primary節點的優先順序,會導致當前Primary節點的退位。

阻止Secondary節點升級為Primary節點

只需將priority設定為0

fg = rs.conf()
cfg.members[2].priority = 0
rs.reconfig(cfg)

如何設定沒有投票權的Secondary節點

MongoDB限制一個副本集最多隻能擁有50個成員節點,其中,最多隻有7個成員節點擁有投票權。

之所以作此限制,主要是考慮到心跳請求導致的網路流量,畢竟每個成員都要向其它所有成員傳送心跳請求,和選舉花費的時間。

從MongoDB 3.2開始,任何priority大於0的節點都不可將votes設定為0

所以,對於沒有投票權的Secondary節點,votes和priority必須同時設定為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

預設情況下,允許級聯複製。

即備份集中如果新添加了一個節點,這個節點很可能是從其中一個Secondary節點處進行復制,而不是從Primary節點處複製。

MongoDB根據ping時間選擇同步源,一個節點向另一個節點發送心跳請求,就可以得知心跳請求所耗費的時間。MongoDB維護著不同節點間心跳請求的平均花費時間,選擇同步源時,會選擇一個離自己比較近而且資料比自己新的節點。

如何判斷節點是從哪個節點處進行復制的呢?

myapp:PRIMARY> rs.status().members[1].syncingTo
node3:27018

當然,級聯複製也有顯而易見的缺點:複製鏈越長,將寫操作複製到所有Secondary節點所花費的時間就越長。

可通過如下方式禁用

cfg=rs.conf()
cfg.settings.chainingAllowed=false
rs.reconfig(cfg)

將chainingAllowed設定為false後,所有Secondary節點都會從Primary節點複製資料。

為Secondary節點顯式指定複製源

rs.syncFrom("node3:27019")

禁止Secondary節點建立索引

有時,並不需要Secondary節點擁有和Primary節點相同的索引,譬如這個節點只是用來處理資料備份或者離線的批量任務。這個時候,就可以阻止Secondary節點建立索引。

在MongoDB 3.4版本中,不允許直接修改,只能在新增節點時顯式指定

myapp:PRIMARY> cfg=rs.conf()
myapp:PRIMARY> cfg.members[2].buildIndexes=false
false
myapp:PRIMARY> rs.reconfig(cfg)
{
    "ok" : 0,
    "errmsg" : "priority must be 0 when buildIndexes=false",
    "code" : 103,
    "codeName" : "NewReplicaSetConfigurationIncompatible"
}
myapp:PRIMARY> cfg.members[2].buildIndexes=false
false
myapp:PRIMARY> cfg.members[2].priority=0
0
myapp: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"
}
myapp:PRIMARY> rs.remove("node3:27017")
{ "ok" : 1 }
myapp:PRIMARY> rs.add({_id: 2, host: "node3:27017", priority: 0, buildIndexes:false})
{ "ok" : 1 }

從上述測試中可以看出,如果要將節點的buildIndexes設定為false,必須同時將priority設定為0。