Java教程分享:五分钟了解一致性hash算法
前言
一致性哈希算法的設(shè)計目標(biāo)是為了解決因特網(wǎng)中的熱點(diǎn)問題,現(xiàn)在也被廣泛應(yīng)用在分布式系統(tǒng)中。
比如針對負(fù)載均衡問題,對hash值取模的算法擴(kuò)展性差,當(dāng)增加或者減少服務(wù)器時,映射關(guān)系可能會出現(xiàn)問題,采用一致性hash算法,就能較好的解決該問題。
Hash值取模算法存在的問題
比如,我們有海量的圖片存儲在服務(wù)器上,假如,現(xiàn)在有4臺服務(wù)器,我們可以根據(jù)圖片名稱,采用hash算法,決定圖片存儲在哪臺服務(wù)器。
如果現(xiàn)在需要增加服務(wù)器,那么存取圖片的服務(wù)器的算法就會發(fā)生改變,比如增加一臺服務(wù)器后,算法變?yōu)閔ash(a.jpg)/5,這時候計算結(jié)果不一定還是2,那么圖片的位置就要發(fā)生改變。同理,減少服務(wù)器的話,也會存在相同問題。而且,所有的服務(wù)器都會受到影響。
一致性Hash算法
一致性Hash算法將哈希值映射的空間表示成一個虛擬圓環(huán),一般可以設(shè)置映射值的范圍是0----232-1,也就是說,我們得到的hash值要對232取模。該hash環(huán)可表示如下:
假如我們有四臺服務(wù)器,我們可以選擇服務(wù)器的ip或主機(jī)名作為關(guān)鍵字進(jìn)行哈希,然后取模,每臺機(jī)器就能在hash環(huán)上確定固定位置。如下圖所示:
例如有Object A、Object B、Object C、Object D四個數(shù)據(jù),經(jīng)過哈希運(yùn)算及取模后,在環(huán)空間上的位置如下圖所示:
從此位置沿環(huán)順時針“行走”,第一臺遇到的服務(wù)器就是其應(yīng)該定位到的服務(wù)器。也就是說Object A定位到Node A,Object B定位到Node B,Object C定位到Node C,Object D定位到Node D。
如果Node C這臺服務(wù)器出現(xiàn)問題宕機(jī),那么Objcet C定位到Node D這臺服務(wù)器,所以當(dāng)某臺服務(wù)器出問題時,只會對順時針方向的前一臺機(jī)器產(chǎn)生影響,本例中,只會對Node D有影響。
同理,如果增加一臺服務(wù)器Node X,計算后,定位到如下圖所示位置:
那么Object C就會定位到Node X,這種情況,只會對順時針方向的Node C產(chǎn)生影響,不會影響其他服務(wù)器。
一致性Hash的缺點(diǎn)
當(dāng)服務(wù)器節(jié)點(diǎn)比較少的時候會出現(xiàn)一致性hash算法傾斜的問題(大部分?jǐn)?shù)據(jù)存在一臺服務(wù)器上)。在不改變服務(wù)器節(jié)點(diǎn)個數(shù)的前提下,一般解決方案是增加虛擬節(jié)點(diǎn)(即對每一個服務(wù)器根據(jù)一致性hash算法計算多個值,每個計算結(jié)果在環(huán)上定位一個服務(wù)節(jié)點(diǎn)),在定位數(shù)據(jù)時,就可以根據(jù)虛擬節(jié)點(diǎn),定位到實(shí)際服務(wù)器。
總結(jié)
一致性哈希算法對于節(jié)點(diǎn)的增減都只需重定位環(huán)空間中的一小部分?jǐn)?shù)據(jù),具有較好的容錯性和可擴(kuò)展性。
本文來自千鋒教育,轉(zhuǎn)載請注明出處。
總結(jié)
以上是生活随笔為你收集整理的Java教程分享:五分钟了解一致性hash算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: web前端技术分享:使用react实现简
- 下一篇: Java教程分享:使用Spring框架能