王大拿在給新員工培訓:「無論是使用過Windows操作系統還是Linux操作系統的同學,相信都知道什麼是文件系統。」 趙二狗插嘴到:「什麼是文件系統?」 好吧,我驚呆了!

給個截圖吧,下面這個都見過吧。一堆文件夾,然後裏面又有一堆文件,這些東東就是文件系統的表象。那本質是什麼呢?我們知道這些東西其實都是存在磁碟上的,具體磁碟空間是什麼樣的我們並不知道,但文件系統軟體給我們呈現出來了一個非常清晰的表象,我們可以創建、刪除和複製這些文件。而實現這些功能是通過一個軟體實現的,這個軟體就是文件系統

什麼是文件系統

任何技術的出現是為瞭解決問題,文件系統也是為瞭解決某些問題。那文件系統是為瞭解決什麼問題呢?

我們有了一個相對形象的概念,文件系統管理著很多文件。而這些文件其實就是數據,這些數據又是存儲在磁碟上的。因此,實質上文件系統是管理磁碟的軟體系統,它簡化了用戶對磁碟空間的使用方法,並降低了磁碟空間的使用難度,通過更加形象的方式將磁碟中的數據展示給用戶。 趙二狗竊竊私語:「好囉嗦」 大家對磁碟都比較清楚,其實就是存儲數據的地方,我們可以將磁碟與倉庫類比。如圖3所示是一個空倉庫,一個沒有格式化的磁碟就好像一個空倉庫,空間非常大,我們可以隨便使用。

磁碟的內部雖然非常複雜,但磁碟生產廠商做了很多工作,將磁碟的複雜性掩蓋起來了。對於普通用戶來說,磁碟就是一個線性空間,就好像C語言中的數組一樣,通過偏移就可以訪問其空間(讀寫數據)。

但是,我們雖然可以直接訪問磁碟的空間,如果缺乏規劃,那麼使用的最終結果可能是這樣樣子的。數據被毫無規律的放到磁碟上,最後查找的時候會非常費勁,甚至可能找不到需要的數據。

因此,文件系統出現了。文件系統實現對磁碟空間的統一管理,一方面文件系統對磁碟空間進行統一規劃,另外一方面文件系統提供給普通用戶人性化的介面。就好比倉庫中的貨架,將空間進行規劃和編排,這樣根據編號可以方便的找到具體的貨物。而文件系統也是類似,將磁碟空間進行規劃和編號處理,這樣通過文件名就可以找到具體的數據,而不用關心數據到底是怎麼存儲的。

以Ext4文件系統為例,它將磁碟空間進行劃分,並通過元數據實現對磁碟空間的管理。這樣,用戶對文件的操作就轉化為文件系統對磁碟空間的操作。

也就是說,文件系統解決了普通用戶使用磁碟存儲數據的問題。

什麼是分散式文件系統

上面說的是普通本地文件系統的概念,比如Ext4、XFS、FAT32和Btrfs等文件系統。這些文件系統只能在本地進行磁碟格式化並使用。那麼什麼是分散式文件系統呢?下面是維基百科給出的定義。

相對於本機端的文件系統而言,分散式文件系統(英語:Distributed file system, DFS),或是網路文件系統(英語:Network File System),是一種允許文件透過網路在多臺主機上分享的文件系統,可讓多機器上的多用戶分享文件和存儲空間。

通過定義我肯可以看出,分散式文件系統解決的是資源共享的問題。我們先看一個實例,以NFS文件系統為例,它分為服務端和客戶端,客戶端通過某種協議連接到服務端,此時會在客戶端的目錄樹中映射一個子樹,這樣在客戶端就能訪問服務端的文件系統。然而,對於客戶端來說,這個目錄樹關係是透明的,也就是用戶不知道這些內容是在遠程計算機,也不用關心。

分散式文件系統解決的最大的問題是資源共享的問題,因此分散式文件系統最大的特點是多個客戶端可以訪問相同的服務端。

NFS可以供多個客戶端訪問,但其畢竟是單機,處理能力是有限的。因此在大規模數據領域,不如電商網站、大數據處理等,採用單機模式無法滿足要求。問題有出來了,為瞭解決這個問題,谷歌開發了GFS分散式文件系統,該文件系統的服務端通過一個集羣來實現,客戶端可以並發的訪問該集羣的多達數萬個節點,因此承載能力得到極大的提升。 如圖10是HDFS的架構圖,HDFS是GFS的開源實現,起基本架構是一樣的。整個集羣的節點分為2中角色,一個是Master節點,負責管理元數據;另外一個是數據節點,負責存儲文件的數據。在這種架構中,客戶端通過Master節點可以得到文件數據的具體位置,然後可以直接與數據節點交互。由於數據節點可以很多(數萬個),因此承載能力得到極大的提升。

除了上述HDFS和GFS等分散式文件系統外,還有GlusterFS、CephFS等很多分散式文件系統,但每種分散式文件系統的細節又有所差異,這個也是與它們所要解決的具體問題相關的

什麼是集羣文件系統

雖然分散式文件系統可以處理高並發訪問的問題,但對於同一個文件同時寫會存在數據不一致的問題。這個需要客戶端的應用做特殊處理。如圖11所示,客戶端1從服務端讀取的某個文件的數據,而此時在客戶端進行了追加寫操作,由於網路延遲或者什麼原因,數據並沒有達到服務端。此時,客戶端2讀取了服務端的數據,顯然此時數據是舊數據。如果此時客戶端2進行寫操作,無法保證服務端最終的數據是客戶端1的還是客戶端2的,因此存在不可預料的結果。

為瞭解決同一個文件被不同客戶端的應用並發寫的問題,這個時候開發了集羣文件系統。其中比較著名的是Oracle的OCFS2文件系統。OCFS2通過分散式鎖解決了寫並發的問題,如果有進程對某個文件的區域進行寫操作時會加鎖,這樣其它客戶端如果對相同區域寫數據時就必須等待。這樣,OCFS2文件系統就保證了數據的一致性。 到此為止,我們介紹文件系統的原理及市面上常見的各種類型的文件系統。通過分析我們看到,不同的文件系統解決的問題是不同的,因此應用場景也是有很大差異的。因此,大家在工作中如果選型時,也需要考慮這些差異。


推薦閱讀:
相關文章