Java教程分享:五分鐘瞭解一致性hash演算法

千鋒武漢發表於2021-05-06

   前言

  一致性雜湊演算法的設計目標是為了解決因特網中的熱點問題,現在也被廣泛應用在分散式系統中。

  比如針對負載均衡問題,對hash值取模的演算法擴充套件性差,當增加或者減少伺服器時,對映關係可能會出現問題,採用一致性hash演算法,就能較好的解決該問題。

   Hash值取模演算法存在的問題

  比如,我們有海量的圖片儲存在伺服器上,假如,現在有4臺伺服器,我們可以根據圖片名稱,採用hash演算法,決定圖片儲存在哪臺伺服器。

圖片1

  如果現在需要增加伺服器,那麼存取圖片的伺服器的演算法就會發生改變,比如增加一臺伺服器後,演算法變為hash(a.jpg)/5,這時候計算結果不一定還是2,那麼圖片的位置就要發生改變。同理,減少伺服器的話,也會存在相同問題。而且,所有的伺服器都會受到影響。

   一致性Hash演算法

  一致性Hash演算法將雜湊值對映的空間表示成一個虛擬圓環,一般可以設定對映值的範圍是0----232-1,也就是說,我們得到的hash值要對232取模。該hash環可表示如下:

圖片2

  假如我們有四臺伺服器,我們可以選擇伺服器的ip或主機名作為關鍵字進行雜湊,然後取模,每臺機器就能在hash環上確定固定位置。如下圖所示:

圖片3

  例如有Object A、Object B、Object C、Object D四個資料,經過雜湊運算及取模後,在環空間上的位置如下圖所示:

圖片4

  從此位置沿環順時針“行走”,第一臺遇到的伺服器就是其應該定位到的伺服器。也就是說Object A定位到Node A,Object B定位到Node B,Object C定位到Node C,Object D定位到Node D。

  如果Node C這臺伺服器出現問題當機,那麼Objcet C定位到Node D這臺伺服器,所以當某臺伺服器出問題時,只會對順時針方向的前一臺機器產生影響,本例中,只會對Node D有影響。

  同理,如果增加一臺伺服器Node X,計算後,定位到如下圖所示位置:

圖片5

  那麼Object C就會定位到Node X,這種情況,只會對順時針方向的Node C產生影響,不會影響其他伺服器。

   一致性Hash的缺點

  當伺服器節點比較少的時候會出現一致性hash演算法傾斜的問題(大部分資料存在一臺伺服器上)。在不改變伺服器節點個數的前提下,一般解決方案是增加虛擬節點(即對每一個伺服器根據一致性hash演算法計算多個值,每個計算結果在環上定位一個服務節點),在定位資料時,就可以根據虛擬節點,定位到實際伺服器。

  總結

  一致性雜湊演算法對於節點的增減都只需重定位環空間中的一小部分資料,具有較好的容錯性和可擴充套件性。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31548651/viewspace-2770936/,如需轉載,請註明出處,否則將追究法律責任。

相關文章