journaling 是如何工作的?將MongoDB的數據文件,journal 文件表示如下:
啓動mongod,數據文件映射到共享視圖 .
這時候內存依然依靠文件做後盾: 內存中的變化,操作系統刷新到底層文件. 這是MongoDB在沒有journaling時候的工作方式: 操作系統每60秒將內存中的變化刷新到文件.
然而, 啓用 journaling時,mongod 會再做一次映射, 映射到私有視圖. 附帶的, 啓用journallingmongod使用的虛擬內存將會翻倍.
注意到私有視圖沒有映射到數據文件, 所以操作系統不能將任何改變刷新到磁盤.
現在寫數據時,mongod寫到私有視圖.
mongod然後將數據的變化寫到 journal 文件,並加上文件變化的一些描述.私有視圖刷新到journal的是100ms.默認情況下,journal刷新到磁盤的週期是每100ms.
journal 將關於變化的描述追加到文件
這時候, 寫是安全的. 如果mongod崩潰,journal可以重放變化, 雖然還沒有寫到數據文件
journal 將在共享視圖上重放變化.
然後,mongod將共享視圖重新映射到私有視圖. 這樣防止私有視圖太”髒”(有許多變化從共享視圖刷新).
最後, 與其它的相比,以很慢的速度, 共享視圖將刷新到磁盤. 默認情況下,mongod 請求操作系統每60秒刷新一次.
出自:
http://www.ttlsa.com/mongodb/how-mongodbs-journaling-works/
http://www.kchodorow.com/blog/2012/10/04/how-mongodbs-journaling-works/