redis 集群并沒有使用一致性hash,而是引入了哈希槽的概念。Redis 集群有16384個哈希槽,每個key通過CRC16校驗后對16384取模來決定放置哪個槽,集群的每個節(jié)點負責(zé)一部分hash槽。但為什么哈希槽的數(shù)量是16384(2^14)個呢,這個問題在github上有人提過,作者也給出了解答,下面我們來簡單分析一下。
為什么是16384(2^14)個?
在redis節(jié)點發(fā)送心跳包時需要把所有的槽放到這個心跳包里,以便讓節(jié)點知道當(dāng)前集群信息,16384=16k,在發(fā)送心跳包時使用bitmap壓縮后是2k(2 * 8 (8 bit) * 1024(1k) = 2K),也就是說使用2k的空間創(chuàng)建了16k的槽數(shù)。
雖然使用CRC16算法最多可以分配65535(2^16-1)個槽位,65535=65k,壓縮后就是8k(8 * 8 (8 bit) * 1024(1k) = 8K),也就是說需要需要8k的心跳包,作者認為這樣做不太值得;并且一般情況下一個redis集群不會有超過1000個master節(jié)點,所以16k的槽位是個比較合適的選擇。
作者原話:
1、普通心跳數(shù)據(jù)包攜帶節(jié)點的完整配置,該配置可以用舊配置以冪等方式替換,以便更新舊配置。這意味著它們包含原始形式的節(jié)點的槽配置,16k的槽配置需要使用2k內(nèi)存空間,但是使用65k槽將使用8k的內(nèi)存空間。
2、同時,由于其他設(shè)計折衷,Redis集群不可能擴展到超過1000個節(jié)點。
因此,16k是比較合適的,可以確保每個主設(shè)備有足夠的槽,最大為1000個。redis的node配置信息通過位圖存儲傳輸?shù)模瑐鬏斍坝幸粋€壓縮過程,壓縮比跟槽個數(shù)和節(jié)點數(shù)有很大關(guān)系(because when N is small the bitmap would have slots/N bits set that is a large percentage of bits set.)【槽數(shù)量/節(jié)點數(shù)】當(dāng)這個N越大,壓縮比就越小。
更多Redis相關(guān)技術(shù)文章,請訪問Redis教程欄目進行學(xué)習(xí)!