MongoDB的兩種日志journal與oplog

1、Journal?

????????Journal是 MongoDB 存儲(chǔ)引擎層的概念,目前 MongoDB主要支持 mmapv1袋马、wiredtiger、mongorocks 等存儲(chǔ)引擎秸应,都支持配置Journal虑凛。????????

????????MongoDB 所有的數(shù)據(jù)寫入、讀取最終都是調(diào)存儲(chǔ)引擎層的接口來存儲(chǔ)灸眼、讀取數(shù)據(jù)卧檐,journal 是存儲(chǔ)引擎存儲(chǔ)數(shù)據(jù)時(shí)的一種輔助機(jī)制。

Journal日志焰宣,是MongoDB的預(yù)寫日志W(wǎng)AL(類似Mysql的Redo log)霉囚。

默認(rèn)情況下mongodb每100毫秒往journal文件中flush一次數(shù)據(jù),不過這是在數(shù)據(jù)文件和journal文件處于同一磁盤卷上的情況匕积,而如果數(shù)據(jù)文件和journal文件不在同一磁盤卷上時(shí)盈罐,默認(rèn)刷新輸出時(shí)間是30毫秒。不過這個(gè)毫秒值是可以修改的闪唆,可修改范圍是2~300盅粪,值越低,刷新輸出頻率越高悄蕾,數(shù)據(jù)安全度也就越高票顾,但磁盤性能上的開銷也更高。

????????以wiredtiger 為例帆调,如果不配置 journal奠骄,寫入 wiredtiger 的數(shù)據(jù),并不會(huì)立即持久化存儲(chǔ)番刊;而是每分鐘(默認(rèn))或者待寫入的數(shù)據(jù)達(dá)到2G時(shí)含鳞,會(huì)做一次全量的checkpoint(storage.syncPeriodSecs配置項(xiàng),默認(rèn)為1分鐘)芹务,將所有的數(shù)據(jù)持久化蝉绷。如果中間出現(xiàn)宕機(jī),那么數(shù)據(jù)只能恢復(fù)到最近的一次checkpoint(檢測點(diǎn)枣抱,將內(nèi)存中的數(shù)據(jù)變更flush到磁盤中的數(shù)據(jù)文件中熔吗,并做一個(gè)標(biāo)記點(diǎn),表示此前的數(shù)據(jù)表示已經(jīng)持久存儲(chǔ)在了數(shù)據(jù)文件中佳晶,此后的數(shù)據(jù)變更存在于內(nèi)存和journal日志)磁滚,這樣最多可能丟掉1分鐘的數(shù)據(jù)。

????????所以建議「一定要開啟journal」,開啟 journal 后垂攘,每次寫入會(huì)記錄一條操作日志(通過journal可以重新構(gòu)造出寫入的數(shù)據(jù))。這樣即使出現(xiàn)宕機(jī)淤刃,啟動(dòng)時(shí) Wiredtiger 會(huì)先將數(shù)據(jù)恢復(fù)到最近的一次checkpoint的點(diǎn)晒他,然后重放后續(xù)的 journal 操作日志來恢復(fù)數(shù)據(jù)。

????????journal文件是以“j._”開頭命名的逸贾,且是append only的陨仅,如果1個(gè)journal文件滿了1G大小,mongodb就會(huì)新創(chuàng)建一個(gè)journal文件來使用铝侵,一旦某個(gè)journal文件所記載的寫操作都被使用過了灼伤,mongodb就會(huì)把這個(gè)journal文件刪除。通常在journal文件所在的文件夾下咪鲜,只會(huì)存在2~3個(gè)journal文件狐赡,除非你使用mongodb每秒都寫入大量的數(shù)據(jù)。而使用 smallfiles 這個(gè)運(yùn)行時(shí)選項(xiàng)可以將journal文件大小減至128M大小疟丙。

????????MongoDB 里的 journal 行為 主要由2個(gè)參數(shù)控制颖侄,storage.journal.enabled 決定是否開啟journal,storage.journal.commitInternalMs 決定 journal 刷盤的間隔享郊,默認(rèn)為100ms览祖,用戶也可以通過寫入時(shí)指定 writeConcern 為 {j: ture} 來每次寫入時(shí)都確保 journal 刷盤。

2炊琉、oplog

????????oplog 是 MongoDB 主從復(fù)制層面的一個(gè)概念展蒂,通過 oplog 來實(shí)現(xiàn)復(fù)制集節(jié)點(diǎn)間數(shù)據(jù)同步,客戶端將數(shù)據(jù)寫入到 Primary苔咪,Primary 寫入數(shù)據(jù)后會(huì)記錄一條 oplog锰悼,Secondary 從 Primary(或其他 Secondary )拉取 oplog 并重放,來確保復(fù)制集里每個(gè)節(jié)點(diǎn)存儲(chǔ)相同的數(shù)據(jù)悼泌。

????????oplog 在 MongoDB 里是一個(gè)普通的 capped collection(固定集合)松捉,對于存儲(chǔ)引擎來說,oplog只是一部分普通的數(shù)據(jù)而已馆里。

????????MongoDB 的一次寫入:

????????MongoDB 復(fù)制集里寫入一個(gè)文檔時(shí)隘世,需要修改如下數(shù)據(jù):

? ? ? ? 1)將文檔數(shù)據(jù)寫入對應(yīng)的集合;

? ? ? ? 2)更新集合的所有索引信息鸠踪;

? ? ? ? 3)寫入一條oplog用于同步丙者。

????????上面3個(gè)修改操作,需要確保要么都成功营密,要么都失敗械媒,不能出現(xiàn)部分成功的情況,否則:

? ? ? ? 1)如果數(shù)據(jù)寫入成功,但索引寫入失敗纷捞,那么會(huì)出現(xiàn)某個(gè)數(shù)據(jù)痢虹,通過全表掃描能讀取到,但通過索引就無法讀戎骼堋奖唯;

? ? ? ? 2)如果數(shù)據(jù)、索引都寫入成功糜值,但 oplog 寫入不成功丰捷,那么寫入操作就不能正常的同步到備節(jié)點(diǎn),出現(xiàn)主備數(shù)據(jù)不一致的情況寂汇。

????????MongoDB 在寫入數(shù)據(jù)時(shí)病往,會(huì)將上述3個(gè)操作放到一個(gè) wiredtiger 的事務(wù)里,確苯景辏「原子性」停巷。

wiredtiger 提交事務(wù)時(shí),會(huì)將所有修改操作應(yīng)用累贤,并將上述3個(gè)操作寫入到一條 journal 操作日志里叠穆;后臺(tái)會(huì)周期性的checkpoint,將修改持久化臼膏,并移除無用的journal硼被。

從數(shù)據(jù)布局看,oplog 與 journal 的關(guān)系如下圖:

????????oplog 與 journal?誰先寫入的問題:

? ? ? ? 1)oplog 與 journal 是 MongoDB 里不同層次的概念渗磅,放在一起比先后本身是不合理的嚷硫。

? ? ? ? 2)oplog 在 MongoDB 里是一個(gè)普通的集合,所以 oplog 的寫入與普通集合的寫入并無區(qū)別始鱼。

? ? ? ? 3)一次寫入仔掸,會(huì)對應(yīng)數(shù)據(jù)、索引医清,oplog的修改起暮,而這3個(gè)修改,會(huì)對應(yīng)一條journal操作日志会烙。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末负懦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子柏腻,更是在濱河造成了極大的恐慌纸厉,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件五嫂,死亡現(xiàn)場離奇詭異颗品,居然都是意外死亡肯尺,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進(jìn)店門躯枢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來则吟,“玉大人,你說我怎么就攤上這事锄蹂∮饫模” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵败匹,是天一觀的道長。 經(jīng)常有香客問我讥巡,道長掀亩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任欢顷,我火速辦了婚禮槽棍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘抬驴。我一直安慰自己炼七,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布布持。 她就那樣靜靜地躺著豌拙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪题暖。 梳的紋絲不亂的頭發(fā)上按傅,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天,我揣著相機(jī)與錄音胧卤,去河邊找鬼唯绍。 笑死,一個(gè)胖子當(dāng)著我的面吹牛枝誊,可吹牛的內(nèi)容都是我干的况芒。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼叶撒,長吁一口氣:“原來是場噩夢啊……” “哼绝骚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起痊乾,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤皮壁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后哪审,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛾魄,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了滴须。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舌狗。...
    茶點(diǎn)故事閱讀 38,094評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖扔水,靈堂內(nèi)的尸體忽然破棺而出痛侍,到底是詐尸還是另有隱情,我是刑警寧澤魔市,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布主届,位于F島的核電站,受9級特大地震影響待德,放射性物質(zhì)發(fā)生泄漏君丁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一将宪、第九天 我趴在偏房一處隱蔽的房頂上張望绘闷。 院中可真熱鬧,春花似錦较坛、人聲如沸印蔗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽华嘹。三九已至,卻和暖如春确封,著一層夾襖步出監(jiān)牢的瞬間除呵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工爪喘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留颜曾,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓秉剑,卻偏偏與公主長得像泛豪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子侦鹏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容