一得滤、hash算法
我們有3w條數(shù)據(jù)要放在3臺(tái)redis服務(wù)器上陨献,根據(jù)id或者其他關(guān)鍵字進(jìn)行hash取模,分布到A懂更,B眨业,C這3臺(tái)機(jī)器上。
hash(id)% N
N為redis服務(wù)器數(shù)量沮协。
但是這樣有什么問題呢?
1.數(shù)據(jù)分配不均勻龄捡,可能大部分?jǐn)?shù)據(jù)都集中到一臺(tái)機(jī)器上。
2.當(dāng)其中一臺(tái)機(jī)器宕掉的話或者數(shù)據(jù)量越來越大增加一臺(tái)服務(wù)器的話慷暂,那么所有數(shù)據(jù)都要重新hash取模聘殖,導(dǎo)致大量緩存數(shù)據(jù)失效,可能同時(shí)打到數(shù)據(jù)庫上行瑞,從而造成雪崩的情況奸腺。
二、hash一致性算法
這個(gè)hash一致性算法有個(gè)環(huán)形空間的概念血久,將value映射到32位的key值內(nèi)突照,首尾相連形成一個(gè)圓形,取值范圍為0~2^32-1氧吐。
現(xiàn)在還是3臺(tái)服務(wù)器讹蘑,
然后一個(gè)對象進(jìn)行hash獲取對應(yīng)的key值比如key1,順時(shí)針找最先找到的節(jié)點(diǎn)事cacheA筑舅,那么數(shù)據(jù)就緩存再A服務(wù)器上座慰。
那么這時(shí)候有一臺(tái)服務(wù)宕機(jī)了,比如cacheA翠拣。那么key1順時(shí)針找到的節(jié)點(diǎn)就是cacheB了版仔,那么受影響的數(shù)據(jù)只有本來應(yīng)該在cacheA的數(shù)據(jù)全部轉(zhuǎn)移到cacheB上去了,影響的數(shù)據(jù)就少了误墓,不會(huì)造成大量緩存數(shù)據(jù)失效邦尊。
問題2解決了优烧,但問題1還是沒法解決蝉揍,數(shù)據(jù)可能還是會(huì)集中到某一臺(tái)機(jī)器上畦娄。這就是hash傾斜性的問題弊仪,hash無法保證數(shù)據(jù)均勻分布。
為此引入了虛擬節(jié)點(diǎn)励饵,一個(gè)真實(shí)節(jié)點(diǎn)對應(yīng)多個(gè)虛擬節(jié)點(diǎn)滑燃。引入虛擬節(jié)點(diǎn)后役听,對象不是直接映射到真實(shí)節(jié)點(diǎn)上,而是虛擬節(jié)點(diǎn)表窘。再通過虛擬節(jié)點(diǎn)映射到真實(shí)節(jié)點(diǎn)典予。
這樣數(shù)據(jù)就更均勻分布了。當(dāng)服務(wù)器數(shù)量越多乐严,節(jié)點(diǎn)越多瘤袖,數(shù)據(jù)就越分布均勻。