日誌檔案系統是怎樣工作的

2021-08-20 08:16:40 字數 1656 閱讀 1126

原文:

檔案系統要解決的乙個關鍵問題是怎樣防止掉電或系統崩潰造成資料損壞,在此類意外事件中,導致檔案系統損壞的根本原因在於寫檔案不是原子操作,因為寫檔案涉及的不僅僅是使用者資料,還涉及元資料(metadata)包括 superblock、inode bitmap、inode、data block bitmap等,所以寫操作無法一步完成,如果其中任何乙個步驟被打斷,就會造成資料的不一致或損壞。舉乙個簡化的例子,我們對乙個檔案進行寫操作,要涉及以下步驟:

從data block bitmap中分配乙個資料塊;

在inode中新增指向資料塊的指標;

把使用者資料寫入資料塊。

日誌檔案系統(journal file system)就是為解決上述問題而誕生的。它的原理是在進行寫操作之前,把即將進行的各個步驟(稱為transaction)事先記錄下來,儲存在檔案系統上單獨開闢的一塊空間上,這就是所謂的日誌(journal),也被稱為write-ahead logging,日誌儲存成功之後才進行真正的寫操作、把檔案系統的元資料和使用者資料寫進硬碟(稱為checkpoint),這樣萬一寫操作的過程中掉電,下次掛載檔案系統之前把儲存好的日誌重新執行一遍就行了(術語叫做replay),避免了前述的資料損壞場景。

有人問如果儲存日誌的過程中掉電怎麼辦?最初始的想法是把一條日誌的資料一次性寫入硬碟,相當於乙個原子操作,然而這並不可行,因為硬碟通常以512位元組為單位進行操作,日誌資料一超過512位元組就不可能一次性寫入了。所以實際上是這麼做的:給每一條日誌設定乙個結束符,只有在日誌寫入成功之後才寫結束符,如果一條日誌沒有對應的結束符就會被視為無效日誌,直接丟棄,這樣就保證了日誌裡的資料是完整的。

一條日誌在它對應的寫操作完成之後就沒用了,占用的硬碟空間就可以釋放。儲存日誌的硬碟空間大小是有限的,被迴圈使用,所以日誌也被稱為circular log。

至此可以總結一下日誌檔案系統的工作步驟了:

journal write : 把transaction寫入日誌中;

journal commit : 在一條日誌儲存好之後,寫入結束符;

checkpoint : 進行真正的寫操作,把元資料(metadata)和使用者資料(user data)寫入檔案系統;

free : **日誌占用的硬碟空間。

以上方式把使用者資料(user data)也記錄在日誌中,稱為data journaling

,linux ext3檔案系統就支援這種方式,這種方式存在效率問題:就是每乙個寫操作涉及的元資料(metadata)和使用者資料(user data)實際上都要在硬碟上寫兩次,一次寫在日誌裡,一次寫在檔案系統上。元資料倒也罷了,使用者資料通常比較大,拷貝幾個gb的電影檔案也要乘以2實在是降低了效率。

乙個更高效的方式是metadata journaling

,不把使用者資料(user data)記錄在日誌中,它防止資料損壞的方法是先寫入使用者資料(user data)、再寫日誌,即在上述」journal write」之前先寫使用者資料,這樣就保證了只要日誌是有效的,那麼它對應的使用者資料也是有效的,一旦發生掉電故障,最壞的結果也就是最後一條日誌沒記完,那麼對應的使用者資料也會丟,效果與data journaling丟棄日誌一樣,重要的是檔案系統的一致性和完整性是***的。metadata journaling又叫ordered journaling,大多數檔案系統都採用這種方式。像linux ext3檔案系統也是可以選擇data journaling還是ordered journaling的。

Mysql 日誌檔案系統

mysql中的日誌包括 錯誤日誌 通用查詢日誌 二進位制日誌 慢查詢日誌等等。這裡主要介紹下比較常用的兩個功能 通用查詢日誌和慢查詢日誌。錯誤日誌 記錄啟動 執行或停止mysqld時出現的問題。通用日誌 記錄建立的客戶端連線和執行的語句。二進位制日誌 記錄所有更改資料的語句。還用於複製。慢查詢日誌 ...

Linux 日誌檔案系統

檔案系統要解決的乙個關鍵問題是怎樣防止掉電或系統崩潰造成資料損壞 在此類意外事件中,導致檔案系統損壞的根本原因在於寫檔案不是原子操作 因為寫檔案涉及的不僅僅是使用者資料,還涉及元資料 metadata 包括 superblock inode bitmap inode data block bitma...

什麼是檔案系統

個人理解,檔案系統其實就是針對特定的作業系統的架構的一種實現形式。具體表現為,特定的資料夾,資料夾之間的關係,即組織架構,以及特定的各種檔案 再詳細解釋為 linux中的rootfs,就是那些資料夾和檔案,包括什麼根檔案目錄 系統相關的配置檔案目錄 etc 存放系統啟動相關配置的 etc init ...