1. 程式人生 > 其它 >一致性雜湊演算法

一致性雜湊演算法

背景

一致性雜湊演算法在1997年由麻省理工學院的Karger等人在解決分散式Cache中提出的,設計目標是為了解決因特網中的熱點(Hot spot)問題,初衷和CARP十分類似。一致性雜湊修正了CARP使用的簡單雜湊演算法帶來的問題,使得DHT可以在P2P環境中真正得到應用。

演算法思路

  • 將整個雜湊值空間組織成一個虛擬的圓環,如假設某雜湊函式H的值空間為0-2^32-1(即雜湊值是一個32位無符號整形),整個雜湊環如下:
  • 整個空間按順時針方向組織,圓環的正上方的點代表0,0點右側的第一個點代表1,以此類推,2、3、4、5、6……直到232-1,也就是說0點左側的第一個點代表232-1, 0和232-1在零點中方向重合,我們把這個由2

    32個點組成的圓環稱為Hash環。

  • 下一步將各個伺服器使用Hash進行一個雜湊,具體可以選擇伺服器的IP或主機名作為關鍵字進行雜湊,這樣每臺機器就能確定其在雜湊環上的位置

  • 接下來使用如下演算法定位資料訪問到相應伺服器:將資料key使用相同的函式Hash計算出雜湊值,並確定此資料在環上的位置,從此位置沿環順時針“行走”,第一臺遇到的伺服器就是其應該定位到的伺服器!

    例如我們有Object A、Object B、Object C、Object D四個資料物件,經過雜湊計算後,在環空間上的位置如下:

  • 根據一致性Hash演算法,資料A會被定為到Node A上,B被定為到Node B上,C被定為到Node C上,D被定為到Node D上。

負載均衡

普通雜湊

擴縮容後,命中率大大降低,帶來了快取穿透的問題。

倍增擴容

成倍擴容能有效解決擴容後帶來的快取穿透問題,但這樣做會造成資源的浪費。

一致性雜湊

擴縮容後,只會影響其中的一個節點的資料,命中率只降低1/N。

資料傾斜

一致性雜湊演算法要得到較好的效果,取決於各個實體節點在雜湊環的分佈情況,是否能分散。

為了解決資料很可能分佈不均勻的情況,對一致性雜湊演算法,提出了改進,引入了虛擬節點的,可以設定一個雜湊環中存在多少個虛擬節點,然後將虛擬節點對映到實體節點,從而解決資料分佈吧均衡的問題。

不過,也帶來了如下問題:

  1. 虛擬節點對映到實體節點。
  2. 節點過多,效能降低。

節點hash值計算方法:

真實節點:hashcode(keyA)、hashcode(keyB)

虛擬節點:hashcode(keyA#1)、hashcode(keyB#1) 、hashcode(keyA#2)、hashcode(keyB#2)

優缺點

優點:分散式擴容、縮容能有效避免快取穿透的問題。

缺點:實現複雜,效能低下,運維管理複雜。

負載均衡演算法選擇

如果服務是無狀態的,選擇:輪循、加權輪循、隨機、加權隨機演算法。

如果服務是有狀態的,選擇:一致性雜湊演算法。

目前來說,一致性雜湊演算法有點被濫用的趨勢。