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

2022-07-10 06:15:12 字數 910 閱讀 7379

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的心跳包。

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個,超過的話可能會導致網路擁堵。

Redis集群中的雜湊槽

關係 cluster node slot key redis 集群中內建了 2 14 16384 個雜湊槽,當需要在 redis 集群中放置乙個 key value時,redis 先對 key 使用 crc16 演算法算出乙個結果,然後把結果對 16384 求餘數,這樣每個 key 都會對應乙個編號...

redis 集群雜湊槽的概念

redis 集群中內建了16384個雜湊槽,當需要在 redis 集群中放置乙個 key value時,redis 先對 key 使用 crc16 演算法算出乙個結果,然後把結果對 16384 求餘數,這樣每個 key 都會對應乙個編號在 0 16383 之間的雜湊槽,redis 會根據節點數量大致...

redis槽位為什麼是16384個?

參考 slot總共有16384個,這個數字是由redis的作者給定的乙個比較合理的資料,crc16演算法產生的雜湊值有16bit,也就是說有2 16 65536個值,但是為什麼只取了16384個槽?因為redis集群的設計是節點間會相互ping pong通訊,那就會有訊息產生,槽位 節點數越大,通訊...