本地文件系統和分布式文件系統的特點
前言
文件系統是一套實現了數據的存儲、分級組織、訪問和獲取等操作的抽象數據類型(Abstract data type)(From Wikipedia)。
現在的文件系統多種多樣,不管是接口、架構、部署都有巨大差異,本文試圖總結一下本地文件系統和分布式文件系統以及它們的特點和技術點。
我試圖用一個極其抽象的圖來描繪本地文件系統和分布式文件系統。(PS: 好吧,結果就成了下面這個基本沒啥意義的圖。。。。)
專題推薦:回味那些經典的分布式文件系統
本地文件系統
本地文件系統主要是指Ext2,Ext3,Btrfs,XFS這類(很難概括,只好舉例子),它們通常提供以下功能:
- 擴展性:隨著系統容量的增加保持性能,不隨容量變化而導致性能震蕩。比如一個目錄下的海量文件,在EXT2/3中由于目錄設計問題會導致較大的性能問題。再比如EXT2/3中的Metadata的占用和inode的劃分可能會導致空間的浪費。
- 數據一致性
- Checksum: Checksum與對應的數據塊分開放置,避免silent corruption
- COW事務: COW事務參考文件系統特性 – COW事務
- Log: Log被一些文件系統用作WAL模式來加快寫操作,并且保證寫操作的原子性
- 多設備管理:傳統上Linux往往使用LVM進行多設備的管理,現代文件系統往往增加對多設備的支持。如ZFS和Btrfs會有存儲池模型對應LVM的邏輯卷組,文件系統會對底層的多設備進行并行的訪問。
- 快照和克隆:采用COW事務模型的文件系統通常具有這個特性
- 軟件RAID支持:現代文件系統通過對多設備的管理可以很好的支持軟件RAID,如Btrfs對Metadata進行RAID1的默認保護
- 針對SSD的優化: 除了SSD對于隨機讀這一特性的優化外,還有對SSD擦除操作的優化。另外,SSD在使用容量接近100%時會導致極差的寫入性能,文件系統也可以對SSD的分配策略和重平衡進行一定的優化。
- 壓縮和加密: 現在的IO速度遠遠跟不上CPU的發展,因此對磁盤文件進行壓縮讀寫是個很好的選擇,現代文件系統往往支持多種壓縮格式,而且可以支持整個文件系統的加密或者某個文件和目錄的加密
- 去重: 文件系統系統去重是個大話題,主要是計算塊的checksum方法或者客戶端計算文件的hash來決定是否是一個新文件。具體參考Deduplication。#p#
分布式文件系統
分布式文件系統的架構和實現有非常大的差異,如NFS這種傳統的基于存儲服務器的網絡文件系統,基于SAN的GPFS,然后現在的集群式架構,比如HDFS這種有中心的分布式,如GlusterFS這種無中心分布式,再如Ceph這種部分在內核態部分在用戶態等等。
NFS
GPFS
HDFS
GlusterFS
由于架構上的差異和本身文件系統的設計目標,通常分布式文件系統可以根據接口類型分成塊存儲、對象存儲和文件存儲。如Ceph具備塊存儲(Experiment)、文件存儲和對象存儲的能力,GlusterFS支持對象存儲和文件存儲的能力。而MogileFS只能作為對象存儲并且通過key來訪問。
- 擴展能力: 毫無疑問,擴展能力是一個分布式文件系統最重要的特點。分布式文件系統中元數據管理一般是擴展的重要問題,GFS采用元數據中心化管理,然后通過Client暫存數據分布來減小元數據的訪問壓力。GlusterFS采用無中心化管理,在客戶端采用一定的算法來對數據進行定位和獲取。
- 高可用性: 在分布式文件系統中,高可用性包含兩層,一是整個文件系統的可用性,二是數據的完整和一致性。整個文件系統的可用性是分布式系統的設計問題,類似于NOSQL集群的設計,比如有中心分布式系統的Master服務器,網絡分區等等。數據完整性則通過文件的鏡像和文件自動修復等手段來解決,另外,部分文件系統如GlusterFS可以依賴底層的本地文件系統提供一定支持。
- 協議和接口: 分布式文件系統提供給應用的接口多種多樣,Http RestFul接口、NFS接口、Ftp等等POSIX標準協議,另外通常會有自己的專用接口。
- 彈性存儲: 可以根據業務需要靈活地增加或縮減數據存儲以及增刪存儲池中的資源,而不需要中斷系統運行。彈性存儲的最大挑戰是減小或增加資源時的數據震蕩問題。
- 壓縮、加密、去重、緩存和存儲配額: 這些功能的提供往往考驗一個分布式文件系統是否具有可擴展性,一個分布式文件系統如果能方便的進行功能的添加而不影響總體的性能,那么這個文件系統就是良好的設計。這點GlusterFS就做的非常好,它利用類似GNU/Hurd的堆棧式設計,可以讓額外的此類功能模塊非常方便的增加。