普通的雜湊演算法使用取餘操作:hash(o) mod n,其中 n 代表機器的數量。如果在集群中新增加乙個節點時,計算公式會變為:hash(o) mod (n+1);在集群中刪除乙個機器時,計算公式變為:hash(o) mod (n-1)。所以當集群中機器數量有所變化時,幾乎所有的 object 的雜湊值都會改變。一致性雜湊可以保證當從集群中刪除一台機器時,僅僅儲存在該機器上的 object 的值會變化;當集群中增加一台機器時,也僅僅是非常小的一部分 object 的雜湊值會發生改變。
一致性雜湊的值一般使用 32bit 儲存,所以雜湊值的空間範圍是0~2^32-1,並且2^32-1後面的值是0 ,如圖所示是乙個封閉的圓圈。
在這個圓圈上會對映兩種元素的雜湊值,一種元素是object的雜湊值,如圖2所示是對映4個object;另一種元素是cache的雜湊值,即計算機節點的雜湊值,如圖3所示是對映3個cache。
當從集群中刪除乙個節點,如刪除 cacheb,則快取在 cacheb 上的 object 將會移動到 cachec 上,如圖4;當集群中新增加乙個節點時,如增加 cached,則在cacheb和cached之間的object會從cachec上轉移到cached上,如圖5。
如果節點數量較少時,還是會出現資料分布不均勻的情況,通過使用虛擬節點的方法可以解決。虛擬節點是將乙個真實的cache在圓圈上覆制幾份作為虛擬節點,如圖6。當集群中增加乙個真實cache 時,對應的增加一定數量的虛擬節點,當集群中刪除乙個真實的cache時,其所對應的虛擬節點都會被刪除。
一致性雜湊可以用於memcache。
memcache是乙個高效能的分布式記憶體物件快取系統,用於動態web應用以減輕資料庫負載。其分布式由客戶端實現。每個客戶端維護乙個伺服器池,通過一致性雜湊演算法,將資料比較均勻地分布在池中的伺服器上。
memcached 將所有的資料放在記憶體中,不具備資料持久化的功能,當一台機器宕機時,記憶體裡面儲存的資料將會全部丟失。
memcache資料的分布方法主要採用的是一致性hash演算法,演算法流程如下:
構造乙個長度為2^32的整數環,然後根據伺服器節點的hash值,將伺服器節點分布到這個環上。
當有需要快取的資料時,根據該資料的key值計算得到hash值,並將其對映至環上。
在環上順時針查詢與該hash值最近的伺服器節點,從而完成key到伺服器節點的對映,並將資料儲存在該伺服器節點上。
如果超過2^32次方仍然找不到伺服器,則將資料儲存到第一台伺服器上。
通過該演算法有效的減少了伺服器節點增減導致的快取重新分布。
另外,由於通過一般的hash函式,伺服器的對映地點的分布可能會不均勻,故採取虛擬節點的方法,為每個物理伺服器節點設定多個「邏輯節點」,可以進一步減小伺服器節點增減導致的快取重新分布。
一致性雜湊演算法
好吧,我們決定打破這種基於資料項商業邏輯的劃分思維,來考慮一種基於 key 的劃分方式,這有些類似於後面介紹的資料庫水平分割槽 sharding 我們需要設計一種不依賴資料項內容的雜湊演算法,將所有資料項的 key 均衡分配在這三颱快取伺服器上。乙個簡單而有效的方法是 取餘 運算,這就像打撲克時的發...
一致性雜湊演算法
在分布式系統中,如果某業務可以由多個相同的節點處理,很容易想到用hash的方式將業務請求分散到這些節點處理,如果有n個節點,計算方法為 hash id n。如果只是簡單的計算,不涉及使用者狀態,這是乙個簡單有效的方案。如果節點的計算涉及使用者狀態,比如維護購物車 memcache快取服務等,好像也沒...
一致性雜湊演算法
判定好壞的四個定義 1 平衡性 balance 平衡性是指雜湊的結果能夠盡可能分布到所有的緩衝中去,這樣可以使得所有的緩衝空間都得到利用。很多雜湊演算法都能夠滿足這一條件。2 單調性 monotonicity 單調性是指如果已經有一些內容通過雜湊分派到了相應的緩衝中,又有新的緩衝加入到系統中。雜湊的...