MongoDB 副本集管理


版本:3.6 

一、以單機模式啟動成員節點

有時候出於維護的需要,需要以單機模式啟動某個節點而不是一個副本集成員身份。

1).首先查詢服務器命令行參數

db.serverCmdLineOpts()

2).關閉當前副本

3).以單機模式啟動副本

這里需要指定副本原先的db路徑,為了避免可能的其它連接這里可以指定一個新的port啟動;也可以直接使用原先的配置文件啟動只需要注釋掉“replSet”參數即可。

mongod --port 27000 --bind_ip 192.168.137.10,127.0.0.1 --dbpath /mongos27012/data/db4

4).維護完之后再以副本成員身份啟動當前服務器。

二、檢查寫入是否成功

getLastError命令檢查寫入是否成功

db.runCommand({"getLastError":1,"w":2,"wtimeout":1000});

getLastErrorDefaults默認配置值

conf = rs.config();

conf.settings = {"getLastErrorDefaults" : {

                            "w" : 1,

                            "wtimeout" : 0

                            }

                            };

rs.reconfig(conf);

wtimeout:等待超時時長,如果超過這個時間MongoDB無法在指定時間內將寫入操作復制到“w”個成員,返回超時。

w的多個值:

majority:一直等待保證大多數成員都執行完了寫入操作

number(數字):w值包含主節點,如果設置1那么只保證主節點寫入成功,如果希望被復制到N個節點,那么應該將“w”設置為N+1

三、自定義復制保證規則,設置成員標簽

1.設置成員標簽

conf = rs.config();

conf.members[0].tags={"dc" : "dc01"};

conf.members[1].tags={"dc" : "dc01"};

conf.members[2].tags={"dc" : "dc02"};

rs.reconfig(conf);

上面操作設置了兩個組,分別是dc01和dc02;

注意:

1.tags用來給每一個節點成員設置標簽,它是一個集合所以可以像集合一樣包含多個值,比如

{"dc": "rack1", disk:"ssd", ssd: "installed"}

2.如果要初始化tags必須先初始化settings.getLastErrorModes

2.配置規則,應用於settings選項

通過配置getLastErrorMode字段實現,每條規則的形式為:"name":{"key":number}.其中name是規則的名字,自己定,key就是上面tags的標識,number表示復制操作至少復制到多少個分組上,每個分組內至少一台機器上.

conf = rs.config();

conf.settings.getLastErrorModes={"eachDC":{"dc":2}                                                }

rs.reconfig(conf);

初始化getLastErrorModes

conf = rs.config();

conf.settings.getLastErrorModes={}

rs.reconfig(conf);

3.插入記錄並應用規則

db.users.insert( { id: "xyz", status: "A" }, { writeConcern: { w:"eachDC" } } );

注意:如果不想數據復制到某個節點,可以不給這個節點配置標簽,這樣該成員就是隱藏成員。

conf = rs.config();

conf.members[1].tags={};

rs.reconfig(conf);

4.注意事項

conf = rs.conf()

conf.members[0].tags = { "dc": "east", "production": "node-1" }

conf.members[1].tags = { "dc": "east", "production": "node-2" }

conf.members[2].tags = { "dc": "east", "production": "node-3" }

rs.reconfig(conf)

下面的規則可以創建成功,因為標簽production擁有三個不同的組

conf.settings = {

    getLastErrorModes: {

        productionWriteConcern : { "production": 3 }

    }

}

下面的規則不能創建成功,因為標簽dc只有一個唯一的組

conf.settings = {

    getLastErrorModes: {

        dcWriteConcern : { "dc": 3 }

    }

}

四、副本集配置

副本集的配置在local.system.replSet集合中。副本集中所有成員的的該文檔記錄都是相同的。

rs.:副本命令,是replSet是縮寫,代表副本集。

db.:數據庫命令,比如db.printReplicationInfo(),db.printSlaveReplicationInfo()

rs.status:查看成員的復制狀態,可以在任意節點執行。

rs.config():可以得到當前副本的配置,修改配置文件,然后將修改后的配置文件傳遞給                      reconfig、initiate命令。

rs.reconfig()(replSetReconfig):修改副本集的配置。rs.reconfig(conf,{"force":true})

rs.initiate():會初始化配置,只需要對副本集中的一個成員調用rs.initiate就可以(一般主節點),收到initiate命令的成員會自動將配置文件傳遞給副本集中的其他成員

1.創建副本集

1).登入

mongo --port 27010

2).切換admin數據庫

use admin

3).驗證權限

db.auth("dba","dba")

4).初始化復制集,默認會創建當前節點為主節點的副本集

rs.initiate()

5).重啟當前節點

db.shutdownServer()

2.修改副本集成員

1).添加新成員,在主節點執行:

rs.add("192.168.137.10:27011")
可以在添加成員的時設定成員配置,也就是rs.conf中member的參數:
rs.add("_id":1,"host":"192.168.137.10:27011", "priority" : 0, "hidden" : true)

2)刪除成員

rs.remove("192.168.137.10:27012");

修改副本集成員配置時的限制:

1、不能修改_id;

2、不能將當前執行rs.reconfig命令的成員的優先級設置為 0;

3、不能將仲裁者成員變為非仲裁者成員,反正亦然;

4、不能將buildIndexes由false改為 true;

3.保證主節點不切換

將所有的備份節點的priority和votes都設置為0;這樣只有主節點有投票權所以無論備份節點是否存在都不會導致主節點的狀態由primary變成other。

conf=rs.config()

conf.members[1].priority=0

conf.members[1].votes=0

rs.reconfig(conf)

4.強制重新配置

如果副本集無法選出新的主節點,這時需要重新配置副本集。可以在備份節點上調用rs.reconfig(conf,{"force":ture})強制重新配置副本集。注意conf必須是正確、有效的配置。而且只允許在備份節點執行強制重新配置。

備份節點收到新的配置文件之后,就會修改自身的配置,並且將新的配置發送給副本集中的其他成員。副本集的其他成員收到新的配置文件之后,會判斷配置文件的發送者是否是它們當前配置中的一個成員,如果是,才會用心的配置文件對自己進行重新配置。所以,如果新的配置修改了某些成員的主機名,則應該關閉被修改主機名的節點,並以單機模式啟動,手動修改locak.system.replset文檔,然后以副本集的方式重新啟動。

5.修改成員狀態

1).把主節點變為備份節點,在主節點執行

rs.stepDown()

rs.stepDown(60):讓主節點退化為備份節點,並維持60秒。如果這段時間內沒有新的主節點被選舉出來,那么當前節點可以要求重新參與進行選舉。

2).阻止選舉

如果需要對主節點進行維護操作,但是不希望這段時間內其它成員選舉為主節點,可以在每個備份節點上執行freeze命令,以強制它們始終處於備份節點的狀態。命令以秒為單位。

rs.freeze(3600):保持1個小時處於備份節點狀態。

rs.freeze(0):再次在備份節點執行且將時間指定為0就是“釋放”備份節點。

注意:如果在退位的備份節點上執行rs.freeze(0),可以讓退位的備份節點重新變為主節點。

6.禁用復制鏈

1).查看復制源

查詢節點從哪個節點處復制。在備份節點上運行。

db.adminCommand({"replSetGetStatus":1})['syncingTo'];

也可以運行rs.status(),查看"syncingTo"字段信息。

2.)復制鏈

MongoDB根據ping時間選擇同步源,一個成員向另一個成員發送心跳請求,就知道心跳請求所耗費的時間(rs.status()中的"pingMs"記錄了成員到達相關成員的所花費的平均時間)。MongosDB維護着不同成員間請求的平均花費時間。選擇同步源時,會選擇一個離自己比較近而且數據比自己新的成員。但是同一數據中心的成員可能會從同一數據中心的其他成員處復制,而不是從位於另一個數據中心的主節點處復制(這樣可以減少網絡流量),所以會出現復制鏈的情況,復制鏈越長會導致主節點的操作復制到所有的服務器所花費的時間越長。這對於需要從副本中讀取數據的需求這種情況是不希望看到的。



3).修改復制源

db.adminCommand({"replSetSyncFrom":"192.168.137.10:27011"});

4).禁用復制鏈

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

在主副本中執行

7.計算延遲

1).查看當前副本集oplog狀態

rs.printReplicationInfo()

configured oplog size:oplog配置的大小

log length start to end:oplog包含的操作時長。

oplog first event time:oplog第一條操作的時間。

oplog last event time:oplog最后一條操作的時間。

now:當前時間。

注意:oplog中第一條操作與最后一條操作的時間差就是操作日志的長度。

2).查看復制延遲

rs.printSlaveReplicationInfo()

會顯示當前所有的備份節點同步時間,和落后主節點的時長。

8.調整oplog大小

1)  如果是主節點,將主節點變成備份節點。

2)  將oplog中的最后一條insert操作保存到其它集合中。

use local

db.
tempLastOp20180330.save( db.oplog.rs.find( { }, { ts: 1, h: 1 } ).sort( {$natural : -1} ).limit(1).next() )

3)   關閉當前服務器

4)   以單機模式啟動,可以指定一個新的端口,或者將replSet注釋掉已配置文件啟動

mongod --port 27000 --bind_ip 192.168.137.10,127.0.0.1 --dbpath /mongos27012/data/db

5)   刪除當前oplog

db.oplog.rs.drop();

6)   創建新的oplog

db.createCollection("oplog.rs",{"capped":true,"size":1048576})
db.createCollection("oplog.rs",{"capped":true,"size":(2*1024*1024*1024)})

7)  將最后一條insert記錄寫回oplog

var tempLastOp=db.tempLastOp20180330.find().next()
db.oplog.rs.insert(tempLastOp)
db.oplog.rs.find()

8)  以副本成員身份啟動當前服務器

五、復制集監控

1.復制集狀態查詢:rs.status()

2.查看當前副本集oplog狀態:rs.printReplicationInfo()

3.查看復制延遲:rs.printSlaveReplicationInfo()

4.查看服務狀態詳情:db.serverStatus()

5.查詢副本集配置:rs.conf()

6.主副本查詢:db.isMaster()

 

副本配置:https://docs.mongodb.com/manual/reference/replica-configuration/#rsconf.settings.getLastErrorDefaults

 

 

 

備注:

    作者:pursuer.chen

    博客:http://www.cnblogs.com/chenmh

本站點所有隨筆都是原創,歡迎大家轉載;但轉載時必須注明文章來源,且在文章開頭明顯處給明鏈接,否則保留追究責任的權利。

《歡迎交流討論》

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM