一致性哈希 與 普通哈希對(duì)比
原創(chuàng)作品,允許轉(zhuǎn)載,轉(zhuǎn)載時(shí)請(qǐng)務(wù)必以超鏈接形式標(biāo)明文章原始出處、作者信息和本聲明。否則將追究法律責(zé)任。http://xinsir.blog.51cto.com/5038915/1532872
正文 begin
普通哈希算法
假如有cache主機(jī)5臺(tái)分別為cacheA、cacheB、cacheC、cacheD、cacheE
當(dāng)程序進(jìn)行hash時(shí),首先每個(gè)節(jié)點(diǎn)要根據(jù)自己的唯一參數(shù)哈希出一個(gè)值來(lái)(如根據(jù)ip進(jìn)行哈希)
主機(jī)哈希完成后形成的哈希值如下
cacheA?????? 0
cacheB???????1
cacheC?????? 2
cacheD?????? 3
cacheE?????? 4
主機(jī)形成哈希值后,我們以緩存來(lái)做實(shí)例,比如某個(gè)用戶(hù)登錄后會(huì)有一個(gè)唯一的pin值,然后根據(jù)
這個(gè)pin值進(jìn)行hash求余。因?yàn)榍笥嗍怯?來(lái)求余,所以數(shù)值肯定會(huì)小宇5 因此就有了落點(diǎn),然后把
緩存數(shù)據(jù)進(jìn)行緩存到落點(diǎn)服務(wù)器中
一致性哈希算法
假如有cache主機(jī)5臺(tái)分別為cacheA、cacheB、cacheC、cacheD、cacheE
當(dāng)程序進(jìn)行hash時(shí),首先每個(gè)節(jié)點(diǎn)要根據(jù)自己的唯一參數(shù)哈希出一個(gè)值來(lái)(如根據(jù)ip進(jìn)行哈希)
主機(jī)哈希完成后形成的哈希值如下
cacheA?????? key1
cacheB???????key2
cacheC?????? key3
cacheD?????? key4
cacheE?????? key5
然后5臺(tái)節(jié)點(diǎn)圍繞稱(chēng)一個(gè)環(huán)形,如圖

主機(jī)形成哈希值后,我們以緩存來(lái)做實(shí)例,比如某個(gè)用戶(hù)登錄后會(huì)有一個(gè)唯一的pin值,然后根據(jù)
這個(gè)pin值進(jìn)行hash。這里注意和普通hash不一樣的就是這里只hash不求余,當(dāng)hash出一個(gè)數(shù)值
后,查看這個(gè)這個(gè)值介于那兩個(gè)值之間比如介于key4和key5之間,然后從這個(gè)落點(diǎn)開(kāi)始順時(shí)針查
找遇到第一個(gè)cache服務(wù)器后就把這個(gè)服務(wù)器當(dāng)作此次緩存的落點(diǎn),從而把這個(gè)緩存放到這個(gè)落點(diǎn)
上。如圖:

兩者比較:
經(jīng)過(guò)上面的介紹我們能看出,假如普通的哈希當(dāng)其中任意一臺(tái)機(jī)器down掉后,我們整個(gè)的
緩存都將安然無(wú)存,為什么這么說(shuō)呢?
因?yàn)楫?dāng)某臺(tái)cache down掉后我們需要重選算落點(diǎn),除數(shù)已經(jīng)變了,所以都要重新set緩存,
當(dāng)然不排除有一些兩個(gè)pin值算的落點(diǎn)是一樣的,但是當(dāng)cache服務(wù)器增加到一定數(shù)量后,前面所
說(shuō)的可能性幾乎為0,所以稱(chēng)之為全部緩存都要重新set。
而使用一致性哈希當(dāng)其中一臺(tái)機(jī)器down掉后,只有它上面到它這一段的環(huán)路緩存失效了,如:
當(dāng)cache3 down掉后,那落掉在cache2到cache3之間的pin都將失效,那么失效的落點(diǎn)講繼續(xù)順時(shí)
針查找cache服務(wù)器,那么新的落點(diǎn)都將落到cache4上。