一、無Journaling的mongo運行原理
在沒有使用journal功能時,mongo數據庫只將數據的內存映射加載到共享視圖shared,不需要將數據加載到視圖。當需要讀取數據時,通過shared中的內存映射找到數據在次盤整的位置,將數據加載到shared中,同時返回到客戶端,也就是按需加載。當客戶端對數據進行修改或者寫操作時,將數據添加到shared中,每60秒shared鐘的數據返寫到磁盤。如下圖所示:
journalctl查看日志、
二、存在Journaling的mongo運行原理
在添加journal功能之后,就會產生一個private視圖。整個的運行操作主要有一下幾部分組成。
在對數據進行操作,需要以下幾步進行執行:
1、獲取數據
在打開journal功能后,數據會從磁盤獲取內存映射,加載到shared中,同時shared中的內存映射會同步到private中一份,在客戶端獲取數據時,通過內存映射從磁盤加載到shared和private中,客戶端從private獲取數據。圖示如下:
2、寫數據、批量寫入journal和刷新shared
客戶端修改或者寫操作時,數據會存儲到private中,private中的數據會周期性的寫入到journal文件中,這個周期默認是100ms,是通過journalCommitInterval來控制的。同時,journal文件中的數據操作會寫入shared中,批量寫入到journal可以提高對數據庫的并發操作。如果數據庫出現故障,在這段時間內的數據可能丟失。圖示如下:
3、數據庫若崩潰
一旦數據庫崩潰,在重新啟動數據庫時,journal文件中的數據庫操作會再次刷新到shared中。圖示如下:
4、重新映射、刷新磁盤
journal中存儲的是數據操作指令,只是對shared中的數據進行操作。在將journal中的內容刷新到shared中后,shared中的數據會重新映射private中,由于shared中的數據與private中的數據不一致,在重新映射后,private的大小一般為0。同時,shared中的數據也會周期性的將數據刷新到磁盤,這個周期默認為60s。在刷新磁盤成功后,journal文件中的數據會自動刪除。圖示如下:
?