MongoDB3.4物件儲存(Journaling日誌)
在發生故障時提供持久化,MongoDB使用預寫日誌到磁碟上的日誌檔案。
WiredTiger儲存引擎和日誌
在這一節中提到的日誌是MongoDB預寫日誌而不是MongoDB日誌檔案,WiredTiger使用checkpoints在硬碟上提供一致的資料檢視並且允許MongoDB使用最後一個checkpoint恢復資料,然而如果MongoDB意外退出在檢查點之間,日誌是恢復最後一個檢查點之後的資料;
日誌恢復過程
1.在資料檔案中找到最後一個檢查點的標識;
2.在日誌檔案中搜索與最後一個檢查點識別符號相匹配的記錄;
3.從最後一個檢查點應用日誌檔案的操作;
日誌記錄過程
WiredTiger建立一個日誌檔案記錄每一個客戶端的寫操作,日誌記錄包括任何由初始寫入引起的任何內部寫操作;例如:集合中對文件的更新可能會導致索引的更新,WiredTiger建立單個日誌記錄包含更新操作以及相關聯的索引修改操作;
MongoDB使用WiredTiger儲存引擎在快取中儲存日誌檔案,執行緒協調和分配緩衝區的一部分,日誌記錄最高可達128Bytes;
WiredTiger同步緩衝日誌記錄到硬碟上按以下間隔和條件
在MongoDB3.2版本是每隔100毫秒;
MongoDB的WiredTiger儲存引擎的檢查點集在使用者資料每隔60秒或者日誌檔案達到2GB時那個條件滿足就執行日誌同步寫入;
MongoDB日誌檔案的大小限制在100MB,當檔案大小達到100MB時候會建立一個新的日誌檔案,當新的日誌檔案同步成功,WiredTiger會同步舊的日誌檔案;
日誌檔案
MongoDB在dbpath路徑下建立一個子目錄journal,WiredTiger儲存引擎的日誌檔案格式如下WiredTigerLog.<sequence>,sequence是0填充數從0000000001開始。
日誌檔案包含每個寫入操作的記錄,每個記錄都有唯一的識別符號。
MongoDB的WiredTiger儲存引擎使用snappy壓縮庫壓縮日誌資料。
對於WiredTiger最小的日誌記錄是128Bytes,如果一個日誌記錄是128Bytes或者更小,WiredTiger不會壓縮日誌記錄。
MongoDB的WiredTiger日誌記錄檔案有一個最大100M的限制,一旦檔案超過這個極限,WiredTiger建立一個新的日誌檔案。
WiredTIger自動刪除舊的日誌檔案僅維持檔案需要從最後一個檢查點恢復資料的記錄。
WiredTiger將預分配日誌檔案
MMAPv1儲存引擎及日誌
當有一個寫操作時MongoDB更新寫操作,啟動日誌功能,MongoDB首先會將寫入操作寫入到記憶體中在寫入硬碟日誌檔案之前,如果在提交更改到資料檔案之前MongoDB終端或者遇到一個錯誤,MongoDB可以使用日誌檔案將寫入操作和資料檔案保持一致。
日誌程序
日誌,MongoDB的儲存層有兩個內部資料集的觀點:私有檢視,用於寫入到日誌檔案,以及共享檢視,用於寫入資料檔案:
1.MongoDB首先適用於私有檢視寫操作。
2.MongoDB在日誌目錄中大概每100毫秒運用私有檢視更新日誌到日誌檔案中,MongoDB記錄寫操作到資料檔案使用批處理的方式,分組提交可以提高效能,自動寫入到日誌檔案,確保資料一致,
3.提交一個日誌,MongoDB適用於分片檢視
4.最終,MongoDB的應用共享檢視中更改的資料檔案。更準確地說,預設間隔為60秒。MongoDB要求作業系統將共享檢視的資料檔案寫入日誌檔案,作業系統可以選擇以高於60秒的頻率重新整理共享檢視到磁碟,特別是如果系統空閒記憶體不足。使用 storage.syncPeriodSecs2設定改變寫入資料的時間間隔。
如果mongod例項崩潰了沒有應用寫入資料檔案,日誌可以重播寫入共享檢視最終寫入資料檔案。
當MongoDB重新整理資料到資料檔案,MongoDB標識哪個日誌檔案已經重新整理,一旦一個日誌檔案重新整理過,MongoDB需要生成一個新的日誌檔案。