分布式雜湊和一致性雜湊演算法

2022-04-03 04:01:49 字數 4243 閱讀 6311

目錄

1、資料分布

2、雜湊方式

3、一致性雜湊方式

筆記來自分布式原理一書,供個人學習。

單機系統與分布式系統的最大的區別在於問題的規模,即計算、儲存的資料量的區別。將乙個單機問題使用分布式解決,首先要解決的就是如何將問題拆解為可以使用多機分布式解決,使得

分布式系統中的每台機器負責原問題的乙個子集。由於無論是計算還是儲存,其問題輸入物件都是資料,所以如何拆解分布式系統的輸入資料成為分布式系統的基本問題,我們稱這樣的資料拆解為資料分布方式。

雜湊方式是最常見的資料分布方式,其方法是按照資料的某一特徵計算雜湊值,並將雜湊值與機器中的機器建立對映關係,從而將不同雜湊值的資料分布到不同的機器上。所謂資料特徵可以是

key-value 系統中的 key,也可以是其他與應用業務邏輯相關的值。例如,一種常見的雜湊方式是按資料屬於的使用者 id 計算雜湊值,集群中的伺服器按0到機器數減 1 編號,雜湊值除以伺服器的個數,結果的餘數作為處理該資料的伺服器編號。工程中,往往需要考慮伺服器的副本冗餘,將每數台(例如 3)伺服器組成一組,用雜湊值除以總的組數,其餘數為伺服器組的編號。圖 2-1 給出了雜湊方式分資料的乙個例子,將資料按雜湊值分配到 4 個節點上。

雜湊方式特點

1.每個節點只計算一部分資料;每個節點只儲存一部分資料。

我們假設節點的數量沒有變化(實際上不可能),那麼同乙個使用者的資料會被同乙個節點計算和儲存。

2.任何節點只需要知道雜湊函式的計算方式及模的伺服器總數就可以計算出處理具體資料的機器是哪台。

雜湊方式只需要知道兩個關鍵:1.以什麼作為雜湊計算的特徵值;2.節點數量(節點數量,因為節點數量是動態的,必需有保活機制,服務發現等)。就可以計算這個資料由哪個節點處理。

缺點

1.擴充套件性:一旦節點數量發生變化,則幾乎所有的資料需要被遷移並重新分布。

分布式系統中,節點的新增和刪除、或者宕機等是很普遍的情況,當節點數量發生變化,同乙個id的資料會由不同的節點處理。

2.「資料傾斜」(dataskew)問題:一旦某資料特徵值的資料嚴重不均。

如果某使用者的資料量過大,該使用者的資料始終由某一台節點處理。假如該使用者的資料量超過了單台伺服器處理能力的上限,則該使用者的資料不能被處理。

問題解決

關於擴充套件性:

1.擴充套件雜湊分布資料的系統時,往往使得集群規模成倍擴充套件,按照資料重新計算雜湊,這樣原本一台機器上的資料只需遷移一半到另一台對應的機器上即可完成擴充套件。

2.還有一種思路是不再簡單的將雜湊值與機器做除法取模對映,而是將對應關係作為元資料由專門的元資料伺服器管理。訪問資料時,首先計算雜湊值並查詢元資料伺服器,獲得該雜湊值對應的機器。缺點是需要以較複雜的機制維護大量的元資料,但是元資料中雜湊值和對應的機器的值不是固定的,所以可以做負載均衡。

關於資料傾斜問題:

1.一種極端的思路是,使用資料的全部而不是某些維度的特徵計算雜湊,這樣資料將被完全打散在集群中。然而實踐中有時並不這樣做,這是因為這樣做使得每個資料之間的關聯性完全消失,乙個使用者id的資料可能分布到任何一台機器處理。只適用於資料之間沒有聯絡。

一致性雜湊(consistent hashing)是另乙個種在工程中使用較為廣泛的資料分布方式。一致性雜湊最初在 p2p 網路中作為分布式雜湊表(dht)的常用資料分布演算法。一致性雜湊的基本方式是使用乙個雜湊函式計算資料或資料特徵的雜湊值,令該雜湊函式的輸出值域為乙個封閉的環,即雜湊函式輸出的最大值是最小值的前序。將節點隨機分布到這個環上,每個節點負責處理從自己開始順時針至下乙個節點的全部雜湊值域上的資料。

一致性雜湊方式特點

前面雜湊分布資料的方式在集群擴容時非常複雜,往往需要倍增節點個數,與此相比,一致性雜湊的優點在於可以任意動態新增、刪除節點,每次新增、刪除乙個節點僅影響一致性雜湊環上相鄰的節點。

缺點:

1.隨機分布節點的方式使得很難均勻的分布雜湊值域,尤其在動態增加節點後,即使原先的分布均勻也很難保證繼續均勻

2.當乙個節點異常時,該節點的壓力全部轉移到相鄰的乙個節點,當加入乙個新節點時只能為乙個相鄰節點分攤壓力。

問題解決:

關於分布不均勻與負載均衡:

系統初始時就建立許多虛節點,

虛節點的個數一般遠大於未來集群中機器的個數,將虛節點均勻分布到一致性雜湊值域環上,其功能與基本一致性雜湊演算法中的節點相同。為每個節點分配若干虛節點。運算元據時,首先通過資料的雜湊值在環上找到對應的虛節點,進而查詢元資料找到對應的真實節點。使用虛節點改進有多個優點。首先,一旦某個節點不可用,該節點將使得多個虛節點不可用,從而使得多個相鄰的真實節點負載失效節點的壓裡。同理,一旦加入乙個新節點,可以分配多個虛節點,從而使得新節點可以負載多個原有節點的壓力,從全域性看,較容易實現擴容時的負載均衡。

以下**:

一致性雜湊演算法:

一致性雜湊也只是提出四個概念和原則:

1、balance:雜湊結果盡可能的平均分散到各個節點上,使得每個節點都能得到充分利用。

2、monotonicity:上面也說了,如果是用雜湊演算法,節點變更會使得整個網路的對映關係更改。如果是carp,會使得1/n的對映關係更改。一致性雜湊的目標,是節點變更,不會改變網路的對映關係。

3、spread:同乙份資料,儲存到不同的節點上,換言之就是系統冗餘。一致性雜湊致力於降低系統冗度。

chord演算法:

一致性雜湊有多種實現演算法,最關鍵的問題在於如何定義資料分割策略和節點快速查詢。

chord算是最為經典的實現。cassandra中的dht,基本是chord的簡化版。

網路中每個節點分配乙個唯一id,可以通過機器的mac位址做sha1,是網路發現的基礎。

假設整個網路有n 個節點,並且網路是呈環狀。兩個節點間的距離定義為每個節點會儲存一張路由表(finger表),表內順時針按照離本節點2、4、8、16、32.……2i的距離選定log2n個其他節點的ip資訊來記錄。

儲存方面:資料被按一定規則切割,每乙份資料也有乙個獨立id(查詢key),並且和節點id的值域是一樣的。然後查詢節點,如果存在和資料id一樣的節點id,則將這份資料存在該節點上;如果不存在,則儲存到離該資料id距離最近的節點上。同時,為了保證數 據的可靠性,會順時針往下找k個冗餘節點,儲存這份資料。一般認為k=3是必須的。

查詢方面:先從自己的路由表中,找乙個和資料id距離最近、並且存活在網路中的節點next。如果該節點的 id巧合和資料id相等,那麼恭喜你。如果不相等,則到next進行遞迴查詢。一般或需要經過多次查詢才能找到資料所在的節點,而這個次數是可以被證明小 於等於log2n的。

在這個查詢的過程中就體現了路由表的選取優勢了,其實是實現了乙個二分查詢,從每個節點來觀察網路,都是將網路分成了log2n塊,最大一塊裡面有n/2個節點。路由表裡面其實是記錄了每一塊的第乙個節點。這樣每一次查詢,最少排除了一半的節點。保證在 log2n次內找到目標節點。

新增乙個節點i,需要預先知道網路中已經存活的乙個節點j,然後通過和節點j互動,更新自己和其他節點的路由表。並且,需要將離自己距離最近的節點中的資料copy過來,以提供資料服務。

損失乙個節點,路由演算法會自動跳過這個節點,並且依靠資料的冗餘來持續提供服務。

kad演算法(kademlia)

kad演算法其實是在chord上做的優化。主要是兩個點:

1、用二進位制(32/64/128)表示乙個節點的id,兩節點的id異或運算得到節點間的距離。

2、 每個節點保持的路由資訊更豐富,同樣是將整個網路按照劃分成log2n份,在chord中,是保持log2n個路由節點,但在kad裡面,是儲存了 log2n個佇列。每個佇列長度為配置值k,記錄網路中對應節點區域的多個節點,並且根據活躍時間對這些節點進行換入換出。

第一點是方便進行網路劃分,節點按照二進位制中每一bit的0或1建成一棵二叉樹。

第二點是使得節點查詢更迅速。從分割情況我們就可以得知,最壞情況不會差於chord,但儲存更多的節點使得命中概率更高。另外佇列中根據活躍時間進行換入換出,更有利於在p2p這種節點變更頻繁的網路中快速找到有效的節點。

關於kad的介紹,這篇文章講的比較詳細wenku.baidu.com/view/ee91580216fc700abb68fcae.html

分布式 一致性雜湊演算法

一致性雜湊演算法,作為分布式計算的資料分配參考,比傳統的取模,劃段都好很多 傳統雜湊取模,在資料需要遷移時代價巨大,因此需要優化。一致性雜湊 將雜湊值看作乙個環,順時針將雜湊值接近節點的物件存到對應節點,通過這種演算法做資料分布,在增減節點的時候,可以大大減少資料的遷移規模。此時,可能會出現乙個問題...

一致性Hash演算法 分布式雜湊

一致性雜湊演算法在1997年由麻省理工學院提出的一種分布式雜湊 dht 實現演算法,設計目標是為了解決網際網路中的熱點 hot spot 問題,初衷和carp十分類似。一致性雜湊修正了carp使用的簡單雜湊演算法帶來的問題,使得分布式雜湊 dht 可以在p2p環境中真正得到應用。一致性hash演算法...

分布式一致性雜湊分析

現在實際應用中,我們使用redis作為我們的快取伺服器,假如現在我們的使用三颱redis伺服器用來作為快取 redis01,redis02,redis03 現在我們需要把我們的資料均勻的存放到三個redis伺服器上 對於redis伺服器來說,並沒有實現分布式集群,所謂的redis的分布式集群是指由客...