为什么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个,超过的话可能会导致网络拥堵。

posted @ 2019-09-11 16:29  yueyuef  阅读(3471)  评论(0编辑  收藏  举报