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。

關於CRUSH的詳細介紹,可以參考論文:CRUSH: Controlled, Scalable, Decentralized Placement of Replicated Data

二、HDFS放置策略

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

  • 數據安全:在某個節點發生故障時,不會丟失數據備份;
  • 網絡傳輸開銷:在備份數據同步過程中,盡量減少網絡傳輸中的帶寬開銷;

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

上圖展示了HDFS中Namenode和Datanode的角色,Namenode中存儲了所有數據備份的位置信息。

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

   

     轉自 http://blog.csdn.net/yangning5850/article/details/9256737

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM