一致性hash演算法

2022-07-18 01:42:15 字數 1416 閱讀 7716

一致性雜湊演算法在分布式快取領域的 memcached,負載均衡領域的 nginx 以及各類 rpc 框架中都有廣泛的應用

普通的雜湊表演算法一般都是計算出雜湊值後,通過取餘操作將 key 值對映到不同的伺服器上

但是當伺服器數量發生變化時,取餘操作的除數就會發生變化,所有 key 所對映的伺服器幾乎都會改變,這對分布式快取系統來說是不可以接受的。

一致性雜湊演算法能盡可能減少了伺服器數量變化所導致的快取遷移。

memcached 是乙個高效能的分布式快取系統,然而服務端沒有分布式功能,各個伺服器不會相互通訊。

它的分布式實現依賴於客戶端的程式庫,這也是 memcached 的一大特點。

比如第三方的 spymemcached客戶端就基於一致性雜湊演算法實現了其分布式快取的功能。

1、向 memcached 新增資料,首先客戶端的演算法根據 key 值計算出該 key 對應的伺服器。

2、向選出的伺服器儲存快取資料。

3、獲取資料時,對於相同的 key ,客戶端的演算法還可以選出相同的伺服器,從而獲取資料

在這個過程中,客戶端的演算法首先要保證快取的資料盡量均勻地分布在各個伺服器上,

其次是當個別伺服器下線或者上線時,會出現資料遷移,應該儘量減少需要遷移的資料量。

客戶端演算法是客戶端分布式快取效能優劣的關鍵。

首先將快取伺服器( ip + 埠號)進行雜湊,對映成環上的乙個節點

(取到ip+埠的hash值,以此值作為key,ip+埠作為value,放入treemap)

需要快取資料時,計算出快取資料 key 值的 hash key,同樣對映到環上

(假如最終計算出的的hash key為5)

順時針選取最近的乙個伺服器節點作為該快取應該儲存的伺服器

(從treemap中查詢第乙個大於等於5的key所對應的伺服器,如果沒有找到,則取treemap中的第乙個伺服器)

伺服器 b 宕機下線,伺服器 b 中儲存的快取資料要進行遷移,但由於一致性雜湊環的存在,只需要遷移key 值為1的資料,

其他的資料的儲存伺服器不會發生變化。這也是一致性雜湊演算法比取餘對映演算法出色的地方。

由於伺服器 b 下線,key 值為1的資料順時針最近的伺服器是 c ,所以資料存遷移到伺服器 c 上。

現實情況下,伺服器在一致性雜湊環上的位置不可能分布的這麼均勻,導致了每個節點實際佔據環上的區間大小不一。

這種情況下,可以增加虛節點來解決。通過增加虛節點,使得每個節點在環上所「管轄」的區域更加均勻。

這樣就既保證了在節點變化時,盡可能小的影響資料分布的變化,而同時又保證了資料分布的均勻。

md5 演算法

crc 演算法

murmurhash 演算法

fnv 演算法

ketama 演算法

一致性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...