一致性Hash演算法

2021-07-22 10:32:16 字數 1817 閱讀 4091

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

但現在一致性hash演算法在分布式系統中也得到了廣泛應用,研究過memcached快取資料庫的人都知道,memcached伺服器端本身不提供分布式cache的一致性,而是由客戶端來提供,具體在計算一致性hash時採用如下步驟:

首先求出memcached伺服器(節點)的雜湊值,並將其配置到0~232的圓(continuum)上。

然後採用同樣的方法求出儲存資料的鍵的雜湊值,並對映到相同的圓上。

然後從資料對映到的位置開始順時針查詢,將資料儲存到找到的第乙個伺服器上。如果超過232仍然找不到伺服器,就會儲存到第一台memcached伺服器上。

從上圖的狀態中新增一台memcached伺服器。餘數分布式演算法由於儲存鍵的伺服器會發生巨大變化而影響快取的命中率,但consistent hashing中,只有在園(continuum)上增加伺服器的地點逆時針方向的第一台伺服器上的鍵會受到影響,如下圖所示:

考慮到分布式系統每個節點都有可能失效,並且新的節點很可能動態的增加進來,如何保證當系統的節點數目發生變化時仍然能夠對外提供良好的服務,這是值得考慮的,尤其實在設計分布式快取系統時,如果某台伺服器失效,對於整個系統來說如果不採用合適的演算法來保證一致性,那麼快取於系統中的所有資料都可能會失效(即由於系統節點數目變少,客戶端在請求某一物件時需要重新計算其hash值(通常與系統中的節點數目有關),由於hash值已經改變,所以很可能找不到儲存該物件的伺服器節點),因此一致性hash就顯得至關重要,良好的分布式cahce系統中的一致性hash演算法應該滿足以下幾個方面:

平衡性是指雜湊的結果能夠盡可能分布到所有的緩衝中去,這樣可以使得所有的緩衝空間都得到利用。很多雜湊演算法都能夠滿足這一條件。

單調性是指如果已經有一些內容通過雜湊分派到了相應的緩衝中,又有新的緩衝區加入到系統中,那麼雜湊的結果應能夠保證原有已分配的內容可以被對映到新的緩衝區中去,而不會被對映到舊的緩衝集合中的其他緩衝區。簡單的雜湊演算法往往不能滿足單調性的要求,如最簡單的線性雜湊:x = (ax + b) mod (p),在上式中,p表示全部緩衝的大小。不難看出,當緩衝大小發生變化時(從p1到p2),原來所有的雜湊結果均會發生變化,從而不滿足單調性的要求。雜湊結果的變化意味著當緩衝空間發生變化時,所有的對映關係需要在系統內全部更新。而在p2p系統內,緩衝的變化等價於peer加入或退出系統,這一情況在p2p系統中會頻繁發生,因此會帶來極大計算和傳輸負荷。單調性就是要求雜湊演算法能夠應對這種情況。

在分布式環境中,終端有可能看不到所有的緩衝,而是只能看到其中的一部分。當終端希望通過雜湊過程將內容對映到緩衝上時,由於不同終端所見的緩衝範圍有可能不同,從而導致雜湊的結果不一致,最終的結果是相同的內容被不同的終端對映到不同的緩衝區中。這種情況顯然是應該避免的,因為它導致相同內容被儲存到不同緩衝中去,降低了系統儲存的效率。分散性的定義就是上述情況發生的嚴重程度。好的雜湊演算法應能夠盡量避免不一致的情況發生,也就是盡量降低分散性。

負載問題實際上是從另乙個角度看待分散性問題。既然不同的終端可能將相同的內容對映到不同的緩衝區中,那麼對於乙個特定的緩衝區而言,也可能被不同的使用者對映為不同的內容。與分散性一樣,這種情況也是應當避免的,因此好的雜湊演算法應能夠盡量降低緩衝的負荷。

平滑性是指快取伺服器的數目平滑改變和快取物件的平滑改變是一致的。

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