背景

  • redis 配置集群就是使用的 哈希槽分区

alt



目的

  • 为了解决一致性哈希算法的数据倾斜问题,解决数据均匀分配,在数据和节点之间又加入一层,把这层称为哈希槽(slot),用于管理数据和节点之间的关系。
  • 哈希槽实质就是一个数组,数组[0, 2^14-1]形成hash slot空间。

alt



过程

  • redis 集群中内置了16384个槽(2^14-1),redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。集群会记录节点和槽的对应关系。
  • 之后对 key 进行运算 slot = CRC16(key) % 16384。key 通过 CRC16 算法校验后,对16384取模,映射到对应的节点上。
  • CRC 算法产生的 hash 值有16bit,可以产生2^16 = 65536个值


好处

  • 扩大了粒度,便于数据移动


问题

为什么 redis 集群槽只有16384,而不是65536?

  • antirez redis之父解答
  • 如果槽位是65536,发送心跳信息 ping 的信息头达8kb,发送的心跳包过与庞大
  • redis 作者不建议 redis cluster 节点数量超过 1000个。因为节点越多,心跳包的消息体内携带的数据越多,可能会导致网络拥堵
  • 槽位越小,节点少的情况下,压缩比高,容器传输