一致性哈希 與 普通哈希對比
原創(chuàng)作品,允許轉(zhuǎn)載,轉(zhuǎn)載時請務(wù)必以超鏈接形式標(biāo)明文章原始出處、作者信息和本聲明。否則將追究法律責(zé)任。http://xinsir.blog.51cto.com/5038915/1532872
正文 begin
普通哈希算法
假如有cache主機5臺分別為cacheA、cacheB、cacheC、cacheD、cacheE
當(dāng)程序進(jìn)行hash時,首先每個節(jié)點要根據(jù)自己的唯一參數(shù)哈希出一個值來(如根據(jù)ip進(jìn)行哈希)
主機哈希完成后形成的哈希值如下
cacheA?????? 0
cacheB???????1
cacheC?????? 2
cacheD?????? 3
cacheE?????? 4
主機形成哈希值后,我們以緩存來做實例,比如某個用戶登錄后會有一個唯一的pin值,然后根據(jù)
這個pin值進(jìn)行hash求余。因為求余是用5來求余,所以數(shù)值肯定會小宇5 因此就有了落點,然后把
緩存數(shù)據(jù)進(jìn)行緩存到落點服務(wù)器中
一致性哈希算法
假如有cache主機5臺分別為cacheA、cacheB、cacheC、cacheD、cacheE
當(dāng)程序進(jìn)行hash時,首先每個節(jié)點要根據(jù)自己的唯一參數(shù)哈希出一個值來(如根據(jù)ip進(jìn)行哈希)
主機哈希完成后形成的哈希值如下
cacheA?????? key1
cacheB???????key2
cacheC?????? key3
cacheD?????? key4
cacheE?????? key5
然后5臺節(jié)點圍繞稱一個環(huán)形,如圖
主機形成哈希值后,我們以緩存來做實例,比如某個用戶登錄后會有一個唯一的pin值,然后根據(jù)
這個pin值進(jìn)行hash。這里注意和普通hash不一樣的就是這里只hash不求余,當(dāng)hash出一個數(shù)值
后,查看這個這個值介于那兩個值之間比如介于key4和key5之間,然后從這個落點開始順時針查
找遇到第一個cache服務(wù)器后就把這個服務(wù)器當(dāng)作此次緩存的落點,從而把這個緩存放到這個落點
上。如圖:
兩者比較:
經(jīng)過上面的介紹我們能看出,假如普通的哈希當(dāng)其中任意一臺機器down掉后,我們整個的
緩存都將安然無存,為什么這么說呢?
因為當(dāng)某臺cache down掉后我們需要重選算落點,除數(shù)已經(jīng)變了,所以都要重新set緩存,
當(dāng)然不排除有一些兩個pin值算的落點是一樣的,但是當(dāng)cache服務(wù)器增加到一定數(shù)量后,前面所
說的可能性幾乎為0,所以稱之為全部緩存都要重新set。
而使用一致性哈希當(dāng)其中一臺機器down掉后,只有它上面到它這一段的環(huán)路緩存失效了,如:
當(dāng)cache3 down掉后,那落掉在cache2到cache3之間的pin都將失效,那么失效的落點講繼續(xù)順時
針查找cache服務(wù)器,那么新的落點都將落到cache4上。