這篇文章將為大家詳細(xì)講解有關(guān)mongodb復(fù)制集如何維護,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
創(chuàng)新互聯(lián)專注于企業(yè)成都全網(wǎng)營銷、網(wǎng)站重做改版、桐廬網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、H5開發(fā)、商城建設(shè)、集團公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為桐廬等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
一、新增副本集成員
1、登錄primary
2、use admin >rs.add("new_node:port") 或 rs.add({"_id":4,"host":"new_node:port","priority":1,"hidden":false})
3、use admin>rs.addArb("new_node;port") 或 rs.addArb({"_id":5,"host":"new_node:port"})或rs.add({'_id':5,"host":"new_node:port","arbiterOnly":true})
仲裁者唯一的作用就是參與選舉,仲裁者并不保存數(shù)據(jù),也不會為客戶端提供服務(wù)。成員一旦以仲裁者的身份加入副本集中,它就永遠(yuǎn)只能是仲裁者,無法將仲裁者
重新配置為非仲裁者,反之亦然。最多只能有一個仲裁者每個副本集中。
注:如果 復(fù)制集中 priority=1 (默認(rèn)),調(diào)用rs.add("new_node:port") 該命令 會產(chǎn)生 主從切換 即選舉操作;
如果 復(fù)制集中 priority=1 (默認(rèn)),直接調(diào)用rs.remove("new_node:port") 該命令 也會產(chǎn)生 主從切換 ;
二、刪除副本集成員
1、登錄要移除的目標(biāo)mongodb實例;
2、利用shutdownServer()命令關(guān)閉實例;即 db.shutdownServer()
3、登錄復(fù)制集的primary;
4、primary>use admin
primary>rs.remove("del_node:port");
三、修改成員的優(yōu)先級及隱藏性
1、登錄primary
2、use admin >conf=rs.conf()
mongo>conf.members[1].priority=[0-1000]
mongo>conf.members[1].hidden=true #priority必須為0
mongo>conf.members[9].tags={"dc":"tags_name1"}
mongo>rs.reconfig(conf); # 強制重新配置 rs.reconfig(conf,{"force":true})
成員的屬性有下列選項
[, arbiterOnly : true]
[, buildIndexes : <bool>]
[, hidden : true]
[, priority: <priority>]
[, tags: {loc1 : desc1, loc2 : desc2, ..., locN : descN}]
[, slaveDelay : <n>]#秒為單位。
[, votes : <n>]
如果該成員要設(shè)置為 隱藏(hidden:true) 或延遲(slaveDelay:30) 則其優(yōu)先級priority必須設(shè)置為 0;
也就是說 隱藏成員和延遲成員及buildIndexs:false的成員 的優(yōu)先級別一定必須是0 即priority=0.
優(yōu)先級為0的成員不能發(fā)起選舉操作。
只要優(yōu)先級>0即使該成員不具有投票資格,也可以成為主節(jié)點。
如果某個節(jié)點的索引結(jié)構(gòu)和其他節(jié)點上的索引結(jié)構(gòu)不一致,則該節(jié)點就永遠(yuǎn)不會變?yōu)橹鞴?jié)點。
優(yōu)先級用于表示一個成員渴望成為主節(jié)點的程度。優(yōu)先級的取值范圍是[0-100],默認(rèn)為1。優(yōu)先級為0的成員永遠(yuǎn)不能成為主節(jié)點。
使用rs.status()和rs.config()能夠看到隱藏成員,隱藏成員只對rs.isMaster()不可見??蛻舳诉B接到副本集時,會調(diào)用rs.isMaster()
來查看可用成員。將隱藏成員設(shè)定為非隱藏成員,只需將配置中的hidden設(shè)定為false,或刪除hidden選項。
每個成員可以擁有多個標(biāo)簽tags {“dc":"tags_name2",qty:"tag_name3"}
votes:0 代表阻止這些成員在選舉中投主動票,但是他們?nèi)匀豢梢酝斗駴Q票。
修改副本集成員配置時的限制:
1、不能修改_id;
2、不能講接收rs.reconfig命令的成員的優(yōu)先級設(shè)置為 0;
3、不能將仲裁者成員變?yōu)榉侵俨谜叱蓡T,反正亦然;
4、不能講 buildIndexes:false 改為 true;
四、查看副本集成員數(shù)據(jù)同步(延遲)情況
mongo>db.printReplicationInfo();
mongo>db.printSlaveReplicationInfo();#最好在secondary上執(zhí)行
mongo>rs.printReplicationInfo()
mongo>rs.printSlaveReplicationInfo()
mongo>use local>db.slaves.find()
在主節(jié)點上跟蹤延遲:
local.slaves該集合保存著所有正從當(dāng)前成員進行數(shù)據(jù)同步的成員,以及每個成員的數(shù)據(jù)新舊程度。
登錄主節(jié)點
>use local
>db.slaves.find()、
查看其中每個成員對應(yīng)的"syncedTo":{"t":9999999,"i":32} 部分即可知道數(shù)據(jù)的同步程度。
"_id"字段的值是每個當(dāng)前成員服務(wù)器標(biāo)識符??梢缘矫總€成員的local.me.find()查看本服務(wù)器標(biāo)識符。
1、
如果多臺服務(wù)器擁有相同的_id標(biāo)識符,則依次登錄每臺服務(wù)器成員,刪除local.me集合(local.me.dorp()),然后重啟mongodb,
重啟mongod后,mongod會使用新的“_id”重新生成local.me集合。
2、如果服務(wù)器的地址改變但_id沒有變,主機名變了,該情況會在本地數(shù)據(jù)庫的日志中看到重復(fù)鍵異常(duplicate key exception)。
解決方法是:刪除local.slaves集合即可,不需要重啟mongod。
因為mongod不會清理local.slaves集合,故里面的數(shù)據(jù)可能不準(zhǔn)確或過于老舊,可將整個集合刪除。當(dāng)有新的服務(wù)器將當(dāng)前成員作為
復(fù)制源時,該集合會重新生成。如果在主節(jié)點中看到了某個特定的服務(wù)器在該集合中有多個文檔,即表示備份節(jié)點之間發(fā)生了復(fù)制鏈,
該情況不影響數(shù)據(jù)同步,只是把每個備份節(jié)點的同步源告訴主節(jié)點。
刪除local.me集合,需要重新啟動mongod,mongod啟動時會使用新的 _id重新生成local.me集合。
刪除local.slaves集合,不用重啟mongod。該集合中的數(shù)據(jù)是記錄該成員被作為同步源的服務(wù)器的數(shù)據(jù)。該集合用于報告副本集狀態(tài)。
刪除后不久如果有新的節(jié)點成員將該服務(wù)器節(jié)點作為復(fù)制源,該集合就會重新生成。
五、主節(jié)點降為secondary
mongo>use admin
mongo>rs.stepDown(60)#單位為 秒
六、鎖定指定節(jié)點在指定時間內(nèi)不能成為主節(jié)點(阻止選舉)
mongo>rs.freeze(120)#單位為 秒
釋放阻止
mongo>rs.freeze(0)
七、強制節(jié)點進入維護模式(recovering)
可以通過執(zhí)行replSetMaintenanceMode命令強制一個成員進入維護模式。
例如自動檢測成員落后主節(jié)點指定時間,則將其轉(zhuǎn)入維護模式:
function maybeMaintenanceMode(){
var local=db.getSisterDB("local");
if (!local.isMaster().secondary)
{return;
)
var last=local.oplog.rs.find().sort({"$natural":-1}).next();
var lasttime=last['ts']['t'];
if (lasttime<(new date()).getTime()-30)
{db.adminCommand({"replSetMaintenanceMode":true});
}
};
將成員從維護模式轉(zhuǎn)入正常模式。即恢復(fù):
db.adminCommand({"replSetMaintenanceMode":false});
八、阻止創(chuàng)建索引(不可再修改為可以創(chuàng)建索引,故慎重考慮)
通常會在備份節(jié)點的延遲節(jié)點上設(shè)置阻止創(chuàng)建索引。因為該節(jié)點通常只是起到備份數(shù)據(jù)作用。設(shè)置選項 buildIndexs:false即可。該選項是永久性的。如果要將不創(chuàng)建索引的成員修改為可以創(chuàng)建索引的成員,那么必須將這個成員從副本集中移除,再刪除它上的所有數(shù)據(jù),最后再將其重新添加到副本集中。并且允許其重新進行數(shù)據(jù)同步。該選項也要求成員的優(yōu)先級為 0.
九、指定復(fù)制源(復(fù)制鏈) 查看復(fù)制圖譜
使用db.adminCommand({"replSetGetStatus":1})['syncingTo'] 可以查看復(fù)制圖譜(每個節(jié)點的同步源);
在備份節(jié)點上執(zhí)行 rs.status()['sysncingTo'] 同樣可以查看復(fù)制圖譜(同步源);
mongodb是根據(jù)ping時間來選擇同步源的,會選擇一個離自己最近而且數(shù)據(jù)比自己新的成員作為同步源。
可以使用replSetSyncFrom 命令來指定復(fù)制源或使用輔助函數(shù)rs.sysncFrom()來修改復(fù)制源。
db.adminCommand({"replSetSyncFrom":"server_name:port"});
副本集默認(rèn)情況下是允許復(fù)制鏈存在的,因為這樣可以減少網(wǎng)絡(luò)流量。但也有可能
花費是時間更長,因為復(fù)制鏈越長,將數(shù)據(jù)同步到全部服務(wù)器的時間有可能就越長(比如每個備份節(jié)點都比前一個備份節(jié)點稍微舊點,這樣就得
從主節(jié)點復(fù)制數(shù)據(jù))。
解決方法:
1、手動改變復(fù)制源
登錄備份節(jié)點:use admin
db.adminCommand({"replSetSyncFrom":"新復(fù)制源"})
或
rs.syncFrom("新復(fù)制源")
副本集中的成員會自動選擇其他成員作為復(fù)制源。這樣就會產(chǎn)生復(fù)制鏈。
如果一個備份節(jié)點從另一個備份節(jié)點(而非主節(jié)點)復(fù)制數(shù)據(jù)時,就會形成復(fù)制鏈。
復(fù)制鏈?zhǔn)强梢员唤玫模@樣就可以強制要求所有備份節(jié)點都從主節(jié)點復(fù)制數(shù)據(jù)。
禁用復(fù)制鏈:即禁止備份節(jié)點從另一個備份節(jié)點復(fù)制數(shù)據(jù)。
var config=rs.config()
config.settings=config.settings ||{}
config.settings.chainingAllowed=false
rs.reconfig(config);
十、強制修改副本集成員
var config=rs.config()
config.member[n].host=...
config.member[n].priority=...
.....
rs.reconfig(config,{"force":true})
十一、修改Oplog集合的大小
如果是主節(jié)點,則先將primary 降為 secondary。最后確保沒有其他secondary 從該節(jié)點復(fù)制數(shù)據(jù)。rs.status()
1、關(guān)閉該mongod服務(wù) use admin >db.adminCommand({shutdownServer:1});
2、以單機方式重啟該mongod(注釋掉 配置文件中的 replSet shardsvr ,修改端口號)
3、將local.oplog.rs中的最后一條 insert 操作記錄保存到臨時集合中
mongo> use local
mongo>var cursor=db.oplog.rs.find({"op":"i"});
mongo>var lastinsert=cursor.sort({$natural:-1}).limit(1).next();
mongo>db.templastop.save(lastinsert);
mongo>db.templastop.findOne()#確保寫入
4、將oplog.rs 刪除: db.oplog.rs.drop();
5、創(chuàng)建一個新的oplog.rs集合: db.createCollection("oplog.rs":{"capped":true,"size":10240});
6、將臨時集合中的最后一條insert操作記錄寫回新創(chuàng)建的oplog.rs:
var temp=db.templastop.findOne();
db.oplog.rs.insert(temp);
db.oplog.rs.findOne()#確保寫回,否則 該節(jié)點重新加入副本集后會刪除該節(jié)點上所有數(shù)據(jù),然后重新同步所有數(shù)據(jù)。
7、最后將該節(jié)點以副本集成員的身份重新啟動即可。
十二、為復(fù)制集成員設(shè)置選項
即當(dāng)運行rs.initiate(replSetcfg) 或運行 rs.add(membercfg)選項時,需要提供描述復(fù)制集成員的特定配置結(jié)構(gòu):
{
_id:replSetName,
members:
[
{_id:<number>,host:<hostname|ip[:port]>,
[priority:<priority>,]#默認(rèn)值為1.0.即選項的值是浮點型
[hidden:true,]#該元素將從db.isMaster()的輸出中隱藏該節(jié)點。
[arbiterOnly:true,]#默認(rèn)值為 false
[votes:<n>,]#默認(rèn)值為1 。改選項的值為整形
[tags:{documents},]
[slaveDelay:<seconds>,]
[buildIndexes:true,]#默認(rèn)值為 false。該選項用于禁止創(chuàng)建索引。
}],
settings:{
[chainingAllowed:<boolen>,]#指定該成員是否允許從其他輔助服務(wù)器復(fù)制數(shù)據(jù)。默認(rèn)值為 true
[getLastErrorModes:<modes>,]#模式:用于自定義寫顧慮設(shè)置
[getLastErrorDefaults:<lasterrdefaults>,]#默認(rèn)值:用于自定義寫顧慮設(shè)置。
}
}
以上是復(fù)制集的完整的配置結(jié)構(gòu)。最高級的配置結(jié)構(gòu)包括3級:
_id、members、settings。
_id是復(fù)制集的名稱,與創(chuàng)建復(fù)制集成員時時候用的 --replSet命令選項時提供的名稱一樣。
members是數(shù)組,由一個描述每個成員的集合組成;這是添加單個服務(wù)器到集合中時,應(yīng)該在rs.add()命令中提供的成員機構(gòu);
settings也是數(shù)組,該settings數(shù)組包含應(yīng)用到整個復(fù)制集的選項。這些選項可以設(shè)置復(fù)制集成員間如何通信。
十三、Rollback
mongodb只支持小于300M的數(shù)據(jù)量回滾,如果大于300M的數(shù)據(jù)需要回滾或要回滾的操作在30分鐘以上,只能是手動去回滾。會在mongodb日志中報以下錯誤:[replica set sync] replSet syncThread: 13410 replSet too much data to roll back
經(jīng)量避免讓rollback發(fā)生。方法是:使用 復(fù)制的 寫顧慮(Write Concern)規(guī)則來阻止回滾的發(fā)生。
如果發(fā)生了回滾操作,則會在mongodb數(shù)據(jù)文件目錄下產(chǎn)生一個以database.collection.timestamp.bson的文件。查看該文件的內(nèi)容用 bsondump 工具來查看。
十四、讀偏好設(shè)置(ReadPreferred)
讀取偏好是指選擇從哪個復(fù)制集成員讀取數(shù)據(jù)的方式??梢詾轵?qū)動指定5中模式來設(shè)置讀取偏好。
readPreference=primary|primaryPreferred|secondary|secondaryPreferred|nearest
setReadPreferred()命令設(shè)置讀取偏好。
primary:只從主服務(wù)器上讀取數(shù)據(jù)。如果用戶顯式指定使用標(biāo)簽讀取偏好,該讀取偏好將被阻塞。這也是默認(rèn)的讀取偏好。
primaryPreferred:讀取將被重定向至主服務(wù)器;如果沒有可用的主服務(wù)器,那么讀取將被重定向至某個輔助服務(wù)器;
secondary:讀取將被重定向至輔助服務(wù)器節(jié)點。如果沒有輔助服務(wù)器節(jié)點,該選項將會產(chǎn)生異常;
secondaryPreferred:讀取將被重定向至輔助服務(wù)器;如果沒有輔助服務(wù)器,那么讀取將被重定向至主服務(wù)器。該選項對應(yīng)舊的“slaveOK”方法;
nearest:從最近的節(jié)點讀取數(shù)據(jù),不論它是主服務(wù)器還是輔助服務(wù)器。該選項通過網(wǎng)絡(luò)延遲決定使用哪個節(jié)點服務(wù)器。
十五、寫顧慮設(shè)置(Write Concern)
寫顧慮類似讀取偏好,通過寫顧慮選項可以指定在寫操作被確認(rèn)完成前,數(shù)據(jù)必須被安全提交到多少個節(jié)點。
寫顧慮的模式?jīng)Q定了寫操作時如何持久化數(shù)據(jù)。參數(shù)“w”會強制 getLastError等待,一直到給定數(shù)據(jù)的成員都執(zhí)行完了最后的寫入操作。w的值是包含主節(jié)點的。
寫顧慮的5中模式:
w=0或不確定:單向?qū)懖僮鳌懖僮鲌?zhí)行后,不需要確認(rèn)提交狀態(tài)。
w=1或確認(rèn):寫操作必須等到主服務(wù)器的確認(rèn)。這是默認(rèn)行為。
w=n或復(fù)制集確認(rèn):主服務(wù)器必須確認(rèn)該寫操作。并且n-1個成員必須從主服務(wù)器復(fù)制該寫入操作。該選項更強大,但是會引起延遲。
w=majority:寫操作必須被主服務(wù)器確認(rèn),同時也需要集合中的大多數(shù)成員都確認(rèn)該操作。而w=n可能會因為系統(tǒng)中斷或復(fù)制延遲引起問題。
j=true日志:可以與w=寫顧慮一起共同指定寫入操作必須被寫入到日志中,只有這樣才算是確認(rèn)完成。
wtimeout:避免getLastError一直等待下去,該值是命令的超時時間值,如果超過這個時間還沒有返回,就會返回失敗。該值的單位是毫秒。如果返回失敗,值在規(guī)定的時間內(nèi)沒有將寫入操作復(fù)制到"w"個成員。
該操作只對該連接起作用,其他連接不受該連接的"w"值限制。
db.products.insert(
{ item : "envelopes" , qty : 100 , type : "Clasp" },
{ writeConcern : { w : 2 , wtimeout : 5000 } }
)
wtimeout#代表5秒超時
修改默認(rèn)寫顧慮
cfg = rs.conf()
cfg.settings = {}
cfg.settings.getLastErrorDefaults = { w: "majority" , wtimeout: 5000 }
rs.reconfig(cfg)
設(shè)置寫等待
db.runCommand({"getLastError":1,w:"majority"})
或
db.runCommand({"getLastError":1,"w":"majority","wtimeout":10000})
即,表示寫入操作被復(fù)制到了多數(shù)個節(jié)點上(majority 或 數(shù)字),這時的 w會強制 getLastError等待,一直到給定數(shù)量的成員執(zhí)行完了最后的寫入操作。而wtimeout是指超過這個時間沒有返回則返回失敗提示(即無法在指定時間內(nèi)將寫入操作復(fù)制到w個成員中),getLastError并不代表寫操作失敗了,而是代表在指定給定wtimeout時間內(nèi)沒有將寫入操作復(fù)制到指定的w個成員中。w是限制(控制)寫入 速度,只會阻塞這個連接上的操作,其他連接上的操作不受影響。
十六、讀取偏好和寫顧慮中使用標(biāo)簽(tags)
十七、選舉機制
1、自身是否能夠與主節(jié)點連通;
2、希望被選件為主節(jié)點的備份節(jié)點的數(shù)據(jù)是否最新;
3、有沒有其他更高優(yōu)先級的成員可以被選舉為主節(jié)點;
4、如果被選舉為主節(jié)點的成員能夠得到副本集中“大多數(shù)”成員的投票,則它會成為主節(jié)點,如果“大多數(shù)”成員中只有一個否決了本次選舉,則本次選舉失敗即就會取消。一張否決票相當(dāng)于10000張贊成票。
5、希望成為主節(jié)點的成員必須使用復(fù)制將自己的數(shù)據(jù)更新為最新;
十八、數(shù)據(jù)初始化過程
1、首先做一些記錄前的準(zhǔn)備工作:選擇一個成員作為同步源,在local.me集合中為自己創(chuàng)建一個標(biāo)識符,刪除索引已存在的數(shù)據(jù)庫,以一個全新的狀態(tài)開始進行同步;該過程中,所有的數(shù)據(jù)都會被刪除。
2、然后克隆,就是將同步源的所有記錄全部復(fù)制到本地。
3、然后就進入oplog同步的第一步,克隆過程中的所有操作都會被記錄到oplog中。
4、接下來就是oplog同步過程的第二步,用于將第一個oplog同步中的操作記錄下來。
5、截止當(dāng)前,本地的數(shù)據(jù)應(yīng)該與主節(jié)點在某個時間點的數(shù)據(jù)集完全一致了,可以開始創(chuàng)建索引了。
6、若當(dāng)前節(jié)點的數(shù)據(jù)仍然落后同步源,那么oplog同步過程的最后一步就是將創(chuàng)建索引期間的所有操作全部同步過出來,防止該成員成為備份節(jié)點。
7、現(xiàn)在當(dāng)前成員已經(jīng)完成了初始化數(shù)據(jù)的同步,切換到普通狀態(tài),這時該節(jié)點就可以成為備份節(jié)點了。
十九、mongodb3.0 建議開啟的設(shè)置
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
執(zhí)行上面兩命令后只是當(dāng)前起作用。如果重啟mongod服務(wù)后 就失效。永久起效則
寫入到 /etc/rc.local
即
二十、修改服務(wù)器hostname名
1、首先修改 secondary 服務(wù)器的 hostname;然后 stop secondary;
2、重啟 secondary 以修改后的新hostname;
3、登錄 primary ;
4、用rs.reconfig()命令修改 復(fù)制集的配置信息;
conf=rs.conf()
conf.members[x].host='new_address:27017'
rs.reconfig(conf);
二十一、生成 keyfile文件
openssl rand -base64 666 > /opt/mongo/conf/MongoReplSet_KeyFile
chown mongod.mongod /opt/mongo/conf/MongoReplSet_KeyFile
chmod 600 /opt/mongo/conf/MongoReplSet_KeyFile
關(guān)于“mongodb復(fù)制集如何維護”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
當(dāng)前文章:mongodb復(fù)制集如何維護-創(chuàng)新互聯(lián)
網(wǎng)站URL:http://jinyejixie.com/article26/cccjcg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營銷、自適應(yīng)網(wǎng)站、商城網(wǎng)站、靜態(tài)網(wǎng)站、移動網(wǎng)站建設(shè)、電子商務(wù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容