liwen01 2024.06.16 前言 先提幾個問題:什麼是文件系統崩潰一致性?為什麼會出現文件系統崩潰一致性問題?有哪些方法可以解這個問題?它們各自又有哪些局限性? window系統電腦異常後會藍屏、手機死機卡頓後我們會手動給它重啟,大部分設備的系統在遇到不可修複的嚴重異常後都會嘗試通過重啟來 ...
liwen01 2024.06.16
前言
先提幾個問題:什麼是文件系統崩潰一致性?為什麼會出現文件系統崩潰一致性問題?有哪些方法可以解這個問題?它們各自又有哪些局限性?
window系統電腦異常後會藍屏、手機死機卡頓後我們會手動給它重啟,大部分設備的系統在遇到不可修複的嚴重異常後都會嘗試通過重啟來恢復,因為系統重啟之後,系統整體比較"乾凈"。
其中有一例外,就是我們希望磁碟存儲的數據無論在系統出現何種異常的情況下,都能夠保存好原來的數據,系統恢復後可以再找到異常前的所有數據。
文件系統崩潰一致性(Crash Consistency)是指在文件系統發生崩潰、斷電或其它不可預見的故障後,文件系統能夠保證數據的一致性和完整性,並能夠恢復到一個合法且可操作的狀態,確保系統重新啟動或恢復之後,數據不會出現損壞、丟失或不一致的情況。
(一)一致性的複雜性
以ext4 文件系統舉例,當我們創建一個文件系統的時候,有下麵4個步驟:
-
查找空閑 inode:通過檢查 inode bitmap找到一個空閑的 inode,併在 inode bitmap中標記為已使用。 -
分配數據塊:通過檢查block bitmap找到空閑的數據塊,併在block bitmap中標記為已使用。 -
更新 inode:將新文件的元數據寫入 inode table中的相應位置。 -
更新目錄項:在目標目錄的 inode 數據塊中添加一個新的目錄項,包含文件名和對應的 inode 號。
因為磁碟是以扇區為最小單位,所以上面4個步驟不可能一次全部寫入到磁碟中去,在1到4步驟中間的任意一個時間點系統突然崩潰,都會導致文件系統不一致。比如在2~3步驟中間斷電,就會造成inode bitmap、block bitmap中標記已經使用,但是沒有實際的文件與之對應,如果不回收,那麼這幾個塊就可能永遠不會被使用。
在實際使用的時候,情況會更加地複雜,因為系統為了提升文件系統的讀寫檢索性能,在掛載文件系統的時候,系統會將文件系統的元數據緩存到記憶體上。如下圖《圖1.1 記憶體與存儲結構》
在有緩存的情況下,數據一般是定時寫入磁碟,或者是手動保存才會寫入磁碟,一次完成批量數據的寫入。如果在這個過程中突然異常,丟失的數據可能會更加多。
有多少人經歷過電腦突然斷電,辛辛苦苦寫的內容全部被丟失。系統崩了,內心也崩了。
關於ext4 文件系統的詳細介紹,可以查看文章《文件系統(六):一文看懂linux ext4文件系統工作原理》
解決文件系統一致性的問題,常用的方法有:日誌、寫時複製、Soft Update、日誌文件系統,它們各有優缺點,目前並沒有哪種方案可以適用所有場景。
(二)文件系統日誌
(1)日誌工作原理
在ext4文件系統中,有一個獨立的日誌數據區,它的基本思想是:先將一組操作記錄到日誌區(日誌提交完成),然後再去實現這些操作(應用事務完成),實現結束之後再把日誌擦除(日誌清理完成)。
事務開始:文件系統開始一組更新操作,並開啟一個新的事務
收集日誌:收集所有即將修改的數據(以及在 Journal 模式下的數據)
提交日誌:更新日誌頭,標記該事務已經提交(commit)
應用事務:將日誌中的修改應用到文件系統,將數據和元數據寫入最終位置
清理日誌:事務完成後,日誌系統清理已提交的日誌記錄
(2)通過日誌進行恢復
文件系統有了日誌功能之後,在文件系統崩潰或是突然斷電後就可以通過日誌保持文件系統的一致性。基本的流程是,文件系統掛載後,系統會去掃描日誌區域,看是否有未完成的事務,如果有,則判斷該事件是否有提交:
-
如果未提交,本次修改操作就直接丟棄 -
如果有提交,根據日誌記錄的信息,重新執行修改操作
(3)優缺點
文件系統的日誌功能,它的主要優點有兩個:
-
可以保持一致性: 不會因為某些異常導致整個文件系統異常 -
可以減少文件系統檢查時間: 傳統使用fsck去掃描整個磁碟進行檢查,非常耗時,有了日誌功能後,直接掃描日誌信息就可以了。
文件系統引入日誌之後,明顯的缺點有:
-
影響性能: 所有的操作都需要先寫日誌,再執行具體的操作,在高負載的情況下會導致IO壓力增加,從而降低系統的整體性能。 -
寫熱點: 因為日誌區會頻繁的寫入和擦除,對於有擦寫次數限制的flash來說,比較容易把日誌區域寫穿。
(4)ext4 的日誌模式
ext4 文件系統用JBD2實現的日誌有三種模式:Writeback、Ordered、Journal
Writeback模式:
在這種模式下,元數據變更會被記錄到日誌中,但數據的變更不會被記錄。數據寫入磁碟的順序不受元數據更新的順序影響。
優點:性能較高,因為減少了日誌記錄的數據量。
缺點:數據一致性較差,在崩潰後,文件可能會包含新元數據指向的舊數據。
Ordered模式:
這是ext4文件系統的預設日誌模式。元數據變更會被記錄到日誌中,數據的變更雖然不記錄,但數據寫入磁碟的順序必須在相應的元數據更新之前。
優點:在性能和數據一致性之間提供了平衡。崩潰後,文件不會包含新元數據指向的舊數據,因為數據寫入總是在元數據更新之前完成。
缺點:性能比writeback模式略低,因為需要保證數據先於元數據寫入。
Journal模式:
在這種模式下,所有數據和元數據的變更都會被記錄到日誌中。數據和元數據都被完整地寫入日誌,然後再寫入主文件系統。
優點:提供最高的數據一致性保障。在崩潰恢復時,所有已提交的數據和元數據變更都可以被恢復。
缺點:性能較低,因為所有數據都需要寫兩次,一次寫入日誌,一次寫入主文件系統
(三)寫時複製(Copy on Write)
Copy-on-Write(COW,寫時複製)在在電腦中應用非常多,比較常見的是在記憶體中的寫時複製。文件系統中的寫時複製與記憶體中的寫時複製有些不一樣。在文件系統崩潰一致性中,COW它的基本原理是,在需要修改數據時,不直接在原數據位置進行修改,而是將數據複製到新位置進行修改,只有在修改完成後,才更新指針或元數據指向新的數據位置。
(1)基本原理
COW技術的核心思想是推遲實際數據寫入的時間,直到必須進行修改為止。具體步驟如下:
-
讀取數據:當需要讀取數據時,直接從現有的數據塊讀取。 -
寫入數據:當需要寫入數據時,不直接修改現有的數據塊,而是複製一份數據塊到新位置。 -
修改數據:在新的數據塊上進行修改操作。 -
更新元數據:在確保新數據塊寫入成功後,更新指向數據塊的元數據,使其指向新的數據位置。 -
釋放舊數據:如果舊的數據塊不再被引用,則可以將其標記為可用空間。
(2)工作流程
以Btrfs為例,COW的工作流程如下:
-
當用戶修改文件時,Btrfs首先在新位置分配一個新的數據塊。 -
將舊數據塊中的內容複製到新數據塊。 -
在新數據塊上應用用戶的修改。 -
修改完成後,更新Btrfs的元數據,將指針從舊數據塊指向新數據塊。 -
在確保所有元數據更新都完成後,舊數據塊可以被標記為可用空間。
(3)應用實例
Btrfs和ZFS:Btrfs(B-tree文件系統)和ZFS(Zettabyte文件系統)是兩種廣泛使用的支持COW的文件系統。它們利用COW技術來提高數據一致性和完整性。
快照和克隆:COW允許高效地創建數據快照和克隆。例如,在Btrfs中,可以通過COW技術快速創建文件系統的快照,而無需複製實際數據。
事務性操作:通過COW,文件系統中的修改可以被視為事務性操作。只有當所有修改都成功完成後,才會更新元數據指針,這確保了在崩潰發生時,文件系統處於一致的狀態。
(4)優勢
數據一致性:由於數據修改是在新位置進行的,系統崩潰時舊數據仍然保持不變,確保數據一致性。
崩潰恢復:在崩潰恢復過程中,通過檢查元數據,可以快速確定哪些數據塊是有效的,哪些是未完成的修改。
高效快照:COW技術允許文件系統高效地創建和管理快照,因為快照只需複製元數據指針,而不需要複製實際數據。
(5)缺點
性能開銷
-
寫放大效應:COW會導致寫放大效應,因為每次寫入操作都需要分配新的數據塊,並將數據複製到新位置。這可能會增加寫操作的延遲,尤其在寫入頻繁的場景下 -
額外的元數據更新:由於每次寫入都需要更新元數據指針,這會增加文件系統的元數據操作負擔,影響整體性能。
磁碟空間利用效率
-
磁碟空間碎片化:COW技術會導致磁碟空間碎片化,因為每次寫入都會創建新的數據塊。這可能會導致文件系統中的空閑空間變得不連續,從而降低磁碟空間利用效率。 -
空間消耗:由於每次寫入需要新的數據塊,因此在頻繁的寫操作下,磁碟空間的消耗速度會加快,尤其是在快照和克隆操作頻繁的情況下。
數據恢復和修複複雜性
-
數據恢復時間:在發生系統崩潰或其他故障時,儘管COW能確保數據一致性,但恢復過程可能會較為複雜,需要檢查和重建元數據。 -
修複工具的複雜性:文件系統需要複雜的修複工具來處理和修複COW帶來的元數據和數據問題,這增加了系統維護的複雜性。
硬體依賴性
-
對存儲硬體的要求:COW技術對存儲硬體的性能有較高要求,尤其是在頻繁寫操作或快照操作的情況下。使用慢速存儲設備可能會顯著降低系統性能。
(四)Soft Updates
Soft Updates 是通過有序地更新元數據以確保文件系統的一致性,同時儘可能減少性能開銷。與日誌和Copy-on-Write(COW)技術相比,Soft Updates 提供了一種不同的路徑來實現崩潰一致性。
(1)基本原理
Soft Updates 的核心思想是控制文件系統元數據更新的順序,以確保即使在系統崩潰時,文件系統仍然保持一致性。具體方法包括以下幾個步驟:
-
依賴關係跟蹤:記錄元數據更新之間的依賴關係,確保更新順序滿足一致性要求。 -
延遲寫入:延遲寫入元數據的某些更新,直到所有相關依賴關係得到滿足為止。 -
批量處理:將多個相關的元數據更新批量處理,以減少磁碟I/O操作次數。
(2)工作流程
創建和刪除文件:
-
在創建文件時,首先更新目錄條目,然後更新文件的inode。 -
在刪除文件時,先更新文件的inode,再更新目錄條目。這確保了即使系統崩潰,仍然不會出現目錄指向已刪除文件的情況。
分配和釋放數據塊:
-
分配數據塊時,先更新inode中的指針,再標記數據塊為已使用。 -
釋放數據塊時,先標記數據塊為未使用,再更新inode中的指針。這防止系統崩潰後出現數據塊被多次分配的情況。
更新元數據:
-
所有元數據更新操作都在記憶體中進行排序,確保在寫入磁碟時滿足依賴關係。 -
在寫入磁碟之前,檢查所有依賴關係,確保更新順序正確。
(3)優勢
-
提高性能:由於不需要像日誌功能那樣記錄每次操作的日誌,Soft Updates 在一定程度上減少了磁碟I/O操作,從而提高了性能。 -
一致性保證:通過有序的元數據更新,確保文件系統即使在崩潰後也能保持一致性。 -
減少寫放大效應:相比COW,Soft Updates 通過批量處理和延遲寫入減少了寫放大效應,節省了磁碟空間和I/O操作。
(4)缺點
-
實現複雜性:Soft Updates 的實現需要精確跟蹤和管理元數據更新之間的依賴關係,增加了文件系統的複雜性。 -
記憶體消耗:為了管理依賴關係和批量處理更新,Soft Updates 需要在記憶體中維護大量的狀態信息,可能增加記憶體消耗。 -
有限的應用範圍:Soft Updates 主要適用於元數據更新頻繁的場景,對於數據更新頻繁的場景,其優勢不明顯。
(五)日誌文件系統(Log-structured File System)
這裡介紹的日誌文件系統(Log-structured File System,LFS),與上面介紹的ext4的日誌功能不是同一個東西,LFS採用了完全不同的方法來管理數據和元數據,以提高性能和崩潰一致性。
(1)基本原理
日誌文件系統(LFS)的核心思想是將所有數據和元數據的更新操作記錄到一個連續的日誌結構中,而不是直接在原數據塊上進行寫操作。其基本原理如下:
-
日誌結構:LFS將所有寫操作都追加(append)到一個稱為日誌(log)的連續區域中,而不是覆蓋現有的數據塊。 -
數據和元數據更新:當有寫操作時,LFS將更新操作追加到日誌中,併在日誌中記錄新的數據塊或更新的元數據。 -
後臺回收:為了保持文件系統性能,LFS周期性地執行後臺任務,將日誌中的更新整理併合併成新的數據塊,然後釋放不再使用的舊數據塊。 -
崩潰一致性:由於所有的更新都是追加到日誌中,而不是直接在原始數據位置上修改,當系統崩潰時,可以通過重放日誌來恢覆文件系統狀態,從而確保數據的一致性。
(2)工作流程
寫操作:
-
當文件系統執行寫操作時,LFS將新的數據或更新的元數據追加到日誌中。 -
日誌中的寫入是順序的,因此可以通過順序寫入優化性能。
後臺合併:
-
定期或在需要時,LFS執行後臺任務,將日誌中的更新合併成新的數據塊。 -
合併過程中可以優化數據的排列順序,並釋放不再需要的舊數據塊。
崩潰恢復:
-
在系統崩潰或重新啟動時,LFS通過重放日誌中的操作來恢覆文件系統的狀態。 -
因為所有更新都是追加的,可以確保文件系統在崩潰後仍然保持一致性,避免數據損壞或丟失。
(3)優勢
-
崩潰一致性:通過日誌追加和重放機制,確保系統崩潰後可以快速恢復到一致狀態。 -
寫性能:順序寫入日誌結構可以顯著提高寫入性能,特別是在高負載和隨機寫入場景下。 -
數據恢復:由於數據和元數據的更新都是追加到日誌中的,即使發生意外的系統崩潰,也可以通過重放日誌來恢複數據,而不會丟失已經提交的更新。
(4)缺點
-
讀操作性能:由於數據的讀取可能分散在不同的日誌塊中,可能導致隨機讀取性能下降,尤其是在較大的文件系統上。 -
空間利用率:由於數據是追加到日誌中的,可能會產生碎片化的數據存儲,從而影響磁碟空間的有效利用。 -
實現複雜性:設計和實現一個高效的日誌文件系統需要處理複雜的數據結構和演算法,這可能增加系統的開發和維護成本。
(5)應用
在嵌入式設備中, 經常使用jffs2文件系統進行參數保存,雖然jffs2 是專門為快閃記憶體設計的文件系統,但它的設計也是LFS的原理來設計的。
結尾
上面介紹了日誌、寫時複製、Soft Update、日誌文件系統的方法來解決文件系統的一致性問題,這裡還有一個問題,我們經常使用的U盤或是SD卡,它並沒有使用上面的任何一種機制,為什麼我們在實際使用的時候,很少能感覺到丟數據呢?甚至還經常直接熱拔插它們。這個問題我們在下一篇中解釋。