您好,登錄后才能下訂單哦!
本篇文章為大家展示了MongoDB中 oplog的作用是什么,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。
1:oplog簡(jiǎn)介
oplog是local庫(kù)下的一個(gè)固定集合,Secondary就是通過(guò)查看Primary 的oplog這個(gè)集合來(lái)進(jìn)行復(fù)制的。每個(gè)節(jié)點(diǎn)都有oplog,記錄這從主節(jié)點(diǎn)復(fù)制過(guò)來(lái)的信息,這樣每個(gè)成員都可以作為同步源給其他節(jié)點(diǎn)。
Oplog 可以說(shuō)是Mongodb Replication的紐帶了。
2:副本集數(shù)據(jù)同步的過(guò)程
副本集中數(shù)據(jù)同步的詳細(xì)過(guò)程:Primary節(jié)點(diǎn)寫(xiě)入數(shù)據(jù),Secondary通過(guò)讀取Primary的oplog得到復(fù)制信息,開(kāi)始復(fù)制數(shù)據(jù)并且將復(fù)制信息寫(xiě)入到自己的oplog。如果某個(gè)操作失?。ㄖ挥挟?dāng)同步源的數(shù)據(jù)損壞或者數(shù)據(jù)與主節(jié)點(diǎn)不一致時(shí)才可能發(fā)生),則備份節(jié)點(diǎn)停止從當(dāng)前數(shù)據(jù)源復(fù)制數(shù)據(jù)。如果某個(gè)備份節(jié)點(diǎn)由于某些原因掛掉了,當(dāng)重新啟動(dòng)后,就會(huì)自動(dòng)從oplog的最后一個(gè)操作開(kāi)始同步,同步完成后,將信息寫(xiě)入自己的oplog,由于復(fù)制操作是先復(fù)制數(shù)據(jù),復(fù)制完成后再寫(xiě)入oplog,有可能相同的操作會(huì)同步兩份,不過(guò)MongoDB在設(shè)計(jì)之初就考慮到這個(gè)問(wèn)題,將oplog的同一個(gè)操作執(zhí)行多次,與執(zhí)行一次的效果是一樣的。
當(dāng)Primary進(jìn)行寫(xiě)操作的時(shí)候,會(huì)將這些寫(xiě)操作記錄寫(xiě)入Primary的Oplog 中,而后Secondary會(huì)將Oplog 復(fù)制到本機(jī)并應(yīng)用這些操作,從而實(shí)現(xiàn)Replication的功能。
同時(shí)由于其記錄了Primary上的寫(xiě)操作,故還能將其用作數(shù)據(jù)恢復(fù)。
可以簡(jiǎn)單的將其視作Mysql中的binlog。
3:oplog的增長(zhǎng)速度
oplog是固定大小,他只能保存特定數(shù)量的操作日志,通常oplog使用空間的增長(zhǎng)速度跟系統(tǒng)處理寫(xiě)請(qǐng)求的速度相當(dāng),如果主節(jié)點(diǎn)上每分鐘處理1KB的寫(xiě)入數(shù)據(jù),那么oplog每分鐘大約也寫(xiě)入1KB數(shù)據(jù)。如果單次操作影響到了多個(gè)文檔(比如刪除了多個(gè)文檔或者更新了多個(gè)文檔)則oplog可能就會(huì)有多條操作日志。db.testcoll.remove() 刪除了1000000個(gè)文檔,那么oplog中就會(huì)有1000000條操作日志。如果存在大批量的操作,oplog有可能很快就會(huì)被寫(xiě)滿(mǎn)了。
Oplog 是一個(gè)capped collection。
在64位的Linux, Solaris, FreeBSD, and Windows 系統(tǒng)中,Mongodb默認(rèn)將其大小設(shè)置為可用disk空間的5%(默認(rèn)最小為1G,最大為50G),或也可以在mongodb復(fù)制集實(shí)例初始化之前將mongo.conf中oplogSize設(shè)置為我們需要的值。
local.oplog.rs 一個(gè)capped collection集合.可在命令行下使用--oplogSize 選項(xiàng)設(shè)置該集合大小尺寸.
但是由于Oplog 其保證了復(fù)制的正常進(jìn)行,以及數(shù)據(jù)的安全性和容災(zāi)能力。
4:oplog注意事項(xiàng):
local.oplog.rs特殊的集合。用來(lái)記錄Primary節(jié)點(diǎn)的操作。
oplog的大小
capped collection是MongoDB中一種提供高性能插入、讀取和刪除操作的固定大小集合,當(dāng)集合被填滿(mǎn)的時(shí)候,新的插入的文檔會(huì)覆蓋老的文檔。
所以,oplog表使用capped collection是合理的,因?yàn)椴豢赡軣o(wú)限制的增長(zhǎng)oplog。MongoDB在初始化副本集的時(shí)候都會(huì)有一個(gè)默認(rèn)的oplog大?。?/p>
在64位的Linux,Solaris,FreeBSD以及Windows系統(tǒng)上,MongoDB會(huì)分配磁盤(pán)剩余空間的5%作為oplog的大小,如果這部分小于1GB則分配1GB的空間
在64的OS X系統(tǒng)上會(huì)分配183MB
在32位的系統(tǒng)上則只分配48MB
oplog的大小設(shè)置是值得考慮的一個(gè)問(wèn)題,如果oplog size過(guò)大,會(huì)浪費(fèi)存儲(chǔ)空間;如果oplog size過(guò)小,老的oplog記錄很快就會(huì)被覆蓋,那么宕機(jī)的節(jié)點(diǎn)就很容易出現(xiàn)無(wú)法同步數(shù)據(jù)的現(xiàn)象。
比如,基于上面的例子,我們停掉一個(gè)備份節(jié)點(diǎn)(port=33333),然后通過(guò)主節(jié)點(diǎn)插入以下記錄,然后查看oplog,發(fā)現(xiàn)以前的oplog已經(jīng)被覆蓋了。
通過(guò)MongoDB shell連接上這個(gè)節(jié)點(diǎn),會(huì)發(fā)現(xiàn)這個(gè)節(jié)點(diǎn)一直處于RECOVERING狀態(tài)。
解決方法:
在副本集中,有兩種數(shù)據(jù)同步方式:
initial sync(初始化):這個(gè)過(guò)程發(fā)生在當(dāng)副本集中創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù)或其中某個(gè)節(jié)點(diǎn)剛從宕機(jī)中恢復(fù),或者向副本集中添加新的成員的時(shí)候,默認(rèn)的,副本集中的節(jié)點(diǎn)會(huì)從離它最近的節(jié)點(diǎn)復(fù)制oplog來(lái)同步數(shù)據(jù),這個(gè)最近的節(jié)點(diǎn)可以是primary也可以是擁有最新oplog副本的secondary節(jié)點(diǎn)。
該操作一般會(huì)重新初始化備份節(jié)點(diǎn),開(kāi)銷(xiāo)較大
replication(復(fù)制):在初始化后這個(gè)操作會(huì)一直持續(xù)的進(jìn)行著,以保持各個(gè)secondary節(jié)點(diǎn)之間的數(shù)據(jù)同步。
當(dāng)遇到上面例子中無(wú)法同步的問(wèn)題時(shí),只能使用以下兩種方式進(jìn)行initial sync了
第一種方式就是停止該節(jié)點(diǎn),然后刪除目錄中的文件,重新啟動(dòng)該節(jié)點(diǎn)。這樣,這個(gè)節(jié)點(diǎn)就會(huì)執(zhí)行initial sync
注意:通過(guò)這種方式,sync的時(shí)間是根據(jù)數(shù)據(jù)量大小的,如果數(shù)據(jù)量過(guò)大,sync時(shí)間就會(huì)很長(zhǎng)
同時(shí)會(huì)有很多網(wǎng)絡(luò)傳輸,可能會(huì)影響其他節(jié)點(diǎn)的工作
第二種方式,停止該節(jié)點(diǎn),然后刪除目錄中的文件,找一個(gè)比較新的節(jié)點(diǎn),然后把該節(jié)點(diǎn)目錄中的文件拷貝到要sync的節(jié)點(diǎn)目錄中
通過(guò)上面兩種方式中的一種,都可以重新恢復(fù)"port=33333"的節(jié)點(diǎn)。改變一直處于RECOVERING狀態(tài)的錯(cuò)誤。
查看oplog的信息
通過(guò)"db.printReplicationInfo()"命令可以查看oplog的信息
字段說(shuō)明:
configured oplog size: oplog文件大小
log length start to end: oplog日志的啟用時(shí)間段
oplog first event time: 第一個(gè)事務(wù)日志的產(chǎn)生時(shí)間
oplog last event time: 最后一個(gè)事務(wù)日志的產(chǎn)生時(shí)間
now: 現(xiàn)在的時(shí)間
<h4 id="_nav_7" background-position:left top;background-size:initial;background-repeat:no-repeat;background-attachment:initial;background-origin:initial;background-clip:initial;height:auto;line-height:1.8;padding-left:20px;color:#666666;margin:10px 0px;font-family:verdana, Arial, Helvetica, sans-serif;white-space:normal;"> 查看slave狀態(tài)
通過(guò)"db.printSlaveReplicationInfo()"可以查看slave的同步狀態(tài)
副本節(jié)點(diǎn)中執(zhí)行db.printSlaveReplicationInfo()命令可以查看同步狀態(tài)信息
source——從庫(kù)的IP及端口
syncedTo——當(dāng)前的同步情況,延遲了多久等信息
上述內(nèi)容就是MongoDB中 oplog的作用是什么,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。