版本: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 var lastinsert = db.oplog.rs.find({"op":{$in:["i"]}}).sort({"wall":-1}).limit(1).next(); db.tempLastOp20180330.save(lastinsert) db.tempLastOp20180330.find()
3) 關閉當前伺服器
4) 以單機模式啟動
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})
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()
備註: 作者:pursuer.chen 部落格:http://www.cnblogs.com/chenmh 本站點所有隨筆都是原創,歡迎大家轉載;但轉載時必須註明文章來源,且在文章開頭明顯處給明連結,否則保留追究責任的權利。 《歡迎交流討論》 |