在分布式集群系統中會用到一致性雜湊演算法,在此進行記錄。
一般系統分為前端伺服器和後端伺服器,前端伺服器負責資料的接收和分發工作,後端負責儲存、處理、提供資料。後端伺服器不止一台,此時就涉及到了資料如何分發的問題。一致性雜湊演算法就可以用來解決這一問題。
通過雜湊函式我們可以建立key-value的對應關係。假設目前一共有3臺伺服器用於資料儲存,那麼在乙個資料儲存request發來時,可以對其計算乙個hash value,然後將hash value模3來決定將該資料儲存在哪台機器當中。由於雜湊函式的均勻隨機特性,可以做到資料儲存的負載均衡。
**缺陷:**雖然這種經典結構可以做到負載均衡,但是在增加刪除機器時,需要重新計算一遍所有資料的雜湊值來確定其新的所屬的機器。
針對經典結構不利於機器新增刪除的缺陷,提出一致性雜湊演算法。
將雜湊函式域的最大值為max_value,將其值域看做乙個首尾相連的環,然後根據機器的ip或者mac值算出乙個hash value,從而確定該機器在這個環上的位置。將機器的hash value排序後儲存在前端伺服器當中,這樣在乙個request到來時,算出其hash value,然後根據這個值得到第乙個雜湊值大於該值的機器,然後將該資料儲存在這台機器當中。
新增機器時,例如圖中新增機器m4,算得雜湊值位於m2與m3之間,那麼就將m3中雜湊值小於m4機器雜湊值的資料轉移儲存到m4當中。如果要刪除m4,就將m4中的資料全部交給m3。
**缺陷:**雖然通過上述方法可以實現機器方便的新增刪除,但由於雜湊函式的隨機特性,當機器很多時可以做到資料儲存負載均衡,而機器少時,很可能某些機器儲存的資料很少,某些機器儲存的資料卻很多,做不到負載均衡,且即使某情況下均衡了,後續新增機器又會破壞這種均衡。
針對上述缺陷,提出虛擬節點技術:對每個機器產生很多個虛擬值,然後對這些虛擬值計算雜湊值,得到很多個虛擬節點去佔據雜湊域(相當於乙個機器模擬了許多虛擬機器)。然後將屬於虛擬節點的資料交給對應的機器。
一致性雜湊演算法
好吧,我們決定打破這種基於資料項商業邏輯的劃分思維,來考慮一種基於 key 的劃分方式,這有些類似於後面介紹的資料庫水平分割槽 sharding 我們需要設計一種不依賴資料項內容的雜湊演算法,將所有資料項的 key 均衡分配在這三颱快取伺服器上。乙個簡單而有效的方法是 取餘 運算,這就像打撲克時的發...
一致性雜湊演算法
在分布式系統中,如果某業務可以由多個相同的節點處理,很容易想到用hash的方式將業務請求分散到這些節點處理,如果有n個節點,計算方法為 hash id n。如果只是簡單的計算,不涉及使用者狀態,這是乙個簡單有效的方案。如果節點的計算涉及使用者狀態,比如維護購物車 memcache快取服務等,好像也沒...
一致性雜湊演算法
判定好壞的四個定義 1 平衡性 balance 平衡性是指雜湊的結果能夠盡可能分布到所有的緩衝中去,這樣可以使得所有的緩衝空間都得到利用。很多雜湊演算法都能夠滿足這一條件。2 單調性 monotonicity 單調性是指如果已經有一些內容通過雜湊分派到了相應的緩衝中,又有新的緩衝加入到系統中。雜湊的...