比如你有 n 個 cache 伺服器(後面簡稱 cache ),那麼如何將乙個物件 object 對映到 n 個 cache 上呢,你很可能會採用類似下面的通用方法計算 object 的 hash 值,然後均勻的對映到到 n 個 cache :
hash(object)%n
如果增加乙個cache,對映公式變成了 hash(object)%(n+1)
如果乙個cache宕機了,對映公式變成了 hash(object)%(n-1)
在這兩種情況下,幾乎所有的 cache 都失效了。會導致資料庫訪問的壓力陡增,嚴重情況,還可能導致資料庫宕機。
一致性hash演算法正是為了解決此類問題的方法,它可以保證當機器增加或者減少時,對快取訪問命中的概率影響減至很小。
通常的 hash 演算法都是將 value 對映到乙個 32 位的 key 值,也即是 0~2^32-1 次方的數值空間;我們可以將這個空間想象成乙個首( 0 )尾( 2^32-1 )相接的圓環
可以使用 cache 機器的 ip 位址或者機器名作為 hash 輸入
在這個環形空間中,如果沿著順時針方向從物件的 key 值出發,直到遇見乙個 cache ,那麼就將該物件儲存在這個 cache 上,因為物件和 cache 的 hash 值是固定的,因此這個 cache 必然是唯一和確定的。
使用簡單的求模方法,當新新增機器後會導致大部分快取失效的情況,使用一致性hash演算法後這種情況則會得到大大的改善。
如下圖,只有物件o4被重新分配到了c4,其他物件仍在原有機器上。
只有物件o2被重新分配到機器c3,其他物件仍在原有機器上。
雜湊的結果能夠盡可能分布到所有的cache中去,這樣可以使得所有的緩衝空間都得到利用。
如果 cache 較少的話,物件並不能被均勻的對映到 cache 上。
可能o1對映到快取a上,o2,o3,o4對映到快取c上。
為了解決這種情況,需要引入虛擬節點的概念。
「虛擬節點」( virtual node )是實際節點在 hash 空間的複製品( replica ),乙個實際節點對應了若干個「虛擬節點」。
如圖,虛擬節點a1,a2都會對映到實際結點a上。
「虛擬節點」的 hash 計算可以採用對應節點的 ip 位址加數字字尾的方式。例如假設 cache a 的 ip 位址為 202.168.14.241 。
引入「虛擬節點」前,計算 cache a 的 hash 值:
hash(「202.168.14.241」);
引入「虛擬節點」後,計算「虛擬節」點 cache a1 和 cache a2 的 hash 值:
hash(「202.168.14.241#1」); // cache a1
hash(「202.168.14.241#2」); // cache a2
參考:
一致性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...