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