在上一篇文章中,我們搭建了3個節點的副本集,集群信息如下:
rstest:PRIMARY> rs.config() { "_id" : "rstest", "version" : 2, "protocolVersion" : NumberLong(1), "writeConcernMajorityJournalDefault" : true, "members" : [ { "_id" : 0, "host" : "192.168.10.41:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 2, "tags" : { }, "slaveDelay" : NumberLong(0), "votes" : 1 }, { "_id" : 1, "host" : "192.168.10.42:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : NumberLong(0), "votes" : 1 }, { "_id" : 2, "host" : "192.168.10.43:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 0, "tags" : { }, "slaveDelay" : NumberLong(0), "votes" : 1 } ], "settings" : { "chainingAllowed" : true, "heartbeatIntervalMillis" : 2000, "heartbeatTimeoutSecs" : 10, "electionTimeoutMillis" : 10000, "catchUpTimeoutMillis" : -1, "catchUpTakeoverDelayMillis" : 30000, "getLastErrorModes" : { }, "getLastErrorDefaults" : { "w" : 1, "wtimeout" : 0 }, "replicaSetId" : ObjectId("5ef1b03c01bba8d9a6759c18") } }
(一)刪除副本集成員
刪除副本集成員可以使用rs.remove()或者rs.reconfig()。
方法一:使用rs.remove刪除"IP為192.168.10.42"的成員
STEP1:關閉要刪除節點的實例
[root@mongodbserver2 ~]#mongo -u replica -p replica --
authenticationDatabase admin MongoDB shell version v4.2.7 connecting to: mongodb://127.0.0.1:27017/?authSource=admin&compressors=disabled&gssapiServiceName=mongodb Implicit session: session { "id" : UUID("946853b3-ad91-44d0-b7df-3001cbfc1af0") } MongoDB server version: 4.2.7 rstest:SECONDARY> use admin switched to db admin rstest:SECONDARY> db.shutdownServer() 2020-06-28T23:47:02.129+0800 I NETWORK [js] DBClientConnection failed to receive message from 127.0.0.1:27017 - HostUnreachable: Connection closed by peer server should be down... 2020-06-28T23:47:02.134+0800 I NETWORK [js] trying reconnect to 127.0.0.1:27017 failed 2020-06-28T23:47:02.134+0800 I NETWORK [js] reconnect 127.0.0.1:27017 failed failed 2020-06-28T23:47:02.137+0800 I NETWORK [js] trying reconnect to 127.0.0.1:27017 failed 2020-06-28T23:47:02.137+0800 I NETWORK [js] reconnect 127.0.0.1:27017 failed failed >
STEP2:連接到主節點,不知道主節點,可以使用db.isMaster()確認
STEP3:在主節點上刪除成員
rstest:PRIMARY> rs.remove("192.168.10.42:27017") { "ok" : 1, "$clusterTime" : { "clusterTime" : Timestamp(1593359559, 1), "signature" : { "hash" : BinData(0,"UpD/BEf5OF484ZeHTHCEDReiJKw="), "keyId" : NumberLong("6841443127941660675") } }, "operationTime" : Timestamp(1593359559, 1) } rstest:PRIMARY>
方法二:使用rs.reconfig刪除成員
這里不再演示,見官方文檔:https://docs.mongodb.com/manual/tutorial/remove-replica-set-member/
(二)添加副本集成員
這里演示如何把上面已經刪除的節點重新添加回來。
STEP1:啟動節點,節點的啟動參數必須含有集群參數。主要參數如下:
# network interfaces net: port: 27017 bindIp: 0.0.0.0 # Listen to local interface only, comment to listen on all interfaces. security: authorization: enabled keyFile: /mongo/mongo-keyfile replication: replSetName: rstest
STEP2:在主節點上執行添加節點命令
rs.add( { host: "192.168.10.42:27017", priority: 0, votes: 0 } )
注意:當新添加服務器的priority和votes大於0時,在其初始同步期間,即使該服務器由於數據不一致而無法提供讀取服務或成為主服務器,但是他仍會作為有表決權的成員,這可能會導致多數投票成員在線但是無法選舉主成員的情況。
STEP3:確保新加入的成員狀態已經轉變為SECONDARY
rs.status()
STEP4:如果新成員狀態已經轉變為SECONDARY,如果需要,可以使用rs.reconfig()更改新成員的priority和votes。
var cfg = rs.conf(); cfg.members[3].priority = 1 cfg.members[3].votes = 1 rs.reconfig(cfg)
【完】