背景
- redis 配置集群就是使用的 哈希槽分区
目的
- 为了解决一致性哈希算法的数据倾斜问题,解决数据均匀分配,在数据和节点之间又加入一层,把这层称为哈希槽(slot),用于管理数据和节点之间的关系。
- 哈希槽实质就是一个数组,数组[0, 2^14-1]形成hash slot空间。
过程
- 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个。因为节点越多,心跳包的消息体内携带的数据越多,可能会导致网络拥堵
- 槽位越小,节点少的情况下,压缩比高,容器传输