日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
一致性Hash(ConsistentHashing)原理剖析

前面一篇文章通過(guò)生活化的場(chǎng)景為例,來(lái)描述RPC中的一些核心且常用的技術(shù),(RPC是什么?為什么要學(xué)習(xí)RPC?)在負(fù)載均衡的時(shí)候,我們提到一個(gè)「一致性Hash」, 這個(gè)在RPC之外的許多場(chǎng)景也會(huì)使用到。

創(chuàng)新互聯(lián)建站是一家專業(yè)提供化州企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站設(shè)計(jì)制作、網(wǎng)站建設(shè)、H5高端網(wǎng)站建設(shè)、小程序制作等業(yè)務(wù)。10年已為化州眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進(jìn)行中。

引入

在業(yè)務(wù)開(kāi)發(fā)中,我們常把數(shù)據(jù)持久化到數(shù)據(jù)庫(kù)中。如果需要讀取這些數(shù)據(jù),除了直接從數(shù)據(jù)庫(kù)中讀取外,為了減輕數(shù)據(jù)庫(kù)的訪問(wèn)壓力以及提高訪問(wèn)速度,我們更多地引入緩存來(lái)對(duì)數(shù)據(jù)進(jìn)行存取。讀取數(shù)據(jù)的過(guò)程一般為:

圖1:加入緩存的數(shù)據(jù)讀取過(guò)程

對(duì)于分布式緩存,不同機(jī)器上存儲(chǔ)不同對(duì)象的數(shù)據(jù)。為了實(shí)現(xiàn)這些緩存機(jī)器的負(fù)載均衡,可以使用式子1來(lái)定位對(duì)象緩存的存儲(chǔ)機(jī)器:

 
 
 
 
  1. m = hash(o) mod n ——式子1 

其中,o為對(duì)象的名稱,n為機(jī)器的數(shù)量,m為機(jī)器的編號(hào),hash為一hash函數(shù)。圖2中的負(fù)載均衡器(load balancer)正是使用式子1來(lái)將客戶端對(duì)不同對(duì)象的請(qǐng)求分派到不同的機(jī)器上執(zhí)行,例如,對(duì)于對(duì)象o,經(jīng)過(guò)式子1的計(jì)算,得到m的值為3,那么所有對(duì)對(duì)象o的讀取和存儲(chǔ)的請(qǐng)求都被發(fā)往機(jī)器3執(zhí)行。

圖2:如何利用Hash取模實(shí)現(xiàn)負(fù)載均衡

式子1在大部分時(shí)候都可以工作得很好,然而,當(dāng)機(jī)器需要擴(kuò)容或者機(jī)器出現(xiàn)宕機(jī)的情況下,事情就比較棘手了。

當(dāng)機(jī)器擴(kuò)容,需要增加一臺(tái)緩存機(jī)器時(shí),負(fù)載均衡器使用的式子變成:

 
 
 
 
  1. m = hash(o) mod (n + 1) ——式子2 

當(dāng)機(jī)器宕機(jī),機(jī)器數(shù)量減少一臺(tái)時(shí),負(fù)載均衡器使用的式子變成:

 
 
 
 
  1. m = hash(o) mod (n - 1) ——式子3 

我們以機(jī)器擴(kuò)容的情況為例,說(shuō)明簡(jiǎn)單的取模方法會(huì)導(dǎo)致什么問(wèn)題。假設(shè)機(jī)器由3臺(tái)變成4臺(tái),對(duì)象o1由式子1計(jì)算得到的m值為2,由式子2計(jì)算得到的m值卻可能為0,1,2,3(一個(gè) 3t + 2的整數(shù)對(duì)4取模,其值可能為0,1,2,3,讀者可以自行驗(yàn)證),大約有75%(3/4)的可能性出現(xiàn)緩存訪問(wèn)不***的現(xiàn)象。隨著機(jī)器集群規(guī)模的擴(kuò)大,這個(gè)比例線性上升。當(dāng)99臺(tái)機(jī)器再加入1臺(tái)機(jī)器時(shí),不***的概率是99%(99/100)。這樣的結(jié)果顯然是不能接受的,因?yàn)檫@會(huì)導(dǎo)致數(shù)據(jù)庫(kù)訪問(wèn)的壓力陡增,嚴(yán)重情況,還可能導(dǎo)致數(shù)據(jù)庫(kù)宕機(jī)。

一致性hash算法正是為了解決此類問(wèn)題的方法,它可以保證當(dāng)機(jī)器增加或者減少時(shí),對(duì)緩存訪問(wèn)***的概率影響減至很小。下面我們來(lái)詳細(xì)說(shuō)一下一致性hash算法的具體過(guò)程。

一致性Hash環(huán)

一致性hash算法通過(guò)一個(gè)叫作一致性hash環(huán)的數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)。這個(gè)環(huán)的起點(diǎn)是0,終點(diǎn)是2^32 - 1,并且起點(diǎn)與終點(diǎn)連接,環(huán)的中間的整數(shù)按逆時(shí)針?lè)植?,故這個(gè)環(huán)的整數(shù)分布范圍是[0, 2^32-1],如下圖3所示:

圖3:一致性Hash環(huán)

將對(duì)象放置到Hash環(huán)

假設(shè)現(xiàn)在我們有4個(gè)對(duì)象,分別為o1,o2,o3,o4,使用hash函數(shù)計(jì)算這4個(gè)對(duì)象的hash值(范圍為0 ~ 2^32-1):

 
 
 
 
  1. hash(o1) = m1  
  2. hash(o2) = m2  
  3. hash(o3) = m3  
  4. hash(o4) = m4 

把m1,m2,m3,m4這4個(gè)值放置到hash環(huán)上,得到如下圖4:

圖4:放置了對(duì)象的一致性Hash環(huán)

將機(jī)器放置到Hash環(huán)

使用同樣的hash函數(shù),我們將機(jī)器也放置到hash環(huán)上。假設(shè)我們有三臺(tái)緩存機(jī)器,分別為 c1,c2,c3,使用hash函數(shù)計(jì)算這3臺(tái)機(jī)器的hash值:

 
 
 
 
  1. hash(c1) = t1  
  2. hash(c2) = t2  
  3. hash(c3) = t3 

把t1,t2,t3 這3個(gè)值放置到hash環(huán)上,得到如下圖5:

圖5:放置了機(jī)器的一致性Hash環(huán)

為對(duì)象選擇機(jī)器

將對(duì)象和機(jī)器都放置到同一個(gè)hash環(huán)后,在hash環(huán)上順時(shí)針查找距離這個(gè)對(duì)象的hash值最近的機(jī)器,即是這個(gè)對(duì)象所屬的機(jī)器。

例如,對(duì)于對(duì)象o2,順序針找到最近的機(jī)器是c1,故機(jī)器c1會(huì)緩存對(duì)象o2。而機(jī)器c2則緩存o3,o4,機(jī)器c3則緩存對(duì)象o1。

圖6:在一致性Hash環(huán)上為對(duì)象選擇機(jī)器

處理機(jī)器增減的情況

對(duì)于線上的業(yè)務(wù),增加或者減少一臺(tái)機(jī)器的部署是常有的事情。

例如,增加機(jī)器c4的部署并將機(jī)器c4加入到hash環(huán)的機(jī)器c3與c2之間。這時(shí),只有機(jī)器c3與c4之間的對(duì)象需要重新分配新的機(jī)器。對(duì)于我們的例子,只有對(duì)象o4被重新分配到了c4,其他對(duì)象仍在原有機(jī)器上。如圖7所示:

圖7:增加機(jī)器后的一致性Hash環(huán)的結(jié)構(gòu)

如上文前面所述,使用簡(jiǎn)單的求模方法,當(dāng)新添加機(jī)器后會(huì)導(dǎo)致大部分緩存失效的情況,使用一致性hash算法后這種情況則會(huì)得到大大的改善。前面提到3臺(tái)機(jī)器變成4臺(tái)機(jī)器后,緩存***率只有25%(不***率75%)。而使用一致性hash算法,理想情況下緩存***率則有75%,而且,隨著機(jī)器規(guī)模的增加,***率會(huì)進(jìn)一步提高,99臺(tái)機(jī)器增加一臺(tái)后,***率達(dá)到99%,這大大減輕了增加緩存機(jī)器帶來(lái)的數(shù)據(jù)庫(kù)訪問(wèn)的壓力。

再例如,將機(jī)器c1下線(當(dāng)然,也有可能是機(jī)器c1宕機(jī)),這時(shí),只有原有被分配到機(jī)器c1對(duì)象需要被重新分配到新的機(jī)器。對(duì)于我們的例子,只有對(duì)象o2被重新分配到機(jī)器c3,其他對(duì)象仍在原有機(jī)器上。如圖8所示:

圖8:減少機(jī)器后的一致性Hash環(huán)的結(jié)構(gòu)

虛擬節(jié)點(diǎn)

上面提到的過(guò)程基本上就是一致性hash的基本原理了,不過(guò)還有一個(gè)小小的問(wèn)題。新加入的機(jī)器c4只分擔(dān)了機(jī)器c2的負(fù)載,機(jī)器c1與c3的負(fù)載并沒(méi)有因?yàn)闄C(jī)器c4的加入而減少負(fù)載壓力。如果4臺(tái)機(jī)器的性能是一樣的,那么這種結(jié)果并不是我們想要的。

為此,我們引入虛擬節(jié)點(diǎn)來(lái)解決負(fù)載不均衡的問(wèn)題。

將每臺(tái)物理機(jī)器虛擬為一組虛擬機(jī)器,將虛擬機(jī)器放置到hash環(huán)上,如果需要確定對(duì)象的機(jī)器,先確定對(duì)象的虛擬機(jī)器,再由虛擬機(jī)器確定物理機(jī)器。

說(shuō)得有點(diǎn)復(fù)雜,其實(shí)過(guò)程也很簡(jiǎn)單。

還是使用上面的例子,假如開(kāi)始時(shí)存在緩存機(jī)器c1,c2,c3,對(duì)于每個(gè)緩存機(jī)器,都有3個(gè)虛擬節(jié)點(diǎn)對(duì)應(yīng),其一致性hash環(huán)結(jié)構(gòu)如圖9所示:

圖9:機(jī)器c1,c2,c3的一致性Hash環(huán)結(jié)構(gòu)

假設(shè)對(duì)于對(duì)象o1,其對(duì)應(yīng)的虛擬節(jié)點(diǎn)為c11,而虛擬節(jié)點(diǎn)c11對(duì)象緩存機(jī)器c1,故對(duì)象o1被分配到機(jī)器c1中。

新加入緩存機(jī)器c4,其對(duì)應(yīng)的虛擬節(jié)點(diǎn)為c41,c42,c43,將這三個(gè)虛擬節(jié)點(diǎn)添加到hash環(huán)中,得到的hash環(huán)結(jié)構(gòu)如圖10所示:

圖10:機(jī)器c1,c2,c3,c4的一致性Hash環(huán)結(jié)構(gòu)

新加入的緩存機(jī)器c4對(duì)應(yīng)一組虛擬節(jié)點(diǎn)c41,c42,c43,加入到hash環(huán)后,影響的虛擬節(jié)點(diǎn)包括c31,c22,c11(順時(shí)針查找到***個(gè)節(jié)點(diǎn)),而這3個(gè)虛擬節(jié)點(diǎn)分別對(duì)應(yīng)機(jī)器c3,c2,c1。即新加入的一臺(tái)機(jī)器,同時(shí)影響到原有的3臺(tái)機(jī)器。理想情況下,新加入的機(jī)器平等地分擔(dān)了原有機(jī)器的負(fù)載,這正是虛擬節(jié)點(diǎn)帶來(lái)的好處。而且新加入機(jī)器c4后,只影響25%(1/4)對(duì)象分配,也就是說(shuō),***率仍然有75%,這跟沒(méi)有使用虛擬節(jié)點(diǎn)的一致性hash算法得到的結(jié)果是相同的。

總結(jié)

一致性hash算法解決了分布式環(huán)境下機(jī)器增加或者減少時(shí),簡(jiǎn)單的取模運(yùn)算無(wú)法獲取較高***率的問(wèn)題。通過(guò)虛擬節(jié)點(diǎn)的使用,一致性hash算法可以均勻分擔(dān)機(jī)器的負(fù)載,使得這一算法更具現(xiàn)實(shí)的意義。正因如此,一致性hash算法被廣泛應(yīng)用于分布式系統(tǒng)中。

【本文為專欄作者“侯樹(shù)成”的原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)通過(guò)作者微信公眾號(hào)『Tomcat那些事兒』獲取授權(quán)】

戳這里,看該作者更多好文


網(wǎng)站名稱:一致性Hash(ConsistentHashing)原理剖析
網(wǎng)頁(yè)地址:http://m.5511xx.com/article/dpcdigd.html