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