why? 分布式系統(tǒng)中,當(dāng)某個(gè)節(jié)點(diǎn)失效,如果保證對(duì)剩余節(jié)點(diǎn)的數(shù)據(jù)影響最小?
像Memcache以及其它一些內(nèi)存K/V數(shù)據(jù)庫(kù)一樣,Redis本身不提供分布式支持,所以在部署多臺(tái)Redis服務(wù)器時(shí),就需要解決如何把數(shù)據(jù)分散到各個(gè)服務(wù)器的問(wèn)題,并且在服務(wù)器數(shù)量變化時(shí),能做到最大程度的不令數(shù)據(jù)重新分布。
通常使用的分布式方法是根據(jù)所要存儲(chǔ)數(shù)據(jù)的鍵的hash值與服務(wù)器數(shù)量N,按 hash % N 取模的算法來(lái)將數(shù)據(jù)分布到各個(gè)服務(wù)器。該算法的優(yōu)點(diǎn)是足夠簡(jiǎn)單,而且數(shù)據(jù)分布均勻。但是一旦服務(wù)器數(shù)量N發(fā)生變化的時(shí)候,緩存命中率會(huì)瞬間跌入谷底。
2的32次方的一個(gè)圓。
余數(shù)分布式算法:不可取
計(jì)算一致性hash時(shí)采用如下步驟:
首先求出memcached服務(wù)器(節(jié)點(diǎn))的哈希值,并將其配置到0~232的圓(continuum)上。
然后采用同樣的方法求出存儲(chǔ)數(shù)據(jù)的鍵的哈希值,并映射到相同的圓上。
然后從數(shù)據(jù)映射到的位置開(kāi)始順時(shí)針查找,將數(shù)據(jù)保存到找到的第一個(gè)服務(wù)器上。如果超過(guò)232仍然找不到服務(wù)器,就會(huì)保存到第一臺(tái)memcached服務(wù)器上。
從上圖的狀態(tài)中添加一臺(tái)memcached服務(wù)器。余數(shù)分布式算法由于保存鍵的服務(wù)器會(huì)發(fā)生巨大變化而影響緩存的命中率,但Consistent Hashing中,只有在園(continuum)上增加服務(wù)器的地點(diǎn)逆時(shí)針?lè)较虻牡谝慌_(tái)服務(wù)器上的鍵會(huì)受到影響,如下圖所示: