一致性雜湊演算法

2021-09-27 22:08:00 字數 1678 閱讀 3687

首先講一下判斷雜湊演算法好壞的三個原則

1、平衡性(balance):是指 hash的結果應該平均分配到各個節點, 這樣從演算法上就解決了負載均衡問題.

2、單調性(monotonicity): 在新增或者刪減節點時, 同乙個key訪問到的值總是一樣的.

3、分散性(spread):在分布式環境中,資料應該分散的存放在 分布式集群中的各個節點(節點自己可以有備份), 不必要每個節點都儲存所有的資料.

一致性雜湊演算法是分布式系統中常用的演算法。比如,乙個分布式的儲存系統,要將資料儲存到具體的節點上,如果採用普通的hash方法,將資料對映到具體的節點上,如key%n,key是資料的key,n是機器節點數,如果有乙個機器加入或退出這個集群,則所有的資料對映都無效了,如果是持久化儲存則要做資料遷移,如果是分布式快取,則其他快取就失效了。

這裡提到的一致性hash演算法ketama的做法是:選擇具體的機器節點不在只依賴需要快取資料的key的hash本身了,而是機器節點本身也進行了hash運算。

一致性雜湊的情景描述

1、 hash機器節點

首先求出機器節點的hash值(怎麼算機器節點的hash?ip可以作為hash的引數吧。。當然還有其他的方法了),然後將其分布到0~2^32的乙個圓環上(順時針分布)。如下圖所示:

圖一 

集群中有機器:a , b, c, d, e五颱機器,通過一定的hash演算法我們將其分布到如上圖所示的環上。

2、訪問方式

如果有乙個寫入快取的請求,其中key值為k,計算器hash值hash(k), hash(k) 對應於圖 – 1環中的某乙個點,如果該點對應沒有對映到具體的某乙個機器節點,那麼順時針查詢,直到第一次找到有對映機器的節點,該節點就是確定的目標節點,如果超過了2^32仍然找不到節點,則命中第乙個機器節點。比如 hash(k) 的值介於a~b之間,那麼命中的機器節點應該是b節點(如上圖 )。

3、增加節點的處理

如上圖 – 1,在原有集群的基礎上欲增加一台機器f,增加過程如下:

計算機器節點的hash值,將機器對映到環中的乙個節點,如下圖:

圖二
增加機器節點f之後,訪問策略不改變,依然按照(2)中的方式訪問,此時快取命不中的情況依然不可避免,不能命中的資料是hash(k)在增加節點以前落在c~f之間的資料。儘管依然存在節點增加帶來的命中問題,但是比較傳統的 hash取模的方式,一致性hash已經將不命中的資料降到了最低。

以上是一致性雜湊的具體實現,基於這種原理,我們可以看到一致性雜湊的優點

1。單調性

因為一致性雜湊的這種演算法,有效的解決了單調性的問題。當分布系統中節點發生變化時,只有少量的資料參與重新計算和遷移。

2。平衡性

對於資料的分布均衡問題,通過虛擬節點的思想來達到均衡分配。當然,我們cache server節點越少就越需要虛擬節點這個方式來均衡負載。

當物理伺服器的數量很小時,需要更多的虛擬節點,反之則需要更少的節點。

3。分散性

關於分散性,人家還沒有想明白,再說吧,大過年的

一致性雜湊演算法

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

一致性雜湊演算法

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

一致性雜湊演算法

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