一致性雜湊演算法

2021-08-20 19:56:05 字數 3277 閱讀 1606

1.演算法背景:

比如你有 n 個 cache 伺服器(後面簡稱 cache ),那麼如何將乙個物件 object 對映到 n 個 cache 上呢,你很可能會採用類似下面的通用方法計算 object 的 hash 值,然後均勻的對映到到 n 個 cache ;hash(object)%n

一切都執行正常,再考慮如下的兩種情況;

1.乙個 cache 伺服器 m down 掉了(在實際應用中必須要考慮這種情況),這樣所有對映到 cache m 的物件都會失效,怎麼辦,需要把 cache m 從 cache 中移除,這時候 cache 是 n-1 臺,對映公式變成了 hash(object)%(n-1) ;

2.由於訪問加重,需要新增 cache ,這時候 cache 是 n+1 臺,對映公式變成了 hash(object)%(n+1) ;

這意味著突然之間幾乎所有的 cache 都失效了。對於伺服器而言,這是一場災難,洪水般的訪問都會直接衝向後台伺服器;

再來考慮第三個問題,由於硬體能力越來越強,你可能想讓後面新增的節點多做點活,顯然上面的 hash 演算法也做不到。什麼方法可以改變這個狀況呢,這就是 consistent hashing...

2.hash 演算法和單調性

hash 演算法的乙個衡量指標是單調性( monotonicity ),定義如下:

單調性是指如果已經有一些內容通過雜湊分派到了相應的緩衝中,又有新的緩衝加入到系統中。雜湊的結果應能夠保證原有已分配的內容可以被對映到新的緩衝中去,而不會被對映到舊的緩衝集合中的其他緩衝區。

容易看到,上面的簡單 hash 演算法 hash(object)%n 難以滿足單調性要求。

3.演算法的原理

consistent hashing 是一種 hash 演算法,簡單的說,在移除 / 新增乙個 cache 時,它能夠盡可能小的改變已存在 key 對映關係,盡可能的滿足單調性的要求。下面就來按照 5 個步驟簡單講講 consistent hashing 演算法的基本原理。

假設當前有 a,b 和 c 共 3 臺 cache ,那麼其對映結果將如下圖所示,他們在 hash 空間中,以對應的 hash 值排列。

說到這裡,順便提一下 cache 的 hash 計算,一般的方法可以使用 cache 機器的 ip 位址或者機器名作為 hash 輸入。

在這個環形空間中,如果沿著順時針方向從物件的 key 值出發,直到遇見乙個 cache ,那麼就將該物件儲存在這個 cache 上,因為物件和 cache 的 hash 值是固定的,因此這個 cache 必然是唯一和確定的。這樣不就找到了物件和 cache 的對映方法了嗎?!依然繼續上面的例子,那麼根據上面的方法,物件 object1 將被儲存到 cache a 上; object2 和 object3 對應到 cache c ; object4 對應到 cache b ;

移除 cache考慮假設 cache b 掛掉了,根據上面講到的對映方法,這時受影響的將僅是那些沿 cache b 逆時針遍歷直到下乙個 cache ( cache c )之間的物件,也即是本來對映到 cache b 上的那些物件。因此這裡僅需要變動物件 object4 ,將其重新對映到 cache c 上即可;

新增 cache再考慮新增一台新的 cache d 的情況,假設在這個環形 hash 空間中, cache d 被對映在物件 object2 和 object3 之間。這時受影響的將僅是那些沿 cache d 逆時針遍歷直到下乙個 cache ( cache b )之間的物件(它們是也本來對映到 cache c 上物件的一部分),將這些物件重新對映到 cache d 上即可。因此這裡僅需要變動物件 object2 ,將其重新對映到 cache d 上;

4.虛擬節點

考量 hash 演算法的另乙個指標是平衡性 (balance) ,定義如下:

「虛擬節點」( virtual node )是實際節點在 hash 空間的複製品( replica ),一實際個節點對應了若干個「虛擬節點」,這個對應個數也成為「複製個數」,「虛擬節點」在 hash 空間中以 hash 值排列。仍以僅部署 cache a 和 cache c 的情況為例,在圖 4 中我們已經看到, cache 分布並不均勻。現在我們引入虛擬節點,並設定「複製個數」為 2 ,這就意味著一共會存在 4 個「虛擬節點」, cache a1, cache a2 代表了 cache a ; cache c1, cache c2 代表了 cache c ;假設一種比較理想的情況

此時,物件到「虛擬節點」的對映關係為:objec1->cache a2 ; objec2->cache a1 ; objec3->cache c1 ; objec4->cache c2 ;因此物件 object1 和 object2 都被對映到了 cache a 上,而 object3 和 object4 對映到了 cache c 上;平衡性有了很大提高。引入「虛擬節點」後,對映關係就從 轉換到了 。查詢物體所在 cache 時的對映關係

虛擬節點」的 hash 計算可以採用對應節點的 ip 位址加數字字尾的方式。例如假設 cache a 的 ip 位址為 202.168.14.241 。

引入「虛擬節點」前,計算 cache a 的 hash 值:

hash(「202.168.14.241」);

引入「虛擬節點」後,計算「虛擬節」點 cache a1 和 cache a2 的 hash 值:

hash(「202.168.14.241#1」); // cache a1

hash(「202.168.14.241#2」); // cache a2

一致性雜湊演算法

好吧,我們決定打破這種基於資料項商業邏輯的劃分思維,來考慮一種基於 key 的劃分方式,這有些類似於後面介紹的資料庫水平分割槽 sharding 我們需要設計一種不依賴資料項內容的雜湊演算法,將所有資料項的 key 均衡分配在這三颱快取伺服器上。乙個簡單而有效的方法是 取餘 運算,這就像打撲克時的發...

一致性雜湊演算法

在分布式系統中,如果某業務可以由多個相同的節點處理,很容易想到用hash的方式將業務請求分散到這些節點處理,如果有n個節點,計算方法為 hash id n。如果只是簡單的計算,不涉及使用者狀態,這是乙個簡單有效的方案。如果節點的計算涉及使用者狀態,比如維護購物車 memcache快取服務等,好像也沒...

一致性雜湊演算法

判定好壞的四個定義 1 平衡性 balance 平衡性是指雜湊的結果能夠盡可能分布到所有的緩衝中去,這樣可以使得所有的緩衝空間都得到利用。很多雜湊演算法都能夠滿足這一條件。2 單調性 monotonicity 單調性是指如果已經有一些內容通過雜湊分派到了相應的緩衝中,又有新的緩衝加入到系統中。雜湊的...