為什么redis集群的最大槽數是16384個?


知道為什么RedisCluster有16384個槽么?

Redis 集群並沒有使用一致性hash,而是引入了哈希槽的概念。
Redis 集群有16384(2^14)個哈希槽,每個key通過CRC16校驗后對16384取模來決定放置哪個槽,集群的每個節點負責一部分hash槽。
這種結構很容易添加或者刪除節點,並且無論是添加刪除或者修改某一個節點,都不會造成集群不可用的狀態。

HASH_SLOT = CRC16(客戶端key) mod 16384

CRC16算法產生的hash值有16bit,可以產生的值在0~65535之間。

在redis節點發送心跳包時需要把所有的槽放到這個心跳包里,以便讓節點知道當前集群信息,16384=16k,在發送心跳包時使用char進行bitmap壓縮后是2k(2 * 8 (8 bit) * 1024(1k) = 2K),也就是說使用2k的空間創建了16k的槽數。
65535=65k,壓縮后就是8k(8 * 8 (8 bit) * 1024(1k) = 8K),也就是說需要需要8k的心跳包。

Redis Cluster原理

  1. node1和node2首先進行握手meet,知道彼此的存在
  2. 握手成功后,兩個節點會定期發送ping/pong消息,交換數據信息(消息頭,消息體)
  3. 消息頭里面有個字段:unsigned char myslots[CLUSTER_SLOTS/8],每一位代表一個槽,如果該位是1,代表該槽屬於這個節點
  4. 消息體中會攜帶一定數量的其他節點的信息,大約占集群節點總數量的十分之一,至少是3個節點的信息。節點數量越多,消息體內容越大。
  5. 每秒都在發送ping消息。每秒隨機選取5個節點,找出最久沒有通信的節點發送ping消息。
  6. 每100毫秒都會掃描本地節點列表,如果發現節點最近一次接受pong消息的時間大於cluster-node-timeout/2,則立即發送ping消息

redis集群的主節點數量基本不可能超過1000個,超過的話可能會導致網絡擁堵。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM