1. 程式人生 > >Hadoop學習——HDFS資料備份與放置策略

Hadoop學習——HDFS資料備份與放置策略

[-]

對於分散式檔案系統來說,為了保證資料的高可用性和系統容錯能力,往往會把同一資料塊在多個節點上進行備份,那麼如何分配這些複製資料的位置,不同的檔案系統會有不同的策略。

一、業界分析

在介紹HDFS之前,先簡單瞭解一些其它檔案系統的放置策略:

1. Lustre——一致性雜湊環

對於不同的資料備份,需要放到不同的節點上面,一種直觀的想法就是利用Hash函式,這樣可以把每個備份id對應到一個雜湊值,然後再將這個雜湊值與某個節點對應起來,就完成了一個數據備份的分配。這樣做在時間複雜度上只有O(1),所以是極好的。但是很多雜湊函式有一個問題,就是不穩定。這裡所謂的不穩定是指,當節點個數發生變化的時候,原來被分配到節點K上的資料備份可能就會被分配到另一個節點上。舉個例子,常用的雜湊函式為:hash(x) = x % N,其中N為節點個數,x為備份id,這樣當叢集中節點出現故障或者擴充套件新的節點時,原來的計算的雜湊值幾乎全都變了,那麼對於整個系統中的資料訪問來說,無疑是一個災難,因為訪問位置全都得改變,並且需要重新遷移資料。

那麼有沒有可能在N變化的侯,原有資料備份的雜湊值不改變呢?這就是一致性雜湊的優勢所在。

一致性雜湊的原理可以這麼理解:原來雜湊是用x%N,現在是用x%S且N%S,這裡的S表示雜湊函式本身可以表示的雜湊值範圍,比如它的範圍是0~2^32 - 1,那麼S=2^32。見下圖:


如果按照圖1這種分配方式,一旦出現Data Nodes個數變化的情況,原來的分配位置幾乎都得改變(例如使用取模的雜湊函式);


圖2展示的方式,如果選取的雜湊函式取值範圍在0到2^32 - 1之間(Hash Range),那麼我們可以同時把Data Blocks和Data Nodes同時雜湊到這個範圍裡面,這些Nodes會把Hash Range劃分為若干區域,規定每個Node儲存與其相鄰的前一個區域中的Blocks,從而完成資料的分配。這種方式的好處在於,即使出現Data Nodes數量變化的情況,也不會影響其它Nodes和Blocls的位置情況,最多是在被刪除節點或者新增節點的附近進行調整,比如將原有區域中的Blocks進一步劃分或者合併。


細心的讀者可能會發現,圖2展示的方式中,三個Nodes將Hash Range分為了4個區域,顯然不方便分配,所以提出一致性雜湊環的概念,即將Hash Range的首位相連,然後在一個環路上面進行劃分,N個Nodes一定能夠劃分出N個區域,然後讓每個Node儲存前一個相鄰區域即可。

2. Ceph——CRUSH

一致性雜湊環很好地解決了資料分配與叢集擴充套件的問題,但是它還有一個性能的瓶頸,那就是需要一箇中心節點負責儲存整個叢集的元資料資訊,對新增的資料進行分配,在使用者查詢時提供資料分佈的位置。這些工作處理的效能直接影響整個系統的處理速度,而且可能還會帶來SPoF。一種可行的辦法是對這些中心節點進行備份,或者乾脆用一個分散式Hash表代替一箇中心節點,雖然能夠避免SPoF,但是隨之而來的又是資訊同步和一致性維護等問題。

在上一篇文章中我們簡單瞭解了Ceph,它是一種基於物件儲存的分散式檔案系統,最大的特點就是由可以自我管理的OSD構成,這些OSD不需要依賴某個中心節點的管理,它們可以自己完成資料的分配、複製、容錯、故障恢復等功能,可以理解為一種P2P的結構,而CRUSH演算法就是使它具有以上特性的關鍵環節。


上圖簡單說明了Ceph資料放置的過程,對於需要儲存的物件,首先雜湊到Place Group,然後再通過CRUSH演算法找到需要存放資料的具體OSD。CRUSH在執行過程中還是需要一些全域性資訊的,這些資訊在被稱作分層叢集對映(Hierarchical Cluster Map),這些資訊主要是用來描述叢集的組成和搭建,它們存放在一些monitors的節點上面。對於每個Storage Client和OSD而言,它們可以利用Hierarchical Cluster Map、放置規則等資訊計算資料的位置。相比與原來中心節點的策略,CRUSH的計算負擔分發給了每個OSD。

二、HDFS放置策略

對於HDFS而言,由Namenode負責這個叢集的資料備份和分配,在分配過程中,主要考慮下面兩個因素:

  • 資料安全:在某個節點發生故障時,不會丟失資料備份;
  • 網路傳輸開銷:在備份資料同步過程中,儘量減少網路傳輸中的頻寬開銷;

這兩個因素看起來是有些相互矛盾的:想要保證資料安全,那麼就儘量把資料備份到多臺節點上,但是就需要向多個節點傳輸資料;想要減少網路傳輸開銷,那麼就儘可能把資料備份到一個節點內部或者一個機架內部,因為系統內部的資料傳輸速度會遠大於網路傳輸的速度。


上圖展示了HDFS中Namenode和Datanode的角色,Namenode中儲存了所有資料備份的位置資訊。

上圖展示了HDFS中的rack(機架)概念,一個rack內部資料傳輸速度遠大於rack之間的傳輸。對於每個資料備份,比如A要放在Rack1中,在寫入HDFS時首先會在Rack1中建立一個備份,同時在另一個Rack2中也建立一個備份。這樣做在一定程度上兼顧了資料安全和網路傳輸的開銷。