This was originally posted to Kristina Chodorow’s blog, Snail in a Turtleneck
我參與編寫了The Definitive Guide中關於Journaling的部分,但是我意識到其中很多實現細節大家重視的不夠,所以這次在部落格裡我會用易於理解的圖來進行說明。
那麼Journaling是怎麼工作的呢,假設,你的硬碟上有資料檔案和記錄檔
當你啟動mongod,它會映射你的資料檔案到一個共用的視圖中,比方說作業系統會把你 2,000 bytes的資料檔案映射到記憶體位址1,000,000-1,002,000中,這樣你訪問 1,000,042這個地址也就是訪問這個檔案的第42位地址。(其實就是記憶體映射。。。)。當然,實際上只有第一次真正訪問的時候,這個資料檔案才會載入到記憶體中。
如果你改變了記憶體中的資料,作業系統會重新整理變更到實際的檔案中去。mongodb在沒有開啟journaling情況下每60秒由作業系統進行一次重新整理。如果開啟了journaling,mongod將會映射另外一個私人的視圖,這也就是為什麼開啟journaling的情況下虛擬記憶體使用量翻番的原因。
現在每次寫入共用視圖的同時也會寫入到私人的視圖中。需要注意的是,因為這個私人的視圖沒有映射到實際檔案中,所以作業系統每次重新整理時不會把私人視圖的變更寫回到硬碟。
mongod會向journal file寫入關於是是哪個檔案的哪個位元組發生了變化的簡要描述資訊。
會向journal file追加每一次變更資訊。
如果mongod發生崩潰的時候資料變更還沒有寫入磁碟,就可以通過回放journal裡的記錄到共用視圖中。
回放成功後,mongod會依賴作業系統把重新整理變更重新整理到磁碟檔案中。預設情況下是60秒一次。
最後mongod會重新對應共用視圖到私人視圖中。這是為了防止私人視圖變的太“髒”(其實也就是為了防止下次在回放的時候寫入多餘的變更)。