分布式文件系統(tǒng)很多,包括GFS,HDFS,HDFS基本可以認為是GFS的一個簡化版實現(xiàn),二者因此有很多相似之處。
首先,GFS和HDFS都采用單一主控機+多臺工作機的模式,由一臺主控機(Master)存儲系統(tǒng)全部元數(shù)據(jù),并實現(xiàn)數(shù)據(jù)的分布、復制、備份決策,主控機還實現(xiàn)了元數(shù)據(jù)的checkpoint和操作日志記錄及回放功能。
工作機存儲數(shù)據(jù),并根據(jù)主控機的指令進行數(shù)據(jù)存儲、數(shù)據(jù)遷移和數(shù)據(jù)計算等。
其次,GFS和HDFS都通過數(shù)據(jù)分塊和復制(多副本,一般是3)來提供更高的可靠性和更高的性能。
當其中一個副本不可用時,系統(tǒng)都提供副本自動復制功能。
同時,針對數(shù)據(jù)讀多于寫的特點,讀服務被分配到多個副本所在機器,提供了系統(tǒng)的整體性能。
最后,GFS和HDFS都提供了一個樹結(jié)構(gòu)的文件系統(tǒng),實現(xiàn)了類似與Linux下的文件復制、改名、移動、創(chuàng)建、刪除操作以及簡單的權(quán)限管理等。
然而,GFS和HDFS在關(guān)鍵點的設計上差異很大,HDFS為了規(guī)避GFS的復雜度進行了很多簡化。
首先,GFS最為復雜的部分是對多客戶端并發(fā)追加同一個文件,即多客戶端并發(fā)Append模型 。
GFS允許文件被多次或者多個客戶端同時打開以追加數(shù)據(jù),以記錄為單位。
假設GFS追加記錄的大小為16KB ~ 16MB之間,平均大小為1MB,如果每次追加都訪問GFS Master顯然很低效,因此,GFS通過Lease機制將每個Chunk的寫權(quán)限授權(quán)給Chunk Server。
寫Lease的含義是Chunk Server對某個Chunk在Lease有效期內(nèi)(假設為12s)有寫權(quán)限,擁有Lease的Chunk Server稱為Primary Chunk Server,如果Primary Chunk Server宕機,Lease有效期過后Chunk的寫Lease可以分配給其它Chunk Server。
多客戶端并發(fā)追加同一個文件導致Chunk Server需要對記錄進行定序,客戶端的寫操作失敗后可能重試,從而產(chǎn)生重復記錄,再加上客戶端API為異步模型,又產(chǎn)生了記錄亂序問題。
Append模型下重復記錄、亂序等問題加上Lease機制,尤其是同一個Chunk的Lease可能在Chunk Server之間遷移,極大地提高了系統(tǒng)設計和一致性模型的復雜度。
而在HDFS中,HDFS文件只允許一次打開并追加數(shù)據(jù),客戶端先把所有數(shù)據(jù)寫入本地的臨時文件中,等到數(shù)據(jù)量達到一個Chunk的大小(通常為64MB),請求HDFS Master分配工作機及Chunk編號,將一個Chunk的數(shù)據(jù)一次性寫入HDFS文件。
由于累積64MB數(shù)據(jù)才進行實際寫HDFS系統(tǒng),對HDFS Master造成的壓力不大,不需要類似GFS中的將寫Lease授權(quán)給工作機的機制,且沒有了重復記錄和亂序的問題,大大地簡化了系統(tǒng)的設計。
然而,我們必須知道,HDFS由于不支持Append模型帶來的很多問題,構(gòu)建于HDFS之上的Hypertable和HBase需要使用HDFS存放表格系統(tǒng)的操作日志,由于HDFS的客戶端需要攢到64MB數(shù)據(jù)才一次性寫入到HDFS中,Hypertable和HBase中的表格服務節(jié)點(對應于Bigtable中的Tablet Server)如果宕機,部分操作日志沒有寫入到HDFS,可能會丟數(shù)據(jù)。
其次是Master單點失效的處理 。
GFS中采用主從模式備份Master的系統(tǒng)元數(shù)據(jù),當主Master失效時,可以通過分布式選舉備機接替主Master繼續(xù)對外提供服務,而由于Replication及主備切換本身有一定的復雜性,HDFS Master的持久化數(shù)據(jù)只寫入到本機(可能寫入多份存放到Master機器的多個磁盤中防止某個磁盤損害),出現(xiàn)故障時需要人工介入。
另外一點是對快照的支持 。
GFS通過內(nèi)部采用copy-on-write的數(shù)據(jù)結(jié)構(gòu)實現(xiàn)集群快照功能,而HDFS不提供快照功能。
在大規(guī)模分布式系統(tǒng)中,程序有bug是很正常的情況,雖然大多數(shù)情況下可以修復bug,不過很難通過補償操作將系統(tǒng)數(shù)據(jù)恢復到一致的狀態(tài),往往需要底層系統(tǒng)提供快照功能,將系統(tǒng)恢復到最近的某個一致狀態(tài)。
總之,HDFS基本可以認為是GFS的簡化版,由于時間及應用場景等各方面的原因?qū)FS的功能做了一定的簡化,大大降低了復雜度。