一致性HASH演算法

2021-08-19 18:55:07 字數 838 閱讀 4355

在分布式快取系統中,需要將資料均勻的分布到快取伺服器集群的不同機器上,就需要使用對快取的資料的key做hash值計算, 然後在將hash值除以伺服器節點的數量取模計算出資料需要落到那台伺服器節點上。這種演算法很簡單,也可以實現資料的均勻分布, 但是,增加或者減少資料節點的時候會導致所有快取資料失效。

例如10條資料,3個節點,如果按照取模的方式,那就是

當增加乙個節點的時候,資料分布就變更為

總結:資料3,4,5,6,7,8,9在增加節點的時候,都需要做搬遷,成本太高。

最關鍵的區別就是,對節點和資料,都做一次雜湊運算,然後比較節點和資料的雜湊值,資料取和節點最相近的節點做為存放節點。 這樣就保證當節點增加或者減少的時候,影響的資料最少。 還是拿剛剛的例子,(用簡單的字串的ascii碼做雜湊key):

十條資料,算出各自的雜湊值

有三個節點,算出各自的雜湊值

這個時候比較兩者的雜湊值,如果大於228,就歸到前面的203,相當於整個雜湊值就是乙個環,對應的對映結果:

這個時候加入node n, 就可以算出node n的雜湊值:

這個時候對應的資料就會做遷移:

這個時候只有5和6需要做遷移

另外,這個時候如果只算出三個雜湊值,那再跟資料的雜湊值比較的時候,很容易分得不均衡,因此就引入了虛擬節點的概念, 通過把三個節點加上id字尾等方式,每個節點算出n個雜湊值,均勻的放在雜湊環上,這樣對於資料算出的雜湊值, 能夠比較雜湊的分布

通過這種演算法做資料分布,在增減節點的時候,可以大大減少資料的遷移規模。

伺服器節點根據hash來分布,有時候會出現不均勻的情況,就會導致資料分布的不均勻, 通過增加虛擬節點,使得伺服器節點總數大幅增加,從而散落到hash環上就會更加均勻。

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