深入淺出一致性 Hash 原理

2021-09-25 09:12:51 字數 2327 閱讀 2410

在解決分布式系統中負載均衡的問題時候可以使用 hash 演算法讓固定的一部分請求落到同一臺伺服器上 , 這樣每台伺服器固定處理一部分請求 (並維護這些請求的資訊) , 起到負載均衡的作用

但是普通的餘數 hash(比如使用者 id% 伺服器機器數) 演算法伸縮性很差 , 當新增或者下線伺服器機器時候 , 使用者 id 與伺服器的對映關係會大量失效 ; 一致性 hash 則利用 hash 環對其進行了改進

為了能直觀的理解一致性 hash 原理 , 這裡結合乙個簡單的例子來講解 , 假設有4臺伺服器 , 位址為ip1,ip2,ip3,ip4

一致性 hash 是首先計算四個ip位址對應的 hash 值 , hash (ip1) , hash (ip2) , hash (ip3) , hash (ip4) , 計算出來的 hash 值是0~最大正整數之間的乙個值 , 這四個值在一致性 hash 環上呈現如下圖 :

hash 環上順時針從整數 0 開始 , 一直到最大正整數 , 我們根據四個ip計算的 hash 值肯定會落到這個 hash 環上的某乙個點 , 至此我們把伺服器的四個ip對映到了一致性 hash 環

當使用者在客戶端進行請求時候 , 首先根據 hash (使用者id) 計算路由規則 (hash 值) , 然後看 hash 值落到了 hash 環的那個地方 , 根據 hash 值在 hash 環上的位置順時針找距離最近的 ip 作為路由 ip

如上圖可知 user1 , user2 的請求會落到伺服器 ip2 進行處理 , user3 的請求會落到伺服器 ip3 進行處理 , user4 的請求會落到伺服器 ip4 進行處理 , user5 , user6 的請求會落到伺服器 ip1 進行處理

下面考慮當 ip2 的伺服器掛了的時候會出現什麼情況 ?

當 ip2 的伺服器掛了的時候 , 一致性 hash 環大致如下圖 :

根據順時針規則可知 user1 , user2 的請求會被伺服器 ip3 進行處理 , 而其它使用者的請求對應的處理伺服器不變 , 也就是只有之前被 ip2 處理的一部分使用者的對映關係被破壞了 , 並且其負責處理的請求被順時針下乙個節點委託處理

下面考慮當新增機器的時候會出現什麼情況 ?

當新增乙個 ip5 的伺服器後 , 一致性 hash 環大致如下圖 :

根據順時針規則可知之前 user5 的請求應該被 ip1 伺服器處理 , 現在被新增的 ip5 伺服器處理 , 其他使用者的請求處理伺服器不變 , 也就是新增的伺服器順時針最近的伺服器的一部分請求會被新增的伺服器所替代

伺服器 ip1 , ip2 , ip3 經過 hash 後落到了一致性 hash 環上 , 從圖中 hash 值分布可知 ip1 會負責處理大概80%的請求 , 而 ip2 和 ip3 則只會負責處理大概 20% 的請求 , 雖然三個機器都在處理請求 , 但是明顯每個機器的負載不均衡 , 這樣稱為一致性 hash 的傾斜 , 虛擬節點的出現就是為了解決這個問題

當伺服器節點比較少的時候會出現上節所說的一致性 hash 傾斜的問題 , 乙個解決方法是多加機器 , 但是加機器是有成本的 , 那麼就加虛擬節點 , 比如上面三個機器 , 每個機器引入 1 個虛擬節點後的一致性 hash 環的圖如下 :

其中 ip1-1 是 ip1 的虛擬節點 , ip2-1 是 ip2 的虛擬節點 , ip3-1 是 ip3 的虛擬節點

可知當物理機器數目為 m , 虛擬節點為 n 的時候 , 實際 hash 環上節點個數為 m*n ; 比如當客戶端計算的 hash 值處於 ip2 和 ip3 或者處於 ip2-1 和 ip3-1 之間時候使用 ip3 伺服器進行處理

在分布式系統中一致性 hash 起著不可忽略的地位 , 無論是分布式快取 , 還是分布式 rpc 框架的負載均衡策略都有所使用

作者 github : tojohnonly , 部落格 : enskdecode

深入淺出一致性Hash原理

在解決分布式系統中負載均衡的問題時候可以使用hash演算法讓固定的一部分請求落到同一臺伺服器上,這樣每台伺服器固定處理一部分請求 並維護這些請求的資訊 起到負載均衡的作用。但是普通的餘數hash hash 比如使用者id 伺服器機器數 演算法伸縮性很差,當新增或者下線伺服器機器時候,使用者id與伺服...

深入淺出一致性Hash原理

在解決分布式系統中負載均衡的問題時候可以使用hash演算法讓固定的一部分請求落到同一臺伺服器上,這樣每台伺服器固定處理一部分請求 並維護這些請求的資訊 起到負載均衡的作用。但是普通的餘數hash hash 比如使用者id 伺服器機器數 演算法伸縮性很差,當新增或者下線伺服器機器時候,使用者id與伺服...

深入淺出一致性Hash原理

在解決分布式系統中負載均衡的問題時候可以使用hash演算法讓固定的一部分請求落到同一臺伺服器上,這樣每台伺服器固定處理一部分請求 並維護這些請求的資訊 起到負載均衡的作用。但是普通的餘數hash hash 比如使用者id 伺服器機器數 演算法伸縮性很差,當新增或者下線伺服器機器時候,使用者id與伺服...