一致性hash演算法的理解

tianxiaoxu發表於2018-08-29

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

那如果我快取的伺服器的數量減少或者增加,如果還是按照原來的演算法走,必定會造成快取資料的丟失,會去向後端的伺服器去請求,如果有一臺快取伺服器發生了故障,那我原來快取的位置必定會發生改變,原來本該運算後要進行快取到某一臺伺服器的圖片,現在找不到對應快取伺服器,肯定會發生快取的雪崩

所以出現了一致性hash演算法相當於將伺服器和圖片分別hash到我的hash環上進行就近快取,hash環就是對2^32次方進行取模,從0開始一直到2^32,均勻分佈在一個圓環(一個比方),0的順時針方向的第一位為1,逆時針方向第一位為2^32,大概如下圖

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

然後我們將需要快取圖片的key進行hash,它的hash值也會分佈在我的hash環上,

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

那如果我們的hash演算法將伺服器和hash的圖片存放位置比較相近,類似於;

所有的快取都集中儲存到了A一臺,只有5到了B,那麼這樣A的壓力就不言而喻,沒有均勻可言了,辛虧hash環可以新增快取伺服器的虛擬節點,類似於虛擬機器,一臺實機可以虛擬多臺,類似於這樣:

這樣的話就會盡可能的把快取都均衡放在各個伺服器

一致性hash演算法的優勢在哪:一個是當我有一臺快取節點掛了之後,快取的儲存不會受太大的影響,

我們將b節點拿走,本來要在B節點儲存的3,因為找不到B伺服器,而遵循規則快取到C,而4的快取節點不會發生改變,這就是一致hash的優點,如果發生伺服器的增加或者減少只有部分的快取會失效,不造成全盤皆輸的可能

一致hash到此結束。

本文轉自雲棲社群  作者:提利

原文連結:https://yq.aliyun.com/articles/629003?spm=a2c4e.11153940.bloghomeflow.55.4a0b291alaKm1U

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31137683/viewspace-2213068/,如需轉載,請註明出處,否則將追究法律責任。

相關文章