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、日誌檔案系統的方法來解決檔案系統的一致性問題,這裡還有一個問題,我們經常使用的隨身碟或是SD卡,它並沒有使用上面的任何一種機制,為什麼我們在實際使用的時候,很少能感覺到丟資料呢?甚至還經常直接熱拔插它們。這個問題我們在下一篇中解釋。