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