一致性hash演算法虛擬節點 一致性hash演算法

2021-10-12 19:20:39 字數 2296 閱讀 4201

hash 演算法也叫做雜湊演算法,他可以讓任意長度的資料m對映成為長度固定的值h。

hash演算法的第乙個作用就是資料的快速儲存與查詢。寫過程式的人都知道,基本上主流的程式語言裡面都有個資料結構叫做map(dictionary或者 hash table)。它是根據key來直接訪問結果的資料結構。key的種類多種多樣,形式各異,怎麼通過key來快速查詢結果呢?如果將key通過一定的hash演算法變成通用一致的格式(索引),就可以實現這一功能。

同時,hash演算法也可以看做是一種加密演算法,但是這個加密演算法只有加密的過程沒有解密的過程,是不可逆的。各種加密貨幣中的金鑰體系或多或少都用到了hash演算法,其中比較有名的像:md4,md5,sha-1,sha-2,sha-3等。除了加密貨幣,hash的加密演算法在檔案校驗,數字簽名,鑑權協議等方面都有非常重要的作用。

根據hash演算法的定義,將任意長度的資料m對映成為固定長度的資料h(m),因此肯定存在不同的key對映到同乙個值的情況。作為密碼演算法的hash演算法主要關注的是雜湊函式是否均勻,而作為儲存和查詢的hash演算法則同時需要關注當產生衝突時候的解決辦法。

演算法是否均勻 演算法均勻是指使用這樣的演算法,不同的key計算出來的結果是均勻的,不會出現集中分布的情況,這個是hash演算法的基本要求,大多數hash演算法都能做到。

演算法是否單調 演算法是否單調是指,在新增資料節點之後,需要進行資料的重新分配,但是這種資料的分配只會出現在將現有節點的資料轉移到新增節點之上,而不會出現將現有節點的資料轉移到老資料節點的情況。這樣的好處就是盡量保證現有資料的位置不變,從而減少資料再分配過程中對系統效能的消耗。

分散性 在分布式環境中,由於網路的原因,並不是每個節點都能夠獲取到完整的全節點資訊,那麼在做資料雜湊的時候,有可能因為獲取到的全節點資訊不同而導致得出不同的雜湊結果,這也是好的一致性演算法應該要解決的問題。

一致性hash演算法是在2023年由麻省理工學院提出的一種分布式hash實現演算法。簡單點說就是使用常用的hash演算法將key對映到乙個具有2^32^次方個桶空間中,即0-(2^32^-1)的數字空間中。我們可以將其用乙個首尾相連的閉合環形表示,如下圖所示:

圖中列出了乙個虛擬的圓環,上面有0-2^32^個節點位置。演算法首先需要計算出儲存節點在圓環上的位置。具體可以選擇伺服器的ip或主機名作為關鍵字進行雜湊,這樣每台機器就能確定其在雜湊環上的位置。這一點是為了保證演算法的分散性:節點的位置跟具體多少個節點沒關係,只跟節點的內在特性有關係。

上圖我們假設有4個節點:node1,node2,node3,node4。計算好他們的位置之後,接下來我們就需要就計算出各個不同的key的儲存位置了:將key用同樣的演算法計算出hash值,從而確定其在資料環上的位置,然後從此位置沿著逆時針行走,遇到的第乙個伺服器就是該資料應該儲存的節點。

如下圖所示,我們有a,b,c,d四個資料物件,經過hash計算之後,其在圖中的位置和應該存在的節點位置如下:

其中a儲存在node1節點,b儲存在node2節點,c儲存在node3節點,d儲存在node4節點。

下面我們考慮下節點掛掉的情況,如下圖所示,當node4節點掛掉之後,按照一致性hash演算法的原則,a,b,c儲存節點不做任何變化,只有d節點會重新儲存到node1 上。如下圖所示:

同樣的,假如我們新增了乙個node5節點,其hash值在c和node3之間,則只有c的儲存位置需要轉移。如下圖所示:

由此可見,一致性hash演算法在系統節點變化的時候,只需要重定向一小部分資料的儲存位置,具有較強的容錯性和可擴充套件性。

當系統中節點很少的情況下,或者現有的節點計算出來的hash值比較接近的情況下,

如上圖所示,所有a-b這一段路徑上的資料都會儲存在node1上面,很明顯這會導致node1上面資料過多,不滿足系統分散性的需求。解決辦法就是我們可以創出一下虛擬節點,即對每乙個服務節點計算多個雜湊,每個計算結果位置都放置乙個此服務節點,如下圖所示:

這樣就可以解決資料傾斜的問題。

一致性hash演算法 面試必備 一致性hash演算法

最近公司在招人,我們準備的問題中有一道是關於一致性hash演算法的問題,只有一些面試者能夠回答上來,而且答的也不是很全面,有的面試者只是聽說過,有的連聽都沒聽過,下面我把一致性hash演算法整理一下分享給大家 一致性雜湊演算法在1997年由麻省理工學院的karger等人在解決分布式cache中提出的...

一致性hash演算法

july部落格16章開始 第一題 全排列,輸入乙個字串,列印出該字串中字元的所有排列 1.個人思路 回溯法建立的排序樹 2.july部落格 遞迴實現,依次固定第乙個字母,後面的交換,和上面描述的使用回溯法相似 c stl 演算法 next permutation的思想,關於next permutat...

一致性hash演算法

一致性雜湊演算法在1997年由麻省理工學院提出的一種分布式雜湊 dht 實現演算法,設計目標是為了解決網際網路中的熱點 hot spot 問題,初衷和carp十分類似。一致性雜湊修正了carp使用的簡 單雜湊演算法帶來的問題,使得分布式雜湊 dht 可以在p2p環境中真正得到應用。一致性hash演算...