1.為什麼需要一致性hash演算法?
如下場景:redis集群按槽分配資料(類似於資料庫的分庫分表)
打進redis的資料可能分配到任何乙個redis的節點上,如果沒有乙個固定的策略,那麼需要遍歷這個redis集群才能命中想要的資料-------->所以需要有乙個策略來避免(分庫分表規則:按照hash值、取模、按照類別、按照某乙個字段值等規則),這裡按照hash來說明。
按照hash:乙個資源通過hash演算法可以路由到某個節點,如果hash(資源1) % 4 = 2,那麼查詢資源1的時候可以直接根據該hash演算法去找第二個節點------->大大提高搜尋效率
問題:當增加節點/節點宕機的時候------hash演算法hash(資源1) % 4 = 2不能正確路由------->造成快取雪崩/無法命中資料
由於存在該問題,所以需要一致性hash演算法
2.一致性hash演算法是什麼?
上述的描述的取模法是對伺服器的數量進行取模
一致性hash演算法本質:也是使用取模的方法,對2^32取模
一致性hash演算法將整個雜湊值空間組織成乙個虛擬的圓環,如假設某雜湊函式h的值空間為0-2^32-1(即雜湊值是乙個32位無符號整形)
雜湊環:
整個空間按順時針方向組織,圓環的正上方的點代表0,0點右側的第乙個點代表1,以此類推,2、3、4、5、6……直到2^32-1,也就是說0點左側的第乙個點代表2^32-1, 0和2^32-1在零點中方向重合,我們把這個由2^32個點組成的圓環稱為hash環。
下一步將各個伺服器使用hash進行乙個雜湊,具體可以選擇伺服器的ip或主機名作為關鍵字進行雜湊,這樣每台機器就能確定其在雜湊環上的位置,這裡假設將上文中四台伺服器使用ip位址雜湊後在環空間的位置如下:
接下來使用如下演算法定位資料訪問到相應伺服器:將資料key使用相同的函式hash計算出雜湊值,並確定此資料在環上的位置,從此位置沿環順時針「行走」,第一台遇到的伺服器就是其應該定位到的伺服器!
例如我們有object a、object b、object c、object d四個資料物件,經過雜湊計算後,在環空間上的位置如下:
根據一致性hash演算法,資料a會被定為到node a上,b被定為到node b上,c被定為到node c上,d被定為到node d上。
3.一致性hash演算法的容錯性和可擴充套件性
假設node c不幸宕機(節點宕機場景),可以看到此時物件a、b、d不會受到影響,只有c物件被重定位到node d。一般的,在一致性hash演算法中,如果一台伺服器不可用,則受影響的資料僅僅是此伺服器到其環空間中前一台伺服器(即沿著逆時針方向行走遇到的第一台伺服器)之間資料,其它不會受到影響,如下所示:
在系統中增加一台伺服器node x(節點增加場景):
此時物件object a、b、d不受影響,只有物件c需要重定位到新的node x !
在一致性hash演算法中,如果增加一台伺服器,則受影響的資料僅僅是新伺服器到其環空間中前一台伺服器(即沿著逆時針方向行走遇到的第一台伺服器)之間資料,其它資料也不會受到影響。
綜上所述,一致性hash演算法對於節點的增減都只需重定位環空間中的一小部分資料,具有較好的容錯性和可擴充套件性。
4.hash環的資料傾斜問題/解決方案
一致性hash演算法在服務節點太少時,容易因為節點分部不均勻而造成資料傾斜(被快取的物件大部分集中快取在某一台伺服器上)問題,例如系統中只有兩台伺服器,其環分布如下:
此時大量資料集中到node a上,而只有極少量會定位到node b上。
為了解決這種資料傾斜問題,一致性hash演算法引入了虛擬節點機制,即對每乙個服務節點計算多個雜湊,每個計算結果位置都放置乙個此服務節點,稱為虛擬節點。具體做法可以在伺服器ip或主機名的後面增加編號來實現。
例如上面的情況,可以為每台伺服器計算三個虛擬節點,於是可以分別計算 「node a#1」、「node a#2」、「node a#3」、「node b#1」、「node b#2」、「node b#3」的雜湊值,於是形成六個虛擬節點:
同時資料定位演算法不變,只是多了一步虛擬節點到實際節點的對映;
例如定位到「node a#1」、「node a#2」、「node a#3」三個虛擬節點的資料均定位到node a上。這樣就解決了服務節點少時資料傾斜的問題。在實際應用中,通常將虛擬節點數設定為32甚至更大,因此即使很少的服務節點也能做到相對均勻的資料分布。
參考:
一致性hash演算法 面試必備 一致性hash演算法
最近公司在招人,我們準備的問題中有一道是關於一致性hash演算法的問題,只有一些面試者能夠回答上來,而且答的也不是很全面,有的面試者只是聽說過,有的連聽都沒聽過,下面我把一致性hash演算法整理一下分享給大家 一致性雜湊演算法在1997年由麻省理工學院的karger等人在解決分布式cache中提出的...
一致性hash演算法虛擬節點 一致性hash演算法
hash 演算法也叫做雜湊演算法,他可以讓任意長度的資料m對映成為長度固定的值h。hash演算法的第乙個作用就是資料的快速儲存與查詢。寫過程式的人都知道,基本上主流的程式語言裡面都有個資料結構叫做map dictionary或者 hash table 它是根據key來直接訪問結果的資料結構。key的...
一致性hash演算法
july部落格16章開始 第一題 全排列,輸入乙個字串,列印出該字串中字元的所有排列 1.個人思路 回溯法建立的排序樹 2.july部落格 遞迴實現,依次固定第乙個字母,後面的交換,和上面描述的使用回溯法相似 c stl 演算法 next permutation的思想,關於next permutat...