分佈式架構之「 數據分佈」

<center>用心做系列化,拒絕碎片性文章</center>

markdown

上一篇文章中提到爲什麼需要<font color=red>分佈式</font>,它解決了單機的計算能力不足(大規模計算)、存儲容量不足(大規模存儲)、吞吐量低(高流量)、延遲時間長(低延遲)、併發量小(高併發)這些問題。

解決了問題,同時又引入如何進行<font color=red>數據分佈</font>的問題。這裏的”數據”指請求流量、會話數據、存儲的數據、計算、調度策略等等。分佈式的本質是每臺機器負責原問題的一個子集,它是一個典型的分而治之(分 合)思維的體現。

<font color=red>集羣</font>中每臺機器乾的事情是一樣的,分佈式中每臺機器做的事情是不一樣的。下面開始介紹本文的主角分佈式架構之「 數據分佈」。

<h3><font color=green>數據分佈方式</font></h3>

1、普通哈希

它的另一種叫法是取模。將它想象爲一個大哈希表,每類機器就是一個桶,把數據哈希值分散到各個桶。

哈希函數散列性決定了數據分佈的均勻性。不記錄元數據信息,只需知道計算方式和模的機器總數。

擴展性低,集羣規模變動全部數據都要遷移並重新分佈。

集羣規模成倍擴容按照數據重新哈希,原數據只遷移一半到另外一臺機器上。

應用:Mola(https://developer.baidu.com/p...、Armor(分佈式Key-Value系統)、Big Pipe(百度的消息傳輸系統)

2、按數據範圍

從全局看數據類似一個B樹,每個具體的服務器都是葉子節點,元數據服務器是中間節點。將數據按特徵值的值域範圍劃分爲不同的區間,使得集羣中每臺(組)服務器處理不同區間的數據,比如按照ID的值域範圍分。

利用動態劃分區間技術,每個區間數據量儘量一樣多。相比哈希方式非常靈活,集羣擴容時,隨意添加機器,不限爲倍增方式,只需將原機器上的部分數據分區遷移到新加入的機器上就可以完成機器擴容。

需要專門的元信息服務器來維護數據分佈信息大規模集羣,元信息會很大,元數據服務器較爲容易成爲瓶頸。還會存在某個區間的數據很大出現傾斜問題。

某區間數據量較大將該區間分裂拆爲兩個區間,保證每個區間的數據在一個固定閾值下。

應用:Big Table(https://cloud.google.com/bigt...、Hbase(https://hbase.apache.org/)、PNUTS(https://timyang.net/architect...

3、按數據量

它與哈希方式和按數據範圍方式不同,按數據量分佈數據與具體的<font color=red>數據特徵</font>無關,將數據視爲一個順序增長的文件,將這個文件按照某個較爲固定的大小劃分爲若干數據庫(chunk),不同的數據分佈到不同的服務器。也是需要記錄數據塊的具體分佈情況,將分佈信息作爲元數據使用元數據服務器管理。

一般是沒有數據傾斜的問題,數據總數被均勻的切分並分佈到集羣中,當集羣需要重新負載均衡時,只需要遷移數據塊就可以。集羣擴容擴容也沒有太大的限制,只需將部分數據塊遷移到新加入的機器上就可以完成擴容。

缺點是需要管理複雜的元信息,高效的管理元信息會成爲新的問題。

應用:GFS(https://pdos.csail.mit.edu/6....、HDFS(https://hadoop.apache.org/doc...

4、一致性哈希

最初在P2P網絡中作爲分佈式哈希表(DHT)的常用數據分佈算法。使用一個哈希函數計算數據或數據特徵的哈希值,令哈希函數的輸出值域爲一個封閉的環,將節點隨機分佈在這個環上,每個節點負責處理從自己開始順時針到下一個節點的全部哈希值域上的數據。

普通哈希分佈式數據集羣擴容時很複雜,往往需要倍增節點個數,一致性哈希可以任意動態添加、刪除節點,每一個節點僅影響一致性哈希環上相鄰的節點。節點的位置信息只和集羣中機器規模相關,它的元信息的量通常比按照數據範圍和按數據量分佈的元信息量要小很多。

缺點是很難均勻的分佈哈希值域,即使原先的分佈均勻也很難保證後續的繼續均勻,會出現某個節點異常時,該節點的全部壓力轉移到相鄰的一個節點,出現多米諾骨牌效應。

引入虛擬節點的概念改進算法,系統初始時就創建許多虛擬節點,虛擬節點的個數一般遠大於未來集羣中機器的個數,將虛擬節點均勻分佈到一致性哈希值域環上。爲每個節點分片若干虛擬節點。操作數據時,首先通過數據的哈希值在環上找到對應的虛節點,進而查找元數據找到對應的真實節點。一旦某個節點不可用,該節點的多個虛擬節點不可用。

應用:Dynamo(https://aws.amazon.com/cn/dyn...、Cassandra(http://cassandra.apache.org/)

除了上面講到的四種數據分佈方式,還有哈希槽方式,還有組合的方式:比如應用Doris(http://doris.incubator.apache...

<h3><font color=green>副本中數據分佈方式</font></h3>

分佈式系統的容錯、提高可用性的基本手段就是使用副本。對於數據副本的分佈方式主要影響系統的可擴展性。下面我們講兩種基本的數據副本的分佈方式。

一種基本的數據副本策略是<font color=red>以機器爲單位</font>,若干機器互爲副本,副本機器之間的數據完全相同。這種策略適用於上述各種數據分佈方式。優點是簡單,缺點是恢復副本數據時效率不高、可擴展性也不高。

markdown

場景:假設有3個副本機器,某時刻其中某臺機器<font color=red>磁盤損壞</font>,丟失了全部數據,此時使用新的機器替代故障機器,爲了是讓新的機器也可以提供服務,怎麼從正常的兩臺機器上拷貝數據?

方案一:將一臺可用的副本機器下線,專門作爲數據源拷貝數據,缺點是造成實際正常工作的副本只有一個,對數據安全性造成巨大隱患,如果服務由於分佈式協議設計或壓力的要求必須2個副本才能正常工作,則該做法完全不可行。

方案二:以較低的資源使用限速的方式從兩個正常副本上拷貝數據,此方法不停服務,但是可以選擇服務壓力較小的時間段進行。缺點就是速度很慢,如果數據量巨大(數T),限速較小(1MB/s),往往需要數天才能夠完成恢復。

小結:副本策略是以機器爲單位,這種方式不利於提高系統擴展性。不利於系統容錯,理想情況下,有N臺機器,宕機一臺後,該臺機器的壓力可以均勻分散到剩下的N-1臺機器上,每臺機器的壓力僅增加1/N-1,但是有可能直接超過單臺的處理能力。

<hr/>

更合適的做法不是以機器作爲副本單位,而是將數據拆分爲較合理的數據段,<font color=red>以數據段爲單位</font>做副本。控制每個數據段的大小盡量相等且控制在一定大小以內。數據段有很多稱謂,segment、fragment、chunk、partition。使得副本與機器不再硬相關,每臺機器都可以負責一定的數據段副本(o、p、q爲數據段)。

markdown

一旦副本分佈與機器無關,數據丟失後恢復效率會非常高。一旦某臺機器的數據丟失,其上數據段的副本將分佈在整個集羣的所有機器中,而不僅僅在幾個副本機器中,從而整個集羣同步拷貝恢復數據,集羣中每臺數據源機器都可以非常低的資源做拷貝,比如作爲恢復數據源的機器都限速1MB/s,有100臺機器參與恢復,恢復速度達到100MB/s。也利於集羣容錯、集羣擴展。假設集羣規模爲N臺機器,當加入一臺新機器時,只需要從各臺機器上遷移1/N - 1/1/N +1比例的數據段到新機器即實現了新的負載均衡,是從機器中各機器遷移數據,與數據恢復同理,效率也很高。

工程中,完全按照數據段建立副本會引起需要管理的元數據的開銷增大,副本維護的難度也增大。一種折中的做法是將某些數據段組成一個數據段分組,將數據段分組爲粒度進行副本管理。這樣做刻意將副本粒度控制在一個合適的範圍內。

<h3><font color=green>本地化計算</font></h3>

上面提到的都是數據分佈方式,容易被理解爲分佈方式僅僅作用於數據存儲。分佈式除了解決大規模存儲問題更需要解決大規模計算問題。計算離不開數據,計算的規模往往與輸入的數據量或計算產生的中間結果的數據量正相關。分佈式架構中,數據的分佈方式也可以<font color=red>作用於計算中</font>。

分佈式架構中的計算節點和保存計算數據的存儲節點可以在同一臺物理機器上,也可以位於不同的物理機器。如果計算節點和存儲節點位於不同的物理機器則計算的數據需要通過<font color=red>網絡傳輸</font>,這種方式的開銷很大,網絡帶寬會成爲架構中的總體瓶頸。

”<font color=red>移動數據不如移動計算</font>”,這種思路就是:把計算儘量調度到與存儲節點在同一臺物理機器上的計算節點上進行,這種稱爲本地化計算。<font color=red>本地化計算</font>是計算調度的一種重要優化,這是一種重要的<font color=red>分佈式調度</font>思想。

<h3><font color=green>數據分佈方式的選擇</font></h3>

在實際的工程實踐中,可以根據需求以及實施複雜度合理選擇數據分佈方式。上述的數據分佈方式如果可以靈活組合使用,往往可以兼備各種方式的優點,收到較好的綜合效果。

場景:怎麼解決分佈式中<font color=red>數據傾斜</font>問題?

假設初始的策略使用的是普通哈希,它不需要維護元數據信息。但是可能存在數據傾斜,在此策略基礎之上引入按數據量分佈數據的方式,解決數據傾斜問題。按照用戶ID的哈希值分數據,如果某個用戶ID的數據量特別大時,統計用戶的數據量,並按某一閾值將用戶的數據切分爲多個均勻的數據段,將這些數據段分佈到集羣中去。大部分用戶的數據量不會超過閾值,元數據中僅僅保存超過閾值的用戶的數據段分佈信息。這種普通哈希分佈數據方式與按數據量分佈式數據方式組合使用的方案,在某真實系統中取得了較好的效果。

參考資料:《分佈式系統原理介紹》作者:劉傑

<center>想升職加薪?掃描下面的二維碼關注我</center>
markdown

推薦閱讀:

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