RAID-Node

RAID Node 調研

1.    簡介

分佈式文件系統主要用於解決海量數據存儲的問題,如Goolge、Facebook等大型互聯網企業都使用分佈式文件系統作爲數據存儲的基礎設施,並在其上構建很多服務,分佈式文件系統通常採用三副本的策略來保證數據的可靠性,但隨着應用數據量的不斷膨脹,三副本策略爲可靠性犧牲的存儲空間也越來越大,如何在不降低數據可靠性的基礎上,進一步降低存儲空間成本? Facebook將erasure code應用到內部HDFS集羣中,該方案使用erasure code代替傳統的三副本策略,在保持集羣可用性不變的情況下,節省了數PB的存儲空間,Facebook的實現方案(HDFS RAID)目前已貢獻給開源社區。

HDFS RAID的工作源自Facebook。首先,看看HDFS RAID的作者之一Dhruba Borthakur在2009年發表的博文的一部分。

HDFS的主要不足之一是每份數據要複製在三個地方,當今,磁盤存儲越來越便宜,這是可以接受的,相對於小型或中型規模的機羣,這並不是一個問題。使用15塊磁盤和10塊磁盤的價格差距並不大。假設每GB數據的成本爲$1,那麼15塊1TB磁盤和10塊1TB磁盤的價格差只是$5k。但如果機羣的總數據量是10PB的話,那麼將數據存儲在兩個地方而不是三個,節省的成本是$10,000,000!

上述是在2009年的數據,如今磁盤存儲的成本已不到¥1/GB了。

HDFS使用3副本是因爲它使用商用機器以及磁盤有不可忽略的出現故障的機率。據觀測,在實踐中使用3副本已經足以保證不丟失數據。現在的挑戰是要保持真實的副本數接近2而有效副本數是3。Erasure Codes是最好的實現方案。

作者的想法參考自CMU的DiskReduce,這是一種在HDFS實現erasure codes的方法。HDFS的代碼本身就比較複雜,爲了不使其變得更加複雜,作者將HDFS Erasure Coding作爲HDFS之上的一個軟件層,而不是HDFS中的一部分。

2.    概況

HDFS RAID模塊提供一個使用Hadoop分佈式系統(DFS)的分佈式Raid文件系統(DRFS),在DRFS中存儲的文件被分成多個由塊組成的stripe。對於每個stripe,若干parity(校驗)塊存儲在與源文件對應的parity文件中。這使得當源文件或parity文件中的塊丟失或損壞進可以重新計算並恢復成爲可能。

DRFS的主要好處是增加針對數據損壞的保護,有了這樣的保護,可以採用更低的副本數來保持同樣的可用性保障,將會節省很大的存儲空間。

架構與實現

DRFS總體架構(Distributed Raid File System)


Raid是Hadoop mapreduce的一個contrib,Hadoop 0.21.0以上版本就有。

HDFS Raid包含幾個軟件模塊:

  1. DRFS client:爲應用提供訪問DRFS中文件的接口,當在讀文件時能透明地恢復任意損壞或丟失的塊;
  2. RaidNode:爲存儲在DRFS的所有數據文件創建和維護parity文件的後臺進程;
  3. BlockFixer:週期性重新計算已經丟失或損壞的塊;
  4. Raidshell:允許管理員手動觸發丟失或損壞的塊的重新計算或檢查已遭受不可恢復損壞的文件;
  5. ErasureCode:提供對塊中字節的編碼及解碼。

1)    DRFS client

DRFS client作爲DFS client之上的一軟件層,攔截所有進來的請求並傳它們傳遞給下邊的客戶端。當下邊的DFS拋出ChecksumException或BlockMissingException異常,DFS client捕獲這些異常,定位當前source文件的parity文件,並在返回丟失的塊給應用前將它們重新計算。

值得注意的是,DRFS client在讀到損壞的文件重新計算丟失的塊時,並不會將這些丟失的塊存到文件系統中,它在完成應用的請求後將其忽略。BlockFixer和RaidShell能用來永遠地修改損壞的塊。

2)    RaidNode

RaidNode定期掃描配置指定的所有路徑,對於每個路徑,遞歸地檢查所有擁有超過2個塊的文件並選擇那些最近(默認是24小時內)沒被修改過的文件。一旦選擇了一個source文件,它會遍歷該文件的所有stripe併爲每個stripe創建合適數量的parity塊,最後所有的parity塊會被合併在一起並存儲在與source文件相關的parity文件。RaidNode也會定期刪除那些已經孤立或過時的parity文件。

當前RaidNode有兩種實現:

LocalRaidNode:在RaidNode本地計算parity塊,因爲計算parity塊是一個計算密集型任務,所以這種方法的可擴展性受到限制;

DistributedRaidNode:分配MapReduce任務來計算parity塊。

3)    BlockFixer

BlockFixer是一個運行在RaidNode上的一個後臺進程,週期性地檢查DRFS配置的所有路徑的狀態。當發現一個有丟失或損壞塊時,這些塊會被重新計算並放回文件系統中。

從Namenode獲得損壞文件列表,source文件通過“解碼”來重新構造,parity文件通過“編碼”來重新構造。

當前BlockFixer有兩種實現:

LocalBlockFixer:在RaidNode本地重新計算損壞的塊;

DistBlockFixer:分配MapReduce任務來重新計算塊。

4)    RaidShell

RaidShell是一個允許管理維護和檢查DRFS的工具,支持手動觸發重新計算壞數據塊的命令,允許管理查看不可修復文件列表。

運行以下命令可以檢驗文件系統的完整性:

$HADOOP_HOME/bin/hadoop org.apache.hadoop.raid.RaidShell -fsck [path]

這會打印已損壞文件列表。

5)    ErasureCode

ErasureCode是被BlockFixer和RaiNode用來生成parity塊和修改parity/source塊的一組件,ErasureCode實現編碼和解碼。當在編碼時,ErasureCode取幾個source字節並生成一些parity字節。當在解碼時,ErasureCode通過剩餘的souce字節和parity字節來生成丟失的字節。

能被恢復的丟失的字節的個數等於被創建的parity字節的個數。比如,我們把10個source字節編碼成3個parity字節,我們能通過剩下的10個字節來恢復任意3個丟失的字節。

ErasureCode有兩種實現:

  1. XOR:只允許創建一個parity字節;
  2. Reed-Solomon:允許創建任意給定數目的parity字節。

使用Reed-Solomon,source文件的副本數能減少到1而不造成數據丟失。1個塊只有1個副本的不足是隻能通過1個固定的機器來讀取1個塊,減少了並行性。因此,Reed-Solomon應該用在不會被頻繁使用的數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章