好程序員帶你五分鐘瞭解一致性hash算法,一致性哈希算法的設計目標是爲了解決因特網中的熱點問題,如今也被普遍應用在分佈式系統中。
好比針對負載均衡問題,對hash值取模的算法擴展性差,當增長或者減小服務器時,映射關係可能會出現問題,採用一致性hash算法,就能較好的解決該問題。程序員
Hash值取模算法存在的問題
好比,咱們有海量的圖片存儲在服務器上,假如,如今有4臺服務器,咱們能夠根據圖片名稱,採用hash算法,決定圖片存儲在哪臺服務器算法
若是如今須要增長服務器,那麼存取圖片的服務器的算法就會發生改變,好比增長一臺服務器後,算法變爲hash(a.jpg)/5,這時候計算結果不必定仍是2,那麼圖片的位置就要發生改變。同理,減小服務器的話,也會存在相同問題。並且,全部的服務器都會受到影響。服務器
一致性Hash算法
一致性Hash算法將哈希值映射的空間表示成一個虛擬圓環,通常能夠設置映射值的範圍是0----232-1,也就是說,咱們獲得的hash值要對232取模。該hash環可表示以下:負載均衡
假如咱們有四臺服務器,咱們能夠選擇服務器的ip或主機名做爲關鍵字進行哈希,而後取模,每臺機器就能在hash環上肯定固定位置。以下圖所示:分佈式
例若有Object A、Object B、Object C、Object D四個數據,通過哈希運算及取模後,在環空間上的位置以下圖所示:spa
今後位置沿環順時針「行走」,第一臺遇到的服務器就是其應該定位到的服務器。也就是說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,計算後,定位到以下圖所示位置:設計
那麼Object C就會定位到Node X,這種狀況,只會對順時針方向的Node C產生影響,不會影響其餘服務器。
一致性Hash的缺點
當服務器節點比較少的時候會出現一致性hash算法傾斜的問題(大部分數據存在一臺服務器上)。在不改變服務器節點個數的前提下,通常解決方案是增長虛擬節點(即對每個服務器根據一致性hash算法計算多個值,每一個計算結果在環上定位一個服務節點),在定位數據時,就能夠根據虛擬節點,定位到實際服務器。
總結
一致性哈希算法對於節點的增減都只需重定位環空間中的一小部分數據,具備較好的容錯性和可擴展性。圖片