http://blog.51cto.com/zero01/2115528
這篇文章講的挺好魄眉!
我只是為了加深自己的理解,將其用自己的語(yǔ)言表述出來。
場(chǎng)景:
3萬條數(shù)據(jù)緩存于3臺(tái)服務(wù)器队贱,本著負(fù)載均衡的理念欣除,我們采用取模的方式住拭,假設(shè)3萬條數(shù)據(jù)經(jīng)過hash算法形成均勻的數(shù)據(jù),為1-30000,根據(jù)余數(shù)0历帚、1滔岳、2將數(shù)據(jù)均勻的分為3個(gè)片段,分別存在每臺(tái)服務(wù)器上挽牢。這樣從服務(wù)器緩存取數(shù)據(jù)時(shí)澈蟆,根據(jù)這條數(shù)據(jù)的hash值,取余卓研,便可確定需要從哪個(gè)服務(wù)器上獲取趴俘,這樣便避免了遍歷30000萬條數(shù)據(jù),效率提高了不少奏赘。
但當(dāng)我們?cè)黾右慌_(tái)服務(wù)器或者減少一臺(tái)服務(wù)器寥闪,便會(huì)出現(xiàn)嚴(yán)重問題。
當(dāng)增加磨淌、減少服務(wù)器疲憋,仍采用上述取模算法時(shí),必然要重新分配梁只,大量移動(dòng)缚柳。由此帶來了服務(wù)器某一時(shí)刻負(fù)載過大或者或者找不到存在服務(wù)器上的數(shù)據(jù)的問題。
解決這個(gè)困境便是hash一致性算法搪锣,redis分布式算法
最核心的地方便在與:把服務(wù)器與數(shù)據(jù)進(jìn)行hash運(yùn)算秋忙,根據(jù)hash值分配在一個(gè)hash空間中,這個(gè)空間的大小是0-2^32-1构舟,然后首尾相連形成一個(gè)環(huán)形灰追。
根據(jù)就近原則和順時(shí)針,將數(shù)據(jù)都映射到鄰近服務(wù)器上。如果添加或減少服務(wù)器弹澎,只有服務(wù)器相鄰的數(shù)據(jù)發(fā)生變化朴下,影響并不太大。
但這樣并不能保證服務(wù)器均勻的分配在環(huán)形中苦蒿,會(huì)出現(xiàn)數(shù)據(jù)傾斜問題殴胧,于是采用了虛擬節(jié)點(diǎn),每臺(tái)服務(wù)器都有幾個(gè)虛擬節(jié)點(diǎn)佩迟,將所有服務(wù)器的虛擬節(jié)點(diǎn)均勻的分布在環(huán)形空間中溃肪,這些虛擬節(jié)點(diǎn)映射實(shí)際服務(wù)器,這樣便有效的解決了數(shù)據(jù)傾斜問題音五。
Consistent hashing 命中率計(jì)算公式:
(1 - n / (n + m)) * 100%
佩服作者將redis分布式算法講的這么透徹易懂惫撰,更佩服那些創(chuàng)造這些算法的人。
冰躺涝,水為之厨钻,而寒于水。