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