_3主3从的Redis集群搭建之哈希槽算法

目的

解决一致性哈希算法数据倾斜问题

实质

是一个数组,数组[0,2^14-1]形成hash slot空间

作用

解决均匀分配问题,在数据和节点之间加入一层(哈希槽slot)用于管理数据和节点之间的关系,现在相当于节点里放槽,槽里放数据

方便数据移动

哈希解决的映射问题,使用key的哈希值来计算所在的槽,便于数据分配

多少个hash槽

一个集群只能有16384个槽,编号0-16383(0-2^14-1)

这些槽会分配给集群中的所有主节点,分配策略没有要求。可以指定哪些编号的槽分配给哪个主节点。集群会记录节点和槽的对应关系。

接下来就需要对key求哈希值,然后对16384取余,余数是几key就落入对应的槽里。slot = CRC16(key) % 16384

以槽为单位移动数据,因为槽的数目是固定的,处理起来比较容易,这样数据移动问题就解决了。

举个栗子

Redis 集群中内置了 16384 个哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。当需要在 Redis 集群中放置一个 key-value时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,也就是映射到某个节点上。如下代码,key之A 、B在Node2, key之C落在Node3上

首先有几个redis就把0-16383分成几个