Failure-Atomic Updates of Application Data in a Linux File System
本論文主要設(shè)計并實現(xiàn)了一種能保護應(yīng)用數(shù)據(jù)原子性的文件系統(tǒng),其通過擴展 POSIX 接口來完成這個能力。其背景主要是傳統(tǒng)文件系統(tǒng)通常使用日志形式來保證自身元數(shù)據(jù)的正確性,來避免掉電或者系統(tǒng)崩潰后造成的文件系統(tǒng)異常,而應(yīng)用程序數(shù)據(jù)為了保證數(shù)據(jù)更新的原子性和正確性必須在應(yīng)用層同樣實現(xiàn)日志功能。
為了解決應(yīng)用層使用日志引起的 Double Write,目前硬件廠商比如 Fushion IO 提供的原子寫 API 或者使用 NVM 來保證持久性的內(nèi)存寫入來解決系統(tǒng)崩潰帶來的問題。
本文的 AdvFS 完全不依賴特定硬件并且基于原生的內(nèi)核實現(xiàn)了支持原子更新且支持多文件的原子更新。在打開一個 AdvFS 的文件時指定 O_ATOMIC 來表示該文件需要使用原子更新能力,在打開文件后會在 AdvFS 產(chǎn)生一個 shadow file,其是用戶可見文件的 clone,其跟正常文件一樣指向數(shù)據(jù)塊,但是擁有自己的數(shù)據(jù)指針圖,在寫入文件時使用 COW(copy on write) 技術(shù)正常文件的數(shù)據(jù)指針圖更新到寫入到新的塊,在調(diào)用 msync 時會刪除原來 clone 指針圖和相應(yīng)的數(shù)據(jù)塊,同時產(chǎn)生一個新的 clone。最后在關(guān)閉文件,會刪除該 clone。因此如果系統(tǒng)發(fā)生崩潰,在打開該文件時會發(fā)現(xiàn)殘留的 clone 文件,可以恢復(fù)到之前的內(nèi)容來保證更新一致性。
如果更新多個文件時,因為單文件使用 COW 的形式提供原子性,那么多文件其利用日志來記錄元數(shù)據(jù)操作,比如寫入后同步會對日志寫入所有相關(guān)的 clone 元數(shù)據(jù)操作,且不會寫入數(shù)據(jù)內(nèi)容,因此可以利用較少的日志空間大小得到同時能夠原子性更新多個文件的效果。
最后通過 AuvFS 跟其他文件系統(tǒng)使用 Double Write 獲得的原子性更新做比較,在傳統(tǒng)的 B樹數(shù)據(jù)庫能獲得較大收益,對于 LevelDB 等 LSM 結(jié)構(gòu)的數(shù)據(jù)庫會造成性能下降,對于了解兩者實現(xiàn)的性能差異我們可以很容易理解。
RAIDShield: Characterizing, Monitoring, and Proactively Protecting Against Disk Failures
本論文旨在通過監(jiān)測物理盤的內(nèi)部統(tǒng)計數(shù)據(jù)的變化來進行分析并判斷一個 RAID 盤陣是否處于不健康狀態(tài)。眾所周知,RAID 通過冗余數(shù)據(jù)增加了數(shù)據(jù)的可用性和持久性,但是在運行過程中的數(shù)據(jù)訪問和修改會使得不同盤組迥異的數(shù)據(jù)可用結(jié)果和狀態(tài)。
本文提出了兩種監(jiān)測模式,一種是獨立盤的內(nèi)部數(shù)據(jù)如 Sector Error,Reallocated Sector 等,類似于設(shè)置一個閥值,當(dāng)錯誤量超過一定數(shù)目時進行報警。另一種是通過多個盤的聯(lián)合監(jiān)測并通過公式計算盤組的數(shù)據(jù)訪問有效性來解決當(dāng)多個盤可能同時到達閥值而短時間無法更換大量盤的問題。
該文對于分布式存儲提供了一定的借鑒意義,單個盤的錯誤數(shù)據(jù)可以有效幫助管理員提前預(yù)警,多個盤的聯(lián)合監(jiān)測能提高集群應(yīng)對極端情況的應(yīng)對能力。
F2FS: A New File System for Flash Storage
F2FS 在文件系統(tǒng)屆應(yīng)該是小有名氣的了,作為以面向 SSD 優(yōu)化著稱的本地文件系統(tǒng),它在論文中介紹了其對于 Flash SSD 的特點與傳統(tǒng)文件系統(tǒng)實現(xiàn)的差異,然后橫向比較了與 Ext4(Update in Place)、Btrfs(Copy on Write) 和 NILFS2(LFS) 的性能差異。
從其對特性的論述中如 Flash SSD 友好的 on-disk 格式,在更新數(shù)據(jù)時減小對于元數(shù)據(jù)更新的損耗(減小隨機小 IO),用多個 logging 流來提高并發(fā)能力,同時支持兩種寫日志方式(Append-only 和 Write in Hole)來解決高利用率時前者性能雪崩問題,最后還有面向大量使用 fsync 程序如 SQLite 的 fsync 調(diào)用優(yōu)化。
總的而言,F(xiàn)2FS 采用了空間換時間的策略,在實現(xiàn)上對于潛在的大量隨機 IO 等待大量使用 Lazy 的策略處理,同時因為采用 Lazy 的原因?qū)τ谠诟呃寐氏碌膲簻y可能造成 Cleaning 延時的問題上,保留了 5% 的預(yù)留空間來避免潛在的雪崩情況。打個比喻,F(xiàn)2FS 把大多數(shù)傳統(tǒng)文件系統(tǒng)(或者 LFS)可能的隨機小 IO 都不會及時提交而是拖后合并,這些小 IO 實際上可能累積后在最后的低可用空間先造成雪崩,但是 F2FS 的預(yù)留空間好像是“救命稻草”一樣簡單利落的扼殺了這種風(fēng)險,非常對本人的”胃口”:-)。
A Practical Implementation of Clustered Fault Tolerant Write Acceleration in a Virtualized Environment
這篇論文是希望在 VM 的 Host 端提供寫緩存來加速 VM IO,但是我們知道在 VM 存儲使用共享存儲方式時可以得到 Live Migration 這個使 VM 能夠具備移動能力,避免單機故障。而如果在 Host 端加入緩存,無疑使得 Live Migration 無法使用。因此,本文嘗試在所有 Host 上建立一個寫緩存”集群”來解決這個問題,使得每次寫在本地的緩存會同步發(fā)到另一個 Host,這樣使得在 Host 掛掉后仍可以在其他機器啟動 VM。
老實說,類似架構(gòu)可在 Nutanix 的存儲設(shè)計中得到引用,但是為了提供寫緩存的高可用性而構(gòu)建這么一個復(fù)雜的 Host Side 寫緩存集群似乎不只增加了一點復(fù)雜性。
BetrFS: A Right-Optimized Write-Optimized File System
看完概要就發(fā)現(xiàn)這是個利用 BufferTree 來實現(xiàn)的本地文件系統(tǒng),采用的是 TokuDB 的 Ft-index。對于 Ft-index 有興趣的可以看看其本身的 paper,本文主要是做了將 Ft-index 遷移到內(nèi)核并對接 VFS 進行了一番工作。
更多信息請查看IT技術(shù)專欄
2025國考·省考課程試聽報名