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。