五分钟了解一致性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四個數據,經過哈希運算及取模后,在環空間上的位置如下圖所示:
從此位置沿環順時針“行走”,第一臺遇到的服務器就是其應該定位到的服務器。也就是說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算法計算多個值,每個計算結果在環上定位一個服務節點),在定位數據時,就可以根據虛擬節點,定位到實際服務器。
總結
一致性哈希算法對于節點的增減都只需重定位環空間中的一小部分數據,具有較好的容錯性和可擴展性。
本文來自千鋒教育,轉載請注明出處。
總結
以上是生活随笔為你收集整理的五分钟了解一致性hash算法!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端教程分享:十行代码实现title滚动
- 下一篇: 一文带你了解Java的命名规范!