最近公司在招人,我們準備的問題中有一道是關於一致性hash演算法的問題,只有一些面試者能夠回答上來,而且答的也不是很全面,有的面試者只是聽說過,有的連聽都沒聽過,下面我把一致性hash演算法整理一下分享給大家
一致性雜湊演算法在2023年由麻省理工學院的karger等人在解決分布式cache中提出的,設計目標是為了解決網際網路中的熱點(hot spot)問題,初衷和carp十分類似。一致性雜湊修正了carp使用的簡單雜湊演算法帶來的問題,使得dht可以在p2p環境中真正得到應用
一致性hash用於分布式快取系統,將key值對映到具體機器ip上,並且增加和刪除1臺機器的資料移動量較小
比如你有 n 個 redis 伺服器(後面簡稱 redis ),那麼如何將乙個物件 object 對映到 n 個 redis 上呢,你很可能會採用類似下面的通用方法計算 object 的 hash 值,然後均勻的對映到到 n 個 cache
求餘演算法: hash(object)%n
這種通用的計算方法有什麼問題呢?
1. 乙個 redis 伺服器 x 宕 掉了,這樣所有對映到 redis x 的物件都會失效,怎麼辦,需要把 redis x 從 redis集群中移除,這時候 redis伺服器 是 n-1 臺le,那麼對應對映公式變成了 hash(object)%(n-1) ;
2.還有一種情況是由於訪問量增多,需要新增 redis ,這時候 redis 是 n+1 臺,對映公式變成了 hash(object)%(n+1) ;
1 和 2 意味著什麼?這意味著突然之間幾乎所有的 redis快取都失效了。對於伺服器而言,這是一場災難,所有的訪問都會直接衝向後台伺服器,對後台伺服器造成壓力,甚至是後台伺服器癱瘓。
如何解決上面的問題呢?一致性hash演算法就派上用場了
一致性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環。
那麼,一致性雜湊演算法與上圖中的圓環有什麼關係呢?我們繼續聊,以之前描述的場景為例,假設我們有4臺快取伺服器,node1、node2、node3,node4,那麼,在生產環境中,這4臺伺服器肯定有自己的ip位址或主機名,我們使用它們各自的ip位址或主機名作為關鍵字進行雜湊計算,使用雜湊後的結果對2^32取模,可以使用如下公式示意
hash(node1的ip位址) % 2^32
通過上面公式算出的計算一定能得到乙個0到2^32-1之間的整數,我們就用得出的整數,代表伺服器node1,既然這個整數肯定處於0到2^32-1之間,那麼,上圖中的hash環上必定有乙個點與這個整數對應,我們剛才已經說過了,使用這個整數代表伺服器node1,那麼,伺服器node1就可以對映到這個環上了,其他伺服器一次類推即可得到相應的位置。
接下來使用如下演算法定位資料訪問到相應伺服器:將資料key使用相同的函式hash計算出雜湊值,並確定此資料在環上的位置,從此位置沿環順時針「行走」,遇到的第一台伺服器就是該資料應該對映到的伺服器,如圖:
我想看了上面的例子大家應該已經理解了一致性hash的優勢了,如果伺服器node1節點宕掉,那麼object1的資料會根據規則對映到最近的伺服器node3上,同理如果增加一台伺服器那麼影響的也只是一小部分資料,一小部分資料會跟著規則遷移到新增伺服器上
一致性hash演算法虛擬節點 一致性hash演算法
hash 演算法也叫做雜湊演算法,他可以讓任意長度的資料m對映成為長度固定的值h。hash演算法的第乙個作用就是資料的快速儲存與查詢。寫過程式的人都知道,基本上主流的程式語言裡面都有個資料結構叫做map dictionary或者 hash table 它是根據key來直接訪問結果的資料結構。key的...
一致性hash演算法
july部落格16章開始 第一題 全排列,輸入乙個字串,列印出該字串中字元的所有排列 1.個人思路 回溯法建立的排序樹 2.july部落格 遞迴實現,依次固定第乙個字母,後面的交換,和上面描述的使用回溯法相似 c stl 演算法 next permutation的思想,關於next permutat...
一致性hash演算法
一致性雜湊演算法在1997年由麻省理工學院提出的一種分布式雜湊 dht 實現演算法,設計目標是為了解決網際網路中的熱點 hot spot 問題,初衷和carp十分類似。一致性雜湊修正了carp使用的簡 單雜湊演算法帶來的問題,使得分布式雜湊 dht 可以在p2p環境中真正得到應用。一致性hash演算...