一致性雜湊演算法

2021-08-10 16:16:11 字數 1960 閱讀 1504

首次聽到一致性hash演算法,不明白是乙個什麼樣的演算法,通過多方查詢資料,總算是有了乙個基礎的了解。特在此處留作筆記,以便後續的學習!

學習乙個技術,先想是什麼場景下會用到這個技術,它解決了什麼問題!

一致性hash作為乙個負載均衡演算法,可以用在分布式快取、資料庫的分庫分表等場景中,還可以應用在負載均衡器中作為作為負載均衡演算法。在有多台伺服器時,對於某個請求資源通過hash演算法,對映到某乙個臺伺服器,當增加或減少一台伺服器時,可能會改變這些資源對應的hash值,這樣可能導致一部分快取或資料失效了。一致性hash就是盡可能在將同乙個資源請求路由到同一臺伺服器中。

有n臺伺服器提供快取服務,需要對伺服器進行負載均衡,將請求平均分發到每台伺服器上,每台機器負責1/n的服務。

常用的演算法是取餘法(對hash結果取餘數) :

對機器編號從0到n-1,按照自定義的 hash()演算法,對每個請求的hash()值按n取模,得到餘數i,然後將請求分發到編號為i的機器。

但這樣的演算法方法存在致命問題,如果某一台機器宕機,那麼應該落在該機器的請求就無法得到正確的處理,這時需要將宕掉的伺服器從演算法中去除,此時會有(n-1)/n的伺服器的快取資料需要重新進行計算;如果新增一台機器,會有n /(n+1)的伺服器的快取資料需要進行重新計算。對於系統而言,這通常是不可接受的顛簸(因為這意味著大量快取的失效或者資料需要轉移)。

那麼,如何設計乙個負載均衡策略,使得受到影響的請求盡可能的少呢?在memcached、key-value store 、bittorrent dht、lvs中都採用了一致性hash演算法,可以說一致性hash是分布式系統負載均衡的首選演算法。

為了解決以上取模運算的缺點,我們引入一致性hash演算法。

3-1

一致性hash演算法的原理如下:

首先我們把2的32次方想象成乙個環,比如:

假如我們有四台伺服器分布這個環上,其中node1,node2,node3,node4就表示這四台伺服器在環上的位置,一致性hash演算法就是,

在快取的key的值計算後得到的hash值,對映到這個環上的點,然後這些點按照順時針方向找,找到離自己最近的乙個物理節點就是自己要儲存的節點。

3-2

當我們增加了乙個節點如下:

我們增加了node5放在node3和node4之間,這時我們可以看到增加了乙個節點只會影響node3至node5之間的資料,其他節點的資料不會受到影響。同時我們還可以看到,node4和node5的壓力要小於其他節點,大約是其他節點的一半。這樣就

帶來了壓力分布不均勻的情況,假定node4和node5的機器配置和其它的節點機器配置相同,那麼node4和node5的機器

資源就浪費了一半

,那麼怎麼解決這個問題呢?

3-3

我們引入虛擬節點,簡單來說,虛擬節點就是不存在的點,這些虛擬節點盡量的分布在環上,需要做的就是把這些虛擬節點需要對映到物理節點。

在引入虛擬節點後,我們把虛擬節點上均勻的分布到環上,然後把虛擬節點對映到物理節點,

當增加了新的機器後,我們只需要把虛擬節點對映到新的機器即可,這樣就解決了機器壓力分布不均勻的情況

在什麼場景下會用到這個技術?

答:在分布式快取,負載均衡策略中會用到。

解決了什麼問題?

答:最大限度地抑制了hash鍵的重新分布,最大限度地減小伺服器增減時的快取重新分布,提高了使用者請求命中快取(伺服器)的命中率,加快了使用者的訪問速度,減輕了伺服器的壓力;

總結完畢!!!

一致性雜湊演算法

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

一致性雜湊演算法

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

一致性雜湊演算法

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