為什麼RedisCluster會設計成16384個槽呢?

朱小廝的部落格發表於2022-12-08

Redis Cluster 是Redis的叢集實現,內建資料自動分片機制,叢集內部將所有的key對映到16384個Slot中,叢集中的每個Redis Instance負責其中的一部分的Slot的讀寫。叢集客戶端連線叢集中任一Redis Instance即可傳送命令,當Redis Instance收到自己不負責的Slot的請求時,會將負責請求Key所在Slot的Redis Instance地址返回給客戶端,客戶端收到後自動將原請求重新發往這個地址,對外部透明。一個Key到底屬於哪個Slot由crc16(key) % 16384 決定。

為什麼RedisCluster會設計成16384個槽呢?這個問題有點類似於ThreadLocal中的0x61c88647。

對於這個問題,作者給出瞭解答。原版回答如下圖所示,對應的連結地址為:

為什麼RedisCluster會設計成16384個槽呢?

1.如果槽位為65536,傳送心跳資訊的訊息頭達8k,傳送的心跳包過於龐大。

在訊息頭中,最佔空間的是 myslots[CLUSTER_SLOTS/8]。當槽位為65536時,這塊的大小是: 65536÷8=8kb因為每秒鐘,redis節點需要傳送一定數量的ping訊息作為心跳包,如果槽位為65536,這個ping訊息的訊息頭太大了,浪費頻寬。 

2.redis的叢集主節點數量基本不可能超過1000個。

如上所述,叢集節點越多,心跳包的訊息體內攜帶的資料越多。如果節點過1000個,也會導致網路擁堵。因此redis作者,不建議redis cluster節點數量超過1000個。那麼,對於節點數在1000以內的redis cluster叢集,16384個槽位夠用了。沒有必要擴充到65536個。 

3.槽位越小,節點少的情況下,壓縮率高。

Redis主節點的配置資訊中,它所負責的雜湊槽是透過一張bitmap的形式來儲存的,在傳輸過程中,會對bitmap進行壓縮,但是如果bitmap的填充率slots / N很高的話(N表示節點數),bitmap的壓縮率就很低。如果節點數很少,而雜湊槽數量很多的話,bitmap的壓縮率就很低。而16384÷8=2kb,怎麼樣,神奇不!

綜上所述,作者決定取16384個槽,不多不少,剛剛好!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69940568/viewspace-2670581/,如需轉載,請註明出處,否則將追究法律責任。

相關文章