Redis-cluster沒有使用一致性hash,而是引入了哈希槽的概念。Redis-cluster中有16384(即2的14次方)個(gè)哈希槽,每個(gè)key通過(guò)CRC16校驗(yàn)后對(duì)16383取模來(lái)決定放置哪個(gè)槽。Cluster中的每個(gè)節(jié)點(diǎn)負(fù)責(zé)一部分hash槽(hash slot)。
比如集群中存在三個(gè)節(jié)點(diǎn),則可能存在的一種分配如下:
1.節(jié)點(diǎn)A包含0到5500號(hào)哈希槽;
2.節(jié)點(diǎn)B包含5501到11000號(hào)哈希槽;
3.節(jié)點(diǎn)C包含11001 到 16384號(hào)哈希槽。
為什么是16384個(gè)
在redis節(jié)點(diǎn)發(fā)送心跳包時(shí)需要把所有的槽放到這個(gè)心跳包里,以便讓節(jié)點(diǎn)知道當(dāng)前集群信息,16384=16k,在發(fā)送心跳包時(shí)使用char進(jìn)行bitmap壓縮后是2k(2 * 8 (8 bit) * 1024(1k) = 16K),也就是說(shuō)使用2k的空間創(chuàng)建了16k的槽數(shù)。
雖然使用CRC16算法最多可以分配65535(2^16-1)個(gè)槽位,65535=65k,壓縮后就是8k(8 * 8 (8 bit) * 1024(1k) =65K),也就是說(shuō)需要需要8k的心跳包,作者認(rèn)為這樣做不太值得;并且一般情況下一個(gè)redis集群不會(huì)有超過(guò)1000個(gè)master節(jié)點(diǎn),所以16k的槽位是個(gè)比較合適的選擇。