一致性hash算法的理解

用hash作緩存,假若有三臺服務器,1,2,3,有三萬張圖片,我想將圖片平均緩存到我三臺服務器上,一個服務器大概一萬張,怎麼去實現這個辦法呢,能夠用hash來取餘數進行操做,加入咱們是以圖片的名字做爲key進行hash計算,hash (圖片名稱)%N 其中N爲咱們服務器的個數,咱們將hash(圖片名稱)這一部分進行計算後獲得的是一個正數,而後除以服務器的數目進行取餘數,結果將會是0,1,2三個數,對應咱們的服務器的編號,當咱們做爲客戶端去請求圖片的時候,圖片已經進行過hash運算了,直接找到對應服務器的編號進行圖片的訪問,這樣解決了我須要遍歷全部的服務器進行查找。算法

clipboard.png

那若是我緩存的服務器的數量減小或者增長,若是仍是按照原來的算法走,一定會形成緩存數據的丟失,會去向後端的服務器去請求,若是有一臺緩存服務器發生了故障,那我原來緩存的位置一定會發生改變,原來本該運算後要進行緩存到某一臺服務器的圖片,如今找不到對應緩存服務器,確定會發生緩存的雪崩後端

因此出現了一致性hash算法緩存

至關於將服務器和圖片分別hash到個人hash環上進行就近緩存,hash環就是對2^32次方進行取模,從0開始一直到2^32,均勻分佈在一個圓環(一個比方),0的順時針方向的第一位爲1,逆時針方向第一位爲2^32,大概以下圖:服務器

clipboard.png

具體就是比方我有三個服務器A,B ,C對其進行 hash (服務器Aip)%2^32 得出來的必定是一個整數,並且必定是在0--2^32之間,那麼這個數就會分佈在hash環上對應的位置,相同的B,C都同樣,假設咱們hash事後ABC的位置以下圖:spa

clipboard.png

而後咱們將須要緩存圖片的key進行hash,它的hash值也會分佈在個人hash環上,3d

clipboard.png

如上圖,我hash到了A和C之間,圖片的存儲規則是順時針方向的存儲,因此應該存儲到A,若是有四張的話以下圖:blog

clipboard.png

那若是咱們的hash算法將服務器和hash的圖片存放位置比較相近,相似於;圖片

clipboard.png

全部的緩存都集中存儲到了A一臺,只有5到了B,那麼這樣A的壓力就不言而喻,沒有均勻可言了,辛虧hash環能夠添加緩存服務器的虛擬節點,相似於虛擬機,一臺實機能夠虛擬多臺,相似於這樣:ip

clipboard.png

這樣的話就會盡量的把緩存都均衡放在各個服務器get

一致性hash算法的優點在哪:

一個是當我有一臺緩存節點掛了以後,緩存的存儲不會受太大的影響,

clipboard.png

咱們將b節點拿走,原本要在B節點存儲的3,由於找不到B服務器,而遵循規則緩存到C,而4的緩存節點不會發生改變,這就是一致hash的優勢,若是發生服務器的增長或者減小隻有部分的緩存會失效,不形成全盤皆輸的可能

一致hash到此結束。。。。。。。。

本文做者:提利

閱讀原文

本文爲雲棲社區原創內容,未經容許不得轉載。

相關文章
相關標籤/搜索