您好,登錄后才能下訂單哦!
這篇文章主要介紹“Java一致性哈希的特性是什么”,在日常操作中,相信很多人在Java一致性哈希的特性是什么問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Java一致性哈希的特性是什么”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
在解決分布式系統(tǒng)中負(fù)載均衡的問(wèn)題時(shí)候可以使用Hash算法讓固定的一部分請(qǐng)求落到同一臺(tái)服務(wù)器上,這樣每臺(tái)服務(wù)器固定處理一部分請(qǐng)求(并維護(hù)這些請(qǐng)求的信息),起到負(fù)載均衡的作用。
但是普通的余數(shù)hash(hash(比如用戶id)%服務(wù)器機(jī)器數(shù))算法伸縮性很差,當(dāng)新增或者下線服務(wù)器機(jī)器時(shí)候,用戶id與服務(wù)器的映射關(guān)系會(huì)大量失效。一致性hash則利用hash環(huán)對(duì)其進(jìn)行了改進(jìn)。
為了能直觀的理解一致性hash原理,這里結(jié)合一個(gè)簡(jiǎn)單的例子來(lái)講解,假設(shè)有4臺(tái)服務(wù)器,地址為ip1,ip2,ip3,ip4。
一致性hash是首先計(jì)算四個(gè)ip地址對(duì)應(yīng)的hash值
hash(ip1),hash(ip2),hash(ip3),hash(ip3),計(jì)算出來(lái)的hash值是0~最大正整數(shù)直接的一個(gè)值,這四個(gè)值在一致性hash環(huán)上呈現(xiàn)如下圖:
hash環(huán)上順時(shí)針從整數(shù)0開始,一直到最大正整數(shù),我們根據(jù)四個(gè)ip計(jì)算的hash值肯定會(huì)落到這個(gè)hash環(huán)上的某一個(gè)點(diǎn),至此我們把服務(wù)器的四個(gè)ip映射到了一致性hash環(huán)
當(dāng)用戶在客戶端進(jìn)行請(qǐng)求時(shí)候,首先根據(jù)hash(用戶id)計(jì)算路由規(guī)則(hash值),然后看hash值落到了hash環(huán)的那個(gè)地方,根據(jù)hash值在hash環(huán)上的位置順時(shí)針找距離最近的ip作為路由ip.
根據(jù)順時(shí)針規(guī)則可知user1,user2的請(qǐng)求會(huì)被服務(wù)器ip3進(jìn)行處理,而其它用戶的請(qǐng)求對(duì)應(yīng)的處理服務(wù)器不變,也就是只有之前被ip2處理的一部分用戶的映射關(guān)系被破壞了,并且其負(fù)責(zé)處理的請(qǐng)求被順時(shí)針下一個(gè)節(jié)點(diǎn)委托處理。
下面考慮當(dāng)新增機(jī)器的時(shí)候會(huì)出現(xiàn)什么情況?
當(dāng)新增一個(gè)ip5的服務(wù)器后,一致性hash環(huán)大致如下圖:
服務(wù)器ip1,ip2,ip3經(jīng)過(guò)hash后落到了一致性hash環(huán)上,從圖中hash值分布可知ip1會(huì)負(fù)責(zé)處理大概80%的請(qǐng)求,而ip2和ip3則只會(huì)負(fù)責(zé)處理大概20%的請(qǐng)求,雖然三個(gè)機(jī)器都在處理請(qǐng)求,但是明顯每個(gè)機(jī)器的負(fù)載不均衡,這樣稱為一致性hash的傾斜,虛擬節(jié)點(diǎn)的出現(xiàn)就是為了解決這個(gè)問(wèn)題。
當(dāng)服務(wù)器節(jié)點(diǎn)比較少的時(shí)候會(huì)出現(xiàn)上節(jié)所說(shuō)的一致性hash傾斜的問(wèn)題,一個(gè)解決方法是多加機(jī)器,但是加機(jī)器是有成本的,那么就加虛擬節(jié)點(diǎn),比如上面三個(gè)機(jī)器,每個(gè)機(jī)器引入1個(gè)虛擬節(jié)點(diǎn)后的一致性hash環(huán)的圖如下:
可知每個(gè)服務(wù)節(jié)點(diǎn)引入1個(gè)虛擬節(jié)點(diǎn)后,情況相比沒(méi)有引入前均衡性有所改善,但是并不均衡。
均勻一致性hash的目標(biāo)是如果服務(wù)器有N臺(tái),客戶端的hash值有M個(gè),那么每個(gè)服務(wù)器應(yīng)該處理大概M/N個(gè)用戶的。也就是每臺(tái)服務(wù)器負(fù)載盡量均衡
到此,關(guān)于“Java一致性哈希的特性是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。