本文是對MongoDB複本集常用操作的一個匯總,同時也穿插著介紹了操作背後的原理及注意點。
結合之前的文章:MongoDB複本集的搭建,大家可以在較短的時間內熟悉MongoDB的搭建和管理。
下面的操作主要分為兩個部分:
1. 修改節點狀態
主要包括:
1> 將Primary節點降級為Secondary節點
2> 凍結Secondary節點
3> 強制Secondary節點進入維護模式
2. 修改複本集的配置
1> 添加節點
2> 刪除節點
3> 將Secondary節點設定為延遲備份節點
4> 將Secondary節點設定為隱藏節點
5> 替換當前的複本集成員
6> 設定複本集節點的優先順序
7> 阻止Secondary節點升級為Primary節點
8> 如何設定沒有投票權的Secondary節點
9> 禁用chainingAllowed
10> 為Secondary節點顯式指定複製源
11> 禁止Secondary節點建立索引
首先查看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.
修改節點狀態
將Primary節點降級為Secondary節點
myapp:PRIMARY> rs.stepDown()
這個命令會讓primary降級為Secondary節點,並維持60s,如果這段時間內沒有新的primary被選舉出來,這個節點可以要求重新進行選舉。
也可手動指定時間
myapp:PRIMARY> rs.stepDown(30)
在執行完該命令後,原Secondary node3:27017升級為Primary。
其日誌輸出為: View Code
原Primary node3:27018降低為Secondary View Code
凍結Secondary節點
如果需要對Primary做一下維護,但是不希望在維護的這段時間內將其它Secondary節點選舉為Primary節點,可以在每次Secondary節點上執行freeze命令,強制使它們始終處於Secondary節點狀態。
myapp:SECONDARY> rs.freeze(100)
註:只能在Secondary節點上執行
myapp:PRIMARY> rs.freeze(100){ "ok" : 0, "errmsg" : "cannot freeze node when primary or running for election. state: Primary", "code" : 95, "codeName" : "NotSecondary"}
如果要解凍Secondary節點,只需執行
myapp:SECONDARY> rs.freeze()
強制Secondary節點進入維護模式
當Secondary節點進入到維護模式後,它的狀態即轉化為“RECOVERING”,在這個狀態的節點,用戶端不會發送讀請求給它,同時它也不能作為複製源。
進入維護模式有兩種觸發方式:
1. 自動觸發
譬如Secondary上執行壓縮
2. 手動觸發
myapp:SECONDARY> db.adminCommand({"replSetMaintenance":true})
修改複本集的配置
添加節點
myapp:PRIMARY> rs.add("node3:27017")
myapp: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)