複製鏈接
請複製以下鏈接發送給好友

分佈式文件系統

鎖定
分佈式文件系統(Distributed File System,DFS)是指文件系統管理的物理存儲資源不一定直接連接在本地節點上,而是通過計算機網絡與節點(可簡單的理解為一台計算機)相連;或是若干不同的邏輯磁盤分區或卷標組合在一起而形成的完整的有層次的文件系統。DFS為分佈在網絡上任意位置的資源提供一個邏輯上的樹形文件系統結構,從而使用户訪問分佈在網絡上的共享文件更加簡便。單獨的 DFS共享文件夾的作用是相對於通過網絡上的其他共享文件夾的訪問點 [1] 
中文名
分佈式文件系統
外文名
Distributed File System
類    別
文件系統 [2] 
有關術語
拓撲分佈式文件系統 [1] 
邏輯結構
樹形文件系統結構 [1] 
特    點
共享 [2] 

分佈式文件系統簡介

計算機通過文件系統管理、存儲數據,而信息爆炸時代中人們可以獲取的數據成指數倍的增長,單純通過增加硬盤個數來擴展計算機文件系統的存儲容量的方式,在容量大小、容量增長速度、數據備份、數據安全等方面的表現都差強人意。分佈式文件系統可以有效解決數據的存儲和管理難題:將固定於某個地點的某個文件系統,擴展到任意多個地點/多個文件系統,眾多的節點組成一個文件系統網絡。每個節點可以分佈在不同的地點,通過網絡進行節點間的通信和數據傳輸。人們在使用分佈式文件系統時,無需關心數據是存儲在哪個節點上、或者是從哪個節點從獲取的,只需要像使用本地文件系統一樣管理和存儲文件系統中的數據。分佈式文件系統是建立在客户機/服務器技術基礎之上的,一個或多個文件服務器與客户機文件系統協同操作,這樣客户機就能夠訪問由服務器管理的文件。 [2]  分佈式文件系統的發展大體上經歷子三個階段:第一階段是網絡文件系統,第二階段是共享SAN文件系統,第三階段是面向對象的並行文件系統 [3] 
分佈式文件系統把大量數據分散到不同的節點上存儲,大大減小了數據丟失的風險。分佈式文件系統具有冗餘性,部分節點的故障並不影響整體的正常運行,而且即使出現故障的計算機存儲的數據已經損壞,也可以由其它節點將損壞的數據恢復出來。因此,安全性是分佈式文件系統最主要的特徵。分佈式文件系統通過網絡將大量零散的計算機連接在一起,形成一個巨大的計算機集羣,使各主機均可以充分發揮其價值。此外,集羣之外的計算機只需要經過簡單的配置就可以加入到分佈式文件系統中,具有極強的可擴展能力。 [3] 

分佈式文件系統系統分類

分佈式文件系統網絡文件系統

飛客數據恢復中心提供 飛客數據恢復中心提供
(NFS) 最早由Sun微系統公司作為TCP/IP網上的文件共享系統開發。Sun公司估計大約有超過310萬個系統在運行NFS,大到大型計算機、小至PC機,其中至少有80%的系統是非Sun平台。 [4] 

分佈式文件系統Andrew系統

AFS是一種分佈式的文件系統用來共享與獲得在計算機網絡中存放的文件。AFS使得用户獲得網絡文件就像本地機器般方便。AFS文件系統被稱為“分佈式”是因為文件可以分散地存放在很多不同的機器上,但這些文件對於用户而言是可及的,用户可以通過一定的方式得到這些文件 [5] 

分佈式文件系統KASS系統

KASS File System(簡稱KFS)是開始軟件自主研發基於JAVA的純分佈式文件系統,功能類似於DFS、GFS、Hadoop,通過HTTP WEB為企業的各種信息系統提供底層文件存儲及訪問服務,搭建企業私有云存儲服務平台 [6] 

分佈式文件系統DFS系統

DFS是AFS的一個版本,作為開放軟件基金會(OSF)的分佈
分佈式文件系統 分佈式文件系統
式計算環境DCE中的文件系統部分 [7] 
如果文件的訪問僅限於一個用户,那麼分佈式文件系統就很容易實現。可惜的是,在許多網絡環境中這種限制是不現實的,必須採取併發控制來實現文件的多用户訪問,表現為如下幾個形式 [7] 
只讀共享 任何客户機只能訪問文件,而不能修改它,這實現起來很簡單。 [7] 
受控寫操作 採用這種方法,可有多個用户打開一個文件,但只有一個用户進行寫修改。而該用户所作的修改並不一定出現在其它已打開此文件的用户的屏幕上。 [7] 
併發寫操作 這種方法允許多個用户同時讀寫一個文件。但這需要操作系統作大量的監控工作以防止文件重寫,並保證用户能夠看到最新信息。這種方法即使實現得很好,許多環境中的處理要求和網絡通信量也可能使它變得不可接受 [7] 

分佈式文件系統NFS和AFS的區別

NFS和AFS的區別在於對併發寫操作的處理方法上。當一個客户機向服務器請求一個文件(或數據庫記錄),文件被放在客户工作站的高速緩存中,若另一個用户也請求同一文件,則它也會被放入那個客户工作站的高速緩存中。當兩個客户都對文件進行修改時,從技術上而言就存在着該文件的三個版本(每個客户機一個,再加上服務器上的一個)。有兩種方法可以在這些版本之間保持同步 [8] 
無狀態系統:在這個系統中,服務器並不保存其客户機正在緩存的文件的信息。因此,客户機必須協同服務器定期檢查是否有其他客户改變了自己正在緩存的文件。這種方法在大的環境中會產生額外的LAN通信開銷,但對小型LAN來説,這是一種令人滿意的方法。NFS就是個無狀態系統 [8] 
回呼(Callback)系統:在這種方法中,服務器記錄它的那些客户機的所作所為,並保留它們正在緩存的文件信息。服務器在一個客户機改變了一個文件時使用一種叫回叫應答(callbackpromise)的技術通知其它客户機。這種方法減少了大量網絡通信。AFS(及OSFDCE的DFS)就是回叫系統。客户機改變文件時,持有這些文件拷貝的其它客户機就被回叫並通知這些改變 [8] 
無狀態操作在運行性能上有其長處,但AFS通過保證不會被回叫應答充斥也達到了這一點。方法是在一定時間後取消回叫。客户機檢查回叫應答中的時間期限以保證回叫應答是當前有效的。回叫應答的另一個有趣的特徵是向用户保證了文件的當前有效性。換句話説,若一個被緩存的文件有一個回叫應答,則客户機就認為文件是當前有效的,除非服務器呼叫指出服務器上的該文件已改變了 [8] 

分佈式文件系統網絡文件系統

網絡文件系統(Network File System,NFS)是個分佈式的客户機/服務器文件系統。NFS的實質在於用户間計算機的共享。用户可以聯結到共享計算機並像訪問本地硬盤一樣訪問共享計算機上的文件。管理員可以建立遠程系統上文件的訪問,以至於用户感覺不到他們是在訪問遠程文件。NFS是個到處可用和廣泛實現的開放式系統 [4] 

分佈式文件系統NFS設計目標

允許用户象訪問本地文件一樣訪問其他系統上的文件。提供對無盤工作站的支持以降低網絡開銷 [4] 
簡化應用程序對遠程文件的訪問使得不需要因訪問這些文件而調用特殊的過程 [4] 
使用一次一個服務請求以使系統能從已崩潰的服務器或工作站上恢復。 [4] 
採用安全措施保護文件免遭偷竊與破壞。 [4] 
使NFS協議可移植和簡單,以便它們能在許多不同計算機上實現,包括低檔的PC機 [4] 
大型計算機小型計算機文件服務器運行NFS時,都為多個用户提供了一個文件存儲區。工作站只需要運行TCP/IP協議來訪問這些系統和位於NFS存儲區內的文件。工作站上的NFS通常由TCP/IP軟件支持。對DOS用户,一個遠程NFS文件存儲區看起來是另一個磁盤驅動器盤符。對Macintosh用户,遠程NFS文件存儲區就是一個圖標 [4] 

分佈式文件系統NFS部分功能

服務器目錄共享 服務器廣播或通知正在共享的目錄,一個共享目錄通常叫做出版或出口目錄。有關共享目錄和誰可訪問它們的信息放在一個文件中,由操作系統啓動時讀取。 [4] 
客户機訪問 在共享目錄上建立一種鏈接和訪問文件的過程叫做裝聯(mounting),用户將網絡用作一條通信鏈路來訪問遠程文件系統。 [4] 
NFS的一個重要組成是虛擬文件系統(VFS),它是應用程序與低層文件系統間的接口 [4] 

分佈式文件系統VAFS服務器

AFS是專門為在大型分佈式環境中提供可靠的文件服務而設計的。它通過基於單元的結構生成一種可管理的分佈式環境。一個單元是某個獨立區域中文件服務器和客户機系統的集合,這個獨立區域由特定的機構管理。通常代表一個組織的計算資源。用户可以和同一單元中其他用户方便地共享信息,他們也可以和其他單元內的用户共享信息,這取決於那些單元中的機構所授予的訪問權限 [5] 
文件服務器進程 這個進程響應客户工作站對文件服務的請求,維護目錄結構,監控文件和目錄狀態信息,檢查用户的訪問。 [5] 
基本監察(BOS)服務器進程 這個進程運行於有BOS設定的服務器。它監控和管理運行其他服務的進程並可自動重啓服務器進程,而不需人工幫助 [5] 
卷宗服務器進程 此進程處理與卷宗有關的文件系統操作,如卷宗生成、移動、複製、備份和恢復 [5] 
卷宗定位服務器進程 該進程提供了對文件卷宗的位置透明性。即使卷宗被移動了,用户也能訪問它而不需要知道卷宗移動了 [5] 
鑑別服務器進程 此進程通過授權和相互鑑別提供網絡安全性。用一個“鑑別服務器”維護一個存有口令和加密密鑰的鑑別數據庫,此係統是基於Kerberos的 [5] 
保護服務器進程 此進程基於一個保護數據庫中的訪問信息,使用户和組獲得對文件服務的訪問權 [5] 
更新服務器進程 此進程將AFS的更新和任何配置文件傳播到所有AFS服務器 [5] 
AFS還配有一套用於差錯處理,系統備份和AFS分佈式文件系統管理的實用工具程序。例如,SCOUT定期探查和收集AFS文件服務器的信息。信息在給定格式的屏幕上提供給管理員。設置多種閾值向管理者報告一些將發生的問題,如磁盤空間將用完等。另一個工具是USS,可創建基於帶有字段常量模板的用户帳户。Ubik提供數據庫複製和同步服務。一個複製的數據庫是一個其信息放於多個位置的系統以便於本地用户更方便地訪問這些數據信息。同步機制保證所有數據庫的信息是一致的 [5] 

分佈式文件系統分佈式文件系統 KFS

一個 KFS 集羣包括單個元數據服務器節點和多個Chunk 服務器節點,並由多個客户端來訪問。其中元數據服務器主要用於維護元數據並負責控制垃圾回收、負載均衡等系統活動,Chunk 服務器負責保存數據以及接收處理數據I/O 請求。這兩類節點均運行 Linux 操作系統,需要分別安裝、運行 KFS 提供的元數據服務器和 Chunk 服務器軟件。客户端需要安裝專門的 KFS 客户端庫,由應用程序鏈接使用來訪問 KFS 文件系統。KFS 的所有節點都均採用 X86 架構硬件,並通過以太網方式連接在一起,節點之間採用 TCP協議通訊,使得整個系統具有較高的性價比。 [6] 
Chunk 服務器
在KFS中,一個文件被分割成多個Chunk,每個Chunk大小固定為 64MB,所以可以通過簡單的模運算計算出某文件偏移量在該文件第幾個Chunk 的多少偏移量上。每個Chunk 由一個全局唯一的 Chunk 號來標識。Chunk 服務器主要的功能就是保存 Chunk,並對外提供創建、刪除、讀寫Chunk 的訪問接口。一個 Chunk 默認被複製成3份,保存在3個不同的 Chunk 服務器中,客户端可以為每個文件指定不同的副本個數。三副本就保證了在兩個 Chunk 服務器故障的情況下,仍能從第三個 Chunk 服務器上的副本讀出數據,提高了系統的可靠性。在 Chunk 數據寫入時,若某個 Chunk 服務器突然故障,會導致的相應副本更新失敗,進而影響 Chunk 各副本數據的一致性。為了解決這個問題,KFS為每個 Chunk 副本分配一個版本號,副本每被更新一次則版本號上升,這樣就可以通過比較版本號來發現過期的副本。Chunk 服務器中,單個 Chunk 由一個文件來表示,這些Chunk 文件被保存在本地的文件系統中,文件系統可以是XFS、Ext3/4 等。每個 Chunk 文件除了保存數據外,其頭部還保存了 16KB 大小的校驗和信息:寫數據時,為每個64K數據塊計算一個32 位校驗和(Adler-32 算法),保存至 Chunk文件頭部;讀數據時,首先驗證讀出數據的校驗和,這就保證了本地磁盤保存數據時可能發生的數據損壞可以被檢查出來。 [6] 
Chunk 文件在本地文件系統的文件名命名規則為:文件號.Chunk 號.版本號。Chunk 服務器啓動時通過掃描存放Chunk 文件的目錄,就可獲知自己擁有哪些 Chunk,然後把該信息提交給元數據服務器。元數據服務器在驗證 Chunk信息後,會告知 Chunk 服務器哪些 Chunk 已經過期(版本號過期或屬於已被刪除的文件),Chunk 服務器便可以刪除這些 Chunk。 [6] 
在 KFS 中,一個文件系統的所有元數據由單個元數據服務器統一管理,這一做法雖然影響了系統的可擴展性,但極大簡化了系統的設計。元數據包括了 [6] 
(1) 目錄項信息:KFS 採用傳統的目錄結構命名空間,目錄樹中的所有節點(文件和目錄),均由一個全局唯一的文件號來標識,根目錄的文件號固定為 2,目錄項信息指的是目錄樹中各目錄所包含的各目錄項(可以是子目錄或文件)的名稱及文件 ID [6] 
(2) 屬性信息:各目錄、文件的創建、修改時間,及文件的副本數、大小 [6] 
(3) Chunk 信息:一個文件依次由哪些 Chunk 組成的; [6] 
(4) 位置信息:Chunk 的各個副本的被保存在哪個Chunk服務器上; [6] 
(5) 租約信息:KFS 採用租約來維持多個客户端情況下數據的一致性,這些租約信息由元數據服務器統一管理 [6] 
客户端
KFS 的客户端庫向應用程序開發者提供了 create、read、write、mkdir、rmdir 等類似 POSIX 語義的編程接口,支持的編程語言有 C++、Python、Java。客户端庫通過與元數據服務器及 Chunk 服務器交互,完成對文件系統中文件的修改、訪問等操作。此外,客户端還支持 FUSE(File system in Userspace),使得傳統文件系統工具(如 ls 命令)也可以訪問 KFS 文件系統,提高了系統的互操作性。 [6] 
為了減少與元數據服務器的交互次數,客户端會緩存元數據信息。此外,KFS 的客户端還會對讀取、寫入的數據進行緩存,這就存在緩存一致性的問題,KFS 採用讀寫租約(Lease)解決了這個問題,所有的租約由元數據服務器統一管理,每個租約有 300 秒的時限,過期作廢。讀寫租約的具體方式是: [6] 
(1) 寫租約:當需要向 Chunk 寫入數據時,對應的主Chunk 服務器首先查看是否擁有該 Chunk 的寫租約,如果沒有或已過期則嘗試向元數據服務器獲取或更新寫租約,如果該 Chunk 正在被複制到其他 Chunk 服務器或者已經分配寫租約或讀租約,則返回失敗,否則返回成功並且 Chunk 的版本號增一; [6] 
(2) 讀租約:在客户端需要讀取某個Chunk的數據時,它首先嚐試去獲取這個 Chunk 的讀租約,如果該 Chunk 沒有分配寫租約而且數據已全部寫入磁盤,則返回成功,否則返回失敗。讀寫租約保證了一個 Chunk 同時只能由一個客户端寫入,而且一個或多個客户端在讀取某 Chunk 數據時,該Chunk 數據不會被修改,這樣客户端就能夠把讀取的數據緩存在本地,因為緩存中的數據與 Chunk 服務器上保存的數據一定是一致的。 [6] 

分佈式文件系統分佈式系統負載均衡策略

在分佈式系統中通常有數量巨大的服務器節點,由於客户端在訪問服務器節點的時候具有隨機性,這就必然會導致部分主機在某些時刻成為熱點,對整個分佈式系統的性能產生了制約。與此同時,部分服務器節點的負載卻遠遠沒有達到額定值,從而造成資源浪費。顯然,在分佈式文件系統中進行負載均衡控制是十分必要的。在軟件工程中,網站訪問流量的分配、數據庫訪問的重定向等都是負載均衡應用的典型場景。通過負載均衡技術的應用,可以實現分佈式系統中所有節點的負載相對平衡,既保證了系統的性能,又充分利用了資源。負載均衡意味着節點之間需要進行數據遷移,因此負載均衡本身需要有一定的開銷,所以通常要求負載均衡算法具有較高的效率 [3] 
分佈式文件系統是以數據服務器為核心的存儲系統,根據數據服務器在形式上是否具有中心節點,一般將其分為集中式和非集中式兩大類拓撲結構,其中前者是以某台服務器作為中心節點進行分佈式組網,而後者則不需要中心節點服務器。之所以要這樣區分,是因為中心節點的存在與否,對負載均衡策略的制定有重要影響。 [3] 

分佈式文件系統集中式拓撲系統的負載均衡

對於集中式的分佈式文件系統,其中心節點就是對數據分發起到主要控制作用的節點,又稱為主控節點。在現有的分佈式文件存儲系統中,GFS和HDFS就是最典型的有中心節點分佈式文件系統,下面以HDFS為例進行分析。HDFS採用了機架分配機制實現分佈式存儲和負載的平衡,其主要實現思路如下 [3] 
(1)用户向集羣提交數據塊,系統在接收到數據後,按照預告設定的副本參數(默認為3)複製出若干副本; [3] 
(2)按照定義好的機架分配策略,把剛才生成的各個副本逐一分發到集羣中 [3] 
(3)對於默認3個副本的情況,按照機架分配規則,其中兩個需要放置於同一個機架上,但這兩個副本分別處於該機架的不同節點上,另外一個副本則要求單獨置於另一個機架上 [3] 
(4)啓動一個定時任務,通過Name Node節點定時掃描所有節點,統計出整體負載分佈情況 [3] 
(5)將集羣當前負載狀態與預設的閾值進行對比,並根據對比的結果對各節點的負載情況進行調整,從而實現負載均衡 [3] 
不難看出,這種負載均衡策略不僅可以保證數據的安全,還保證了數據的可用性,在系統的可靠性和讀寫性能上也有很大的優勢。通過該策略,可以實現各節點的負載動態平衡。但這種策略也並非十全十美,在整個集羣進行大規模橫向擴展時,將對Name Node節點的性能提出巨大的挑戰,因此對於後期需要大規模擴展的系統而言是有一定的侷限性的。 [3] 

分佈式文件系統非集中式拓撲系統的負載均衡

與集中式的分佈式文件系統不同,非集中式的分佈式文件系統不存在一個用於分配數據的主控節點,集羣中的每個節點都是相互平行的。P2P網絡就是一種典型的無中心節點分佈式文件系統,因此又被稱為對等網絡。網絡中的任意一個節點都具有同等的作用,可以向其它節點發起連接。其負載均衡策略如下 [3] 
(1) 用户向集羣提交數據塊,系統在接收到數據後,採用分佈式哈希表(DHT)來決定這些數據會被保存到哪個節點。根據哈希算法的特徵,數據在分發後實際上就已經實現了初步的負載平衡; [3] 
(2)然而,隨着系 統運行時間的不斷增加,各節點的負載會慢慢失衡,導致負載向某些節點集中,從而出現高負載節點和低負載節點。每個節點都會定時計算自己的負載狀態,如果發現自己是低負載節點,則開始對網絡中的所有節點進行掃描; [3] 
(3)如果發現某節點是高負載節點,則立即停止通信遍歷,啓動數據遷移,部分數據由高負載節點轉移到低負載節點,實現兩個節點之間的負載均衡 [3] 
(4)為了避免節點掃描和數據重複遷移帶來的額外開銷,也可以在多個節點中進行數據遷移。首先由高負載節點對其它節點進行遍歷,如果某節點是低負載節點,就把它放到一個隊列中 [3] 
(5)當隊列數量達到一定數量,或者所有節點已經遍歷完成時,對隊列中的節點按照負載的高低進行排序 [3] 
(6)取出負載最低的節點,對其進行數據遷移,完成一輪負載平衡,如此反覆進行,實現集羣的動態負載平衡。Napster是最早的P2P系統之一,但它有一個索引服務器,本質上還不是真正的P2P系統,不適合大型網絡應用。基於Gnutella的網絡拋棄了索引服務器,實現了所有機器的對等關係,但又帶來了較大的帶寬消耗 [3]  。Tapestry,Pastry,Chord和CAN等基於DHT的網絡的出現,系統的可擴展性和精確發現性。為了改善DHT系統在維護機制上的複雜性,當前廣泛採用KaZaa等P2P文件共享系統,軟件,通過超級結點的引入,解決了傳統分佈式網絡的諸多問題 [3] 

分佈式文件系統有關術語

DFS拓撲(DFS topology):一個分佈式文件系統的整體邏輯層次,包括DFS管理控制枱及其中的元素,如根目錄共享和副本集。 [1] 
DFS根(DFS root):在DFS拓撲的最頂層共享,它是組成整個的DFS共享文件的開始點。DFS根能為基於域的操作系統在域一級定義。基於域的DFS可在域中有多個根,但在一個服務器上只能有一個根 [1] 
根副本(root replica):服務器複製一個DFS根,以提供更好的有效性。保存DFS根的服務器承擔為共享文件夾向客户分發引用的任務。如果服務器不可用,並且創建有根副本,則可以通過根副本所在服務器訪問DFS空間。 [1] 
DFS鏈接(DF Slink):DFS拓撲的一部分,是組成DFS空間的具體的內容。它形成一個到一個或者一個到多個共享目錄的連接。它通過把一個DNS名映射到目標共享文件夾的標準UNC來實現。 [1] 
複製策略(replication policy):域DFS的鏈接建立後,就可以為其創建副本。為了使原文件和副本之間保持同步,需要配置複製策略。基於域的DFS根目錄或者子目錄都支持複製。一個獨立的DFS不支持複製 [1] 
參考資料