分佈式系統的數據分佈方式

哈希方式

常見哈希方式:(用戶id) % (機器(組)數)=  分配到0~(機器(組)數-1)上

優點:只要哈希函數的散列特性較好,哈希方式可以較爲均勻的將數據分佈到集羣中去。

缺點:

①可擴展性不高,一旦集羣規模需要擴展,則幾乎所有的數據需要被遷移並重新分佈。

②一旦某數據特徵值的數據嚴重不均,容易出現“數據傾斜”(data skew)問題。

解決方式:

①擴展哈希分佈的數據系統時,要成倍的擴展,按照數據重新計算哈希,這樣原本一臺機器上的數據只需遷移一半到另一臺對應的機器上即可完成擴展。

②將對應關係作爲元數據,由專門的元數據服務器管理。將哈希值取模的值大於機器的數量,這樣同一臺機器上需要負責多個哈希取模的餘數。在集羣擴容時,將部分餘數分配到新加的機器並遷移對應的數據到新機器上。

③重新選擇需要哈希的數據特徵

按數據範圍分佈

將數據按特徵值的值域範圍劃分爲不同的區間,使得集羣中每臺(組)服務器處理不同區間的數據。

常見分佈方式:已知某系統中用戶 id 的值域範圍是[1,100),集羣有 3 臺服務器,使用按數據範圍劃分數據的數據分佈方式。將用戶 id 的值域分爲三個區間[1, 33),[33, 90),[90, 100)分別由 3 臺服務器負責處理。

優點:

可以靈活的根據數據量的具體情況拆分原有數據區間,拆分後的數據區間可以遷移到其他機器,當需要集羣完成負載均衡時,與哈希方式相比非常靈活。另外,當集羣需要擴容時,可以隨意添加機器,而不限爲倍增的方式,只需將原機器上的部分數據分區遷移到新加入的機器上就可以完成集羣擴容。

缺點:

①也會出現“數據傾斜”(data skew)問題。例:某個數據的用戶量大

②需要維護較爲複雜的元信息。隨着集羣規模的增長,元數據服務器較爲容易成爲瓶頸,從而需要較多的元數據服務器解決這個問題。

解決方式:

工程中,爲了數據遷移等負載均衡操作的方便,往往利用動態劃分區間的技術,使得每個區間中服務的數據量儘量的一樣多。當某個區間的數據量較大時,通過將區間“分裂”的方式拆分爲兩個區間,使得每個數據區間中的數據量都儘量維持一個較爲固定的閾值之下。

按數據量分佈

數據量分佈數據與具體的數據特徵無關,而是將數據視爲一個順序增長的文件,並將這個文件按照某一較爲固定的大小劃分爲若干數據塊(chunk),不同的數據塊分佈到不同的服務器上。

優點:一般沒有數據傾斜的問題

當集羣需要重新負載均衡時,只需通過遷移數據塊即可完成。

集羣擴容,只需將部分數據庫遷移到新加入的機器上即可以完成擴容。

缺點:需要管理較爲複雜的元信息,高效的管理元信息成爲新的課題。

一致性哈希

一致性哈希的基本方式是使用一個哈希函數計算數據或數據特徵的哈希值,令該哈希函數的輸出值域爲一個封閉的環,即哈希函數輸出的最大值是最小值的前序。將節點隨機分佈到這個環上,每個節點負責處理從自己開始順時針至下一個節點的全部哈希值域上的數據。

優點:可以任意動態添加、刪除節點,每次添加、刪除一個節點僅影響一致性哈希環上相鄰的節點。

缺點:隨機分佈節點的方式使得很難均勻的分佈哈希值域,尤其在動態增加節點後,即使原先的分佈均勻也很難保證繼續均勻,由此帶來的另一個較爲嚴重的缺點是,當一個節點異常時,該節點的壓力全部轉移到相鄰的一個節點,當加入一個新節點時只能爲一個相鄰節點分攤壓力。

改進算法:引入虛節點(virtual node)的概念,系統初始時就創建許多虛節點,虛節點的個數一般遠大於未來集羣中機器的個數,將虛節點均勻分佈到一致性哈希值域環上,其功能與基本一致性哈希算法中的節點相同。爲每個節點分配若干虛節點。操作數據時,首先通過數據的哈希值在環上找到對應的虛節點,進而查找元數據找到對應的真實節點。

副本與數據分佈

分佈式系統容錯、提高可用性的基本手段就是使用副本。一種基本的數據副本策略是以機器爲單位,若干機器互爲副本,副本機器之間的數據完全相同。

優點:非常簡單

缺點:恢復數據的效率不高、可擴展性也不高。

注:副本之間的數據完全相同,1、2、3互爲副本   4、5、6互爲副本   7、8、9互爲副本

如果其中1臺機器出現故障,爲了不影響服務需要新機器從剩下的2臺上拷貝數據。
①如果全盤拷貝相當消耗資源,如果將一臺可用的副本下線專門拷貝,那麼此時正常的副本數只有一個,會有巨大的安全隱患。
②如果用限速的方法從2個副本上拷貝數據,恢復的時間又很長
③不利於提高擴展性,如果只增加2臺機器,因爲2臺機器無法組成新的副本組,則無法擴容。相當於加了66%的機器卻擴容失敗
(此處並非無法擴容,可以擴容只不過承擔的風險會比較大,同時2臺機器的壓力會增加,如果有1臺宕機那麼只有一臺可以提供服務)

④不利於系統容錯,加個有3個副本,1臺宕機後剩下2臺的壓力將增大50%

更合適的做法不是以機器作爲副本單位,而是將數據拆爲較合理的數據段,以數據段爲單位作爲副本

數據段的選擇:

①哈希:每個哈希分桶後的餘數可以作爲一個數據段,爲了控制數據段的大小,常常使得分桶個數大於集羣規模。

②按數據範圍分佈:將每個數據區間作爲一個數據段,並控制數據區間中數據的大小。

③按數據量分數據:按照每個數據塊作爲數據段。

④一致性哈希:將一致性哈希環分爲若干等長分區,分區個數一般遠大於節點個數,假設哈希函數均勻,則每個分區中的數據可以作爲一個數據段。

此種方式的優點:
①這種方式使副本分佈與機器無關,副本丟失後的恢復效率非常高,如果機器1宕機,那可以從集羣中剩下的所有機器上同時拷貝恢復數據(即使限速也會很快,因爲機器多啊)
②利於集羣容錯,宕機機器上的副本分散於整個集羣,壓力分散到整個集羣自然就小了
③利於集羣擴展,加入一臺新機器的時候只需要從各機器上遷移1/n比例的數據段到新機器就可以實現新的負載均衡。

本地化計算

對於分佈式系統而言,除了解決大規模存儲問題更需要解決大規模的計算問題。

如果計算節點和存儲節點位於不同的物理機器則計算的數據需要通過網絡傳輸,此種方式的開銷很大,甚至網絡帶寬會成爲系統的總體瓶頸。另一種思路是,將計算儘量調度到與存儲節點在同一臺物理機器上的計算節點上進行,這稱之爲本地化計算。本地化計算是計算調度的一種重要優化,其體現了一種重要的分佈式調度思想:“移動數據不如移動計算”。

數據分佈方式的選擇

數據傾斜問題:在按哈希分數據的基礎上引入按數據量分佈數據的方式,解決該數據傾斜問題。

按用戶 id 的哈希值分數據,當某個用戶 id 的數據量特別大時,該用戶的數據始終落在某一臺機器上。此時,引入按數據量分佈數據的方式,統計用戶的數據量,並按某一閾值將用戶的數據切爲多個均勻的數據段,將這些數據段分佈到集羣中去。由於大部分用戶的數據量不會超過閾值,所以元數據中僅僅保存超過閾值的用戶的數據段分佈信息,從而可以控制元數據的規模。

常見分佈式系統的數據分佈方式系統

GFS & HDFS 按數據量分佈

Map reduce 按 GFS 的數據分佈做本地化

Big Table & HBase 按數據範圍分佈

PNUTS 哈希方式/按數據範圍分佈(可選)

Dynamo & Cassandra 一致性哈希

Mola & Armor  哈希方式

Big Pipe  哈希方式

Doris 哈希方式與按數據量分佈組合

 

 

 

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

如有錯誤歡迎指正!

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