對於分布式檔案系統來說,為了保證資料的高可用性和系統容錯能力,往往會把同一資料塊在多個節點上進行備份,那麼如何分配這些複製資料的位置,不同的檔案系統會有不同的策略。
在介紹hdfs之前,先簡單了解一些其它檔案系統的放置策略:
對於不同的資料備份,需要放到不同的節點上面,一種直觀的想法就是利用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儲存前乙個相鄰區域即可。
一致性雜湊環很好地解決了資料分配與集群擴充套件的問題,但是它還有乙個效能的瓶頸,那就是需要乙個中心節點負責儲存整個集群的元資料資訊,對新增的資料進行分配,在使用者查詢時提供資料分布的位置。這些工作處理的效能直接影響整個系統的處理速度,而且可能還會帶來spof。一種可行的辦法是對這些中心節點進行備份,或者乾脆用乙個分布式hash表代替乙個中心節點,雖然能夠避免spof,但是隨之而來的又是資訊同步和一致性維護等問題。
上圖簡單說明了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而言,由namenode負責這個集群的資料備份和分配,在分配過程中,主要考慮下面兩個因素:
這兩個因素看起來是有些相互矛盾的:想要保證資料安全,那麼就盡量把資料備份到多台節點上,但是就需要向多個節點傳輸資料;想要減少網路傳輸開銷,那麼就盡可能把資料備份到乙個節點內部或者乙個機架內部,因為系統內部的資料傳輸速度會遠大於網路傳輸的速度。
上圖展示了hdfs中namenode和datanode的角色,namenode中儲存了所有資料備份的位置資訊。
上圖展示了hdfs中的rack(機架)概念,乙個rack內部資料傳輸速度遠大於rack之間的傳輸。對於每個資料備份,比如a要放在rack1中,在寫入hdfs時首先會在rack1中建立乙個備份,同時在另乙個rack2中也建立乙個備份。這樣做在一定程度上兼顧了資料安全和網路傳輸的開銷。
hadoop學習筆記(HDFS)
hdfs的設計基礎與目標 1 硬體錯誤是常態,因此需要冗餘。2 為大資料而生,流式讀寫,批量讀取而非隨機讀寫。擅長資料分析而不是事務處理。3 大規模資料集。4 一次寫多次讀邏輯設計,即一旦寫入,只能讀,不能修改。5 程式才用 資料就近 原則分配節點執行。hdfs的可靠性 冗餘副本策略 機架策略 心跳...
hadoop學習 HDFS詳細學習
1 hdfs概念 hadoop distributed file system,簡稱hdfs,是乙個分布式檔案系統。hdfs是高容錯性的,可以部署在低成本的硬體之上,hdfs提供高吞吐量地對應用程式資料訪問,它適合大資料集的應用程式。2 hdfs 設計目標 hdfs不適合做什麼 儲存小檔案 大量隨機...
Hadoop學習 HDFS資料儲存和刪除
hdfs中的資料都是分塊儲存的,預設塊大小為64m,這個值可以從hdfs配置檔案中更改dfs.blocksize。這樣分快處理的好處是可以增加讀取資料的吞吐量,因為可以同時從讀取檔案的不同分塊。在客戶端想hdfs寫資料的過程中,主要分為下面幾個過程 客戶端將資料快取到本地的乙個臨時檔案中 當這個本地...