一 簡介 我們來聊聊Journal日志
二 核心觀點 WAL 日志先行策略
三 開啟journal流程
在開啟journal的系統中,寫操作從請求到寫入磁盤共經歷5個步驟,在serverStatus()中已經列出各個步驟消耗的時間。
1 Write to privateView
2 prepLogBuffer
3 WritetoJournal
4 WritetoDataFile
5 RemaptoPrivateView
四 基本概念知識
1 shared view
數據文件映射到一塊內存區域,稱為shared view,數據會直接寫入(在不開啟journal的情況下) 系統每60s刷新這塊內存到磁盤.如果系統斷電,就會丟失這60S的未持久化的數據
2 private view
系統會再映射一塊內存區域供journal使用,稱之為private view,mongodb默認每100ms刷新privateView到journal(在開啟journal情況下) 如果系統斷電.會容忍這100ms的數據丟失,當服務重啟時,會利用journal進行恢復
3 mongo的journal和mysql的redo效果一樣,日志先行.但是有一點不同的是,mongo的journal的功能是可以關閉的
五 系統相關
1 當單個文件達到1GB的時候,就會創建一個新的文件,舊文件不會循環使用,自動刪除
2 文件構成
1 lsn代表最后使用的journal序列號
2 prealloc 代表已經分配但是還沒有使用的文件
3 j.*代表的是正在使用的journal文件
六 系統命令
1 journal延遲測試的函數,
db.runCommand("journalLatencyTest"):
2 啟動
journal = true
3 查看journal運行狀態
db.serverstatus() dur相關,具體請自行查看
commitsInWriteLock:在有寫鎖的情況下提交的數量,這表示寫的壓力很大
earlyCommits:表示在journalCommitInterval之前的時間,mongod請求提交的次數。用這個參數確定journalCommitInterval是不是設置的過長。
4 journalCommitInterval
默認100ms,根據上述的監控指標可以進行結合判斷是否要進行調整。
七 相關問題
1 journal本身占據過大的問題
推斷 可能是由於大批量瞬間事務引起的