我們無時無刻不在使用文件系統(tǒng),進行開發(fā)時在使用文件系統(tǒng),瀏覽網(wǎng)頁時在使用文件系統(tǒng),玩手機時也在使用文件系統(tǒng)。
對于非專業(yè)人士來說,可能根本不知道文件系統(tǒng)為何物。因為,通常來說,我們在使用文件系統(tǒng)時一般不會感知到文件系統(tǒng)的存在。即使是程序開發(fā)人員,很多人對文件系統(tǒng)也是一知半解。
雖然文件系統(tǒng)經(jīng)常不被感知,但是文件系統(tǒng)是非常重要的。在 Linux 中,文件系統(tǒng)是其內(nèi)核的四大子系統(tǒng)之一;微軟的 DOS(Disk Operating System,磁盤管理系統(tǒng)),核心就是一個管理磁盤的文件系統(tǒng),由此可見文件系統(tǒng)的重要性。
常見文件系統(tǒng)及分類
其實文件系統(tǒng)發(fā)展到現(xiàn)在,其種類也豐富多樣。比如,基于磁盤的普通本地文件系統(tǒng)除了 Ext4,還包括 XFS、ZFS 和 Btrfs 等。其中 Btrfs 和 ZFS 不僅可以管理一塊磁盤,還可以實現(xiàn)多塊磁盤的管理。不僅如此,這兩個文件系統(tǒng)實現(xiàn)了數(shù)據(jù)的冗余管理,這樣可以避免磁盤故障導(dǎo)致的數(shù)據(jù)丟失。除了對磁盤數(shù)據(jù)管理的文件系統(tǒng),還有一些網(wǎng)絡(luò)文件系統(tǒng)。也就是說,這些文件系統(tǒng)看似在本地,但其實數(shù)據(jù)是在遠程的專門設(shè)備上??蛻舳送ㄟ^一些網(wǎng)絡(luò)協(xié)議實現(xiàn)數(shù)據(jù)的訪問,如 NFS 和 GlusterFS 等文件系統(tǒng)。經(jīng)過幾十年的發(fā)展,文件系統(tǒng)的種類非常多,我們沒有辦法逐一進行介紹。下面就對主要的文件系統(tǒng)進行介紹。
本地文件系統(tǒng)
本地文件系統(tǒng)是對磁盤空間進行管理的文件系統(tǒng),也是最常見的文件系統(tǒng)形態(tài)。從呈現(xiàn)形態(tài)上來看,本地文件系統(tǒng)就是一個樹形的目錄結(jié)構(gòu)。本地文件系統(tǒng)本質(zhì)上就是實現(xiàn)對磁盤空間的管理,實現(xiàn)磁盤線性空間與目錄層級結(jié)構(gòu)的轉(zhuǎn)換,如下圖所示。
從普通用戶的角度來說,本地文件系統(tǒng)主要方便了對磁盤空間的使用,降低了使用難度,提高了利用效率。常見的本地文件系統(tǒng)有 Ext4、Btrfs、XFS 和 ZFS 等。
偽文件系統(tǒng)
偽文件系統(tǒng)是 Linux 中的概念,它是對傳統(tǒng)文件系統(tǒng)的延伸。偽文件系統(tǒng)并不會持久化數(shù)據(jù),而是內(nèi)存中的文件系統(tǒng)。它是以文件系統(tǒng)的形態(tài)實現(xiàn)用戶與內(nèi)核數(shù)據(jù)交互的接口。常見的偽文件系統(tǒng)有 proc、sysfs 和 configfs 等。
在 Linux 中,偽文件系統(tǒng)主要實現(xiàn)內(nèi)核與用戶態(tài)的交互。比如,我們經(jīng)常使用的 iostat 工具,其本質(zhì)上是通過訪問/proc/diskstats 文件獲取信息的,如下圖所示。而該文件正是偽文件系統(tǒng)中的一個文件,但其內(nèi)容其實是內(nèi)核中對磁盤訪問的統(tǒng)計,它是內(nèi)核某些數(shù)據(jù)結(jié)構(gòu)的實例。
網(wǎng)絡(luò)文件系統(tǒng)
網(wǎng)絡(luò)文件系統(tǒng)是基于 TCP/IP 協(xié)議(整個協(xié)議可能會跨層)的文件系統(tǒng),允許一臺計算機訪問另一臺計算機的文件系統(tǒng),就如訪問本地文件系統(tǒng)一樣。網(wǎng)絡(luò)文件系統(tǒng)通常分為客戶端和服務(wù)端,其中客戶端類似本地文件系統(tǒng),而服務(wù)端則是對數(shù)據(jù)進行管理的系統(tǒng)。網(wǎng)絡(luò)文件系統(tǒng)的使用與本地文件系統(tǒng)的使用沒有任何差別,只需要執(zhí)行 mount 命令掛載即可。網(wǎng)絡(luò)文件系統(tǒng)也有很多種類,如 NFS 和 SMB 等。
在用戶層面,完成掛載后的網(wǎng)絡(luò)文件系統(tǒng)與本地文件系統(tǒng)完全一樣,看不出任何差異,對用戶是透明的。網(wǎng)絡(luò)文件系統(tǒng)就好像將遠程的文件系統(tǒng)映射到了本地。如下圖所示,左側(cè)是客戶端,右側(cè)是文件系統(tǒng)服務(wù)端。
當(dāng)在客戶端對服務(wù)端導(dǎo)出的文件系統(tǒng)進行掛載后,服務(wù)端的目錄樹就成為客戶端目錄樹的一顆子樹。這個子目錄對普通用戶來說是透明的,不會感知到這是一個遠程目錄,但實際上讀/寫請求需要通過網(wǎng)絡(luò)轉(zhuǎn)發(fā)到服務(wù)端進行處理。
集群文件系統(tǒng)
集群文件系統(tǒng)本質(zhì)上也是一種本地文件系統(tǒng),只不過它通常構(gòu)建在基于網(wǎng)絡(luò)的SAN 設(shè)備上,且在多個節(jié)點中共享 SAN 磁盤。集群文件系統(tǒng)最大的特點是可以實現(xiàn)客戶端節(jié)點對磁盤介質(zhì)的共同訪問,且視圖具有一致性,如圖 1-22 所示。這種視圖的一致性是指,如果在節(jié)點 0 創(chuàng)建一個文件,那么在節(jié)點 1 和節(jié)點 2都可以馬上看到。這個特性其實跟網(wǎng)絡(luò)文件系統(tǒng)類似,網(wǎng)絡(luò)文件系統(tǒng)也是可以在某個客戶端看到其他客戶端對文件系統(tǒng)的修改的。但是兩者是有差異的,集群文件系統(tǒng)本質(zhì)上還是構(gòu)建在客戶端的,而網(wǎng)絡(luò)文件系統(tǒng)則是構(gòu)建在服務(wù)端的。
同時,對于集群文件系統(tǒng)來說,其最大的特點是多個節(jié)點可以同時為應(yīng)用層提供文件系統(tǒng)服務(wù),特別適合用于業(yè)務(wù)多活的場景,通過集群文件系統(tǒng)提供高可用集群機制,避免因為宕機造成服務(wù)失效。
分布式文件系統(tǒng)
從本質(zhì)上來說,分布式文件系統(tǒng)其實也是一種網(wǎng)絡(luò)文件系統(tǒng)。在《計算機科學(xué)技術(shù)名詞》中給出的定義為“一種文件系統(tǒng),所管理的數(shù)據(jù)資源存儲在分布式網(wǎng)絡(luò)節(jié)點上,提供統(tǒng)一的文件訪問接口”,可以看出,分布式文件系統(tǒng)與網(wǎng)絡(luò)文件系統(tǒng)的差異在于服務(wù)端包含多個節(jié)點,也就是服務(wù)端是可以橫向擴展的。從使用角度來說,分布式文件系統(tǒng)的使用與網(wǎng)絡(luò)文件系統(tǒng)的使用沒有太大的差異,也是通過執(zhí)行 mount 命令掛載,客戶端的數(shù)據(jù)通過網(wǎng)絡(luò)傳輸?shù)椒?wù)端進行處理。
我們發(fā)現(xiàn)常規(guī)的網(wǎng)絡(luò)文件系統(tǒng)最大的缺點是服務(wù)端無法實現(xiàn)橫向擴展。這個缺點對大型互聯(lián)網(wǎng)應(yīng)用來說幾乎是不可容忍的。本文將介紹一下在互聯(lián)網(wǎng)領(lǐng)域應(yīng)用非常廣泛的分布式文件系統(tǒng)。分布式文件系統(tǒng)最大的特點是服務(wù)端通過計算機集群實現(xiàn),可以實現(xiàn)橫向擴展,存儲端的存儲容量和性能可以通過橫向擴展的方式實現(xiàn)近似線性的提升。
02
什么是分布式文件系統(tǒng)
分布式文件系統(tǒng)(Distributed File System,簡稱 DFS)是網(wǎng)絡(luò)文件系統(tǒng)的延伸,其關(guān)鍵點在于存儲端可以靈活地橫向擴展。也就是可以通過增加設(shè)備(主要是服務(wù)器)數(shù)量的方法來擴充存儲系統(tǒng)的容量和性能。同時,分布式文件系統(tǒng)還要對客戶端提供統(tǒng)一的視圖。也就是說,雖然分布式文件系統(tǒng)服務(wù)由多個節(jié)點構(gòu)成,但客戶端并不感知。在客戶端來看就好像只有一個節(jié)點提供服務(wù),而且是一個統(tǒng)一的分布式文件系統(tǒng)。
在分布式文件系統(tǒng)中,最出名的就是谷歌的 GFS。除此之外,還有很多開源的分布式文件系統(tǒng),比較有名且應(yīng)用比較廣泛的分布式文件系統(tǒng)有 HDFS、GlusterFS、CephFS、MooseFS 和 FastDFS 等。
分布式文件系統(tǒng)的具體實現(xiàn)有很多方法,不同的文件系統(tǒng)通常用來解決不同的問題,在架構(gòu)上也有差異。雖然分布式文件系統(tǒng)有很多差異,但是有很多共性的技術(shù)點。
分布式文件系統(tǒng)與網(wǎng)絡(luò)文件系統(tǒng)的異同
在有些情況下,NFS 等網(wǎng)絡(luò)文件系統(tǒng)也被稱為分布式文件系統(tǒng)。但是在本文中,分布式文件系統(tǒng)是指服務(wù)端可以橫向擴展的文件系統(tǒng)。也就是說,分布式文件系統(tǒng)最大的特點是可以通過增加節(jié)點的方式增加文件系統(tǒng)的容量,提升性能。
當(dāng)然,分布式文件系統(tǒng)與網(wǎng)絡(luò)文件系統(tǒng)也有很多相同的地方。比如,分布式文件系統(tǒng)也分為客戶端的文件系統(tǒng)和服務(wù)端的服務(wù)程序。同時,由于客戶端與服務(wù)端分離,分布式文件系統(tǒng)也要實現(xiàn)網(wǎng)絡(luò)文件系統(tǒng)中類似 RPC 的協(xié)議。
另外,分布式文件系統(tǒng)由于其數(shù)據(jù)被存儲在多個節(jié)點上,因此還有其他特點。包括但不限于以下幾點。
支持按照既定策略在多個節(jié)點上放置數(shù)據(jù)。
可以保證在出現(xiàn)硬件故障時,仍然可以訪問數(shù)據(jù)。
可以保證在出現(xiàn)硬件故障時,不丟失數(shù)據(jù)。
可以在硬件故障恢復(fù)時,保證數(shù)據(jù)的同步。
可以保證多個節(jié)點訪問的數(shù)據(jù)一致性。
由于分布式文件系統(tǒng)需要客戶端與多個服務(wù)端交互,并且需要實現(xiàn)服務(wù)端的容錯,通常來說,分布式文件系統(tǒng)都會實現(xiàn)私有協(xié)議,而不是使用 NFS 等通用協(xié)議。
03
常見分布式文件系統(tǒng)
分布式文件系統(tǒng)的具體實現(xiàn)方法有很多,其實早在互聯(lián)網(wǎng)興盛之前就有一些分布式文件系統(tǒng),如 Lustre 等。早期分布式文件系統(tǒng)更多應(yīng)用在超算領(lǐng)域。
隨著互聯(lián)網(wǎng)技術(shù)的發(fā)展,特別是谷歌的 GFS 論文的發(fā)表,分布式文件系統(tǒng)又得到進一步的發(fā)展。目前,很多分布式文件系統(tǒng)是參考谷歌發(fā)布的關(guān)于 GFS 的論文實現(xiàn)的。比如,大數(shù)據(jù)領(lǐng)域中的 HDFS 及一些開源的分布式文件系統(tǒng) FastDFS 和CephFS 等。
在開源分布式文件系統(tǒng)方面,比較知名的項目有大數(shù)據(jù)領(lǐng)域的 HDFS 和通用的CephFS 和 GlusterFS 等。這幾個開源項目在實際生產(chǎn)中使用得相對比較多一些。接下來將對常見的分布式文件系統(tǒng)進行簡要的介紹。
GFS
GFS 是谷歌的一個分布式文件系統(tǒng),該分布式文件系統(tǒng)因論文 The Google File System廣為世人所知。GFS 并沒有實現(xiàn)標準的文件接口,也就是其實現(xiàn)的接口并不與 POSIX 兼容。但包含創(chuàng)建、刪除、打開、關(guān)閉和讀/寫等基本接口。
GFS 集群節(jié)點包括兩個基本角色:一個是 master,該角色的節(jié)點負責(zé)文件系統(tǒng)級元數(shù)據(jù)管理;另一個是 chunkserver,該角色的節(jié)點通常有很多個,用于存儲實際的數(shù)據(jù)。GFS 對于文件的管理是在 master 完成的,而數(shù)據(jù)的實際讀/寫則可以直接與 chunkserver 交互,避免 master 成為性能瓶頸。
GFS 在實現(xiàn)時做了很多假設(shè),如硬件為普通商用服務(wù)器、文件大小在數(shù)百兆甚至更大及負載以順序大塊讀者為主等。其中,對于文件大小的假設(shè)尤為重要。基于該假設(shè),GFS 默認將文件切割為 64MB 大小的邏輯塊(chunk),每個 chunk 生成一個 64 位的句柄,由 master 進行管理。
這里需要重點強調(diào)的是,每個 chunk 生命周期和定位是由 master 管理的,但是chunk 的數(shù)據(jù)則是存儲在 chunkserver 的。正是這種架構(gòu),當(dāng)客戶端獲得 chunk 的位置和訪問權(quán)限后可以直接與 chunkserver 交互,而不需要 master 參與,進而避免了master 成為瓶頸。
下圖所示為 GFS 架構(gòu)示意圖。
除了 GFS,還有很多類似架構(gòu)的分布式文件系統(tǒng)。比如,在大數(shù)據(jù)領(lǐng)域中的HDFS,它是專用于 Hadoop 大數(shù)據(jù)存儲的分布式文件系統(tǒng)。其架構(gòu)與 GFS 的架構(gòu)類似,包含一個用于管理元數(shù)據(jù)的節(jié)點和多個存儲數(shù)據(jù)的節(jié)點,分別為 namenode和datanode。
HDFS 主要用來進行大文件的處理,它將文件按照固定大小切割,然后存儲到數(shù)據(jù)節(jié)點。同時為了保證數(shù)據(jù)的可靠性,這些數(shù)據(jù)被放到多個不同的數(shù)據(jù)節(jié)點。文件被切割的大小和同時放置數(shù)據(jù)節(jié)點的數(shù)量(副本數(shù))是可配置的。
雖然 HDFS 是針對大文件設(shè)計的,但是也可以處理小文件。只不過對于小于切割單元的文件不進行切割。另外,HDFS 對小文件也做了一些優(yōu)化,如 HAR 和SequenceFile 等方案,但 HDFS 終究不是特意為小文件設(shè)計的,因此在性能方面還有些欠缺。
除此之外,還有很多模仿 GFS 的開源分布式文件系統(tǒng),如 FastDFS、MooseFS和 BFS 等。但大多數(shù)開源項目只實現(xiàn)了文件系統(tǒng)最基本的語義,嚴格來說不能稱為分布式文件系統(tǒng),更像是對象存儲。
CephFS
有必要單獨介紹一下 CephFS 的原因是 CephFS 不僅實現(xiàn)了文件系統(tǒng)的所有語義,而且實現(xiàn)了元數(shù)據(jù)服務(wù)的多活橫向擴展。
CephFS 的架構(gòu)與 GFS 的架構(gòu)沒有太大差別,其突出的特點是在架構(gòu)方面將GFS 的單活 master 節(jié)點擴展為多活節(jié)點。不僅可以元數(shù)據(jù)多活,而且可以根據(jù)元數(shù)據(jù)節(jié)點的負載情況實現(xiàn)負載的動態(tài)均衡。這樣,CephFS 不僅可以通過增加節(jié)點來實現(xiàn)元數(shù)據(jù)的橫向擴展,還可以調(diào)整節(jié)點負載,最大限度地使用各個節(jié)點的 CPU資源。
同時,CephFS 實現(xiàn)了對 POSIX 語言的兼容,在客戶端完成了內(nèi)核態(tài)和用戶態(tài)兩個文件系統(tǒng)實現(xiàn)。當(dāng)用戶掛載 CephFS 后,使用該文件系統(tǒng)可以與使用本地文件系統(tǒng)一樣方便。
GlusterFS
GlusterFS 是一個非常有歷史的分布式文件系統(tǒng),其最大的特點是沒有中心節(jié)點。也就是 GlusterFS 并沒有一個專門的元數(shù)據(jù)節(jié)點來管理整個文件系統(tǒng)的元數(shù)據(jù)。
GlusterFS 抽象出卷(Volume)的概念,需要注意的是,這里的卷與 Linux LVM中的卷并非同一個概念。這里的卷是對文件系統(tǒng)的一個抽象,表示一個文件系統(tǒng)實例。當(dāng)我們在集群端創(chuàng)建一個卷時,其實是創(chuàng)建了一個文件系統(tǒng)實例。
GlusterFS 有多種不同類型的卷,如副本卷、條帶卷和分布式卷等。正是通過這些卷特性的組合,GlusterFS 實現(xiàn)了數(shù)據(jù)可靠性和橫向擴展的能力。
原文標題:從文件系統(tǒng)到分布式文件系統(tǒng)
文章出處:【微信公眾號:strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
-
接口
+關(guān)注
關(guān)注
33文章
8598瀏覽量
151152 -
存儲
+關(guān)注
關(guān)注
13文章
4314瀏覽量
85846 -
文件系統(tǒng)
+關(guān)注
關(guān)注
0文章
284瀏覽量
19911
原文標題:從文件系統(tǒng)到分布式文件系統(tǒng)
文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論