redis中的一致性hash
一致性hash解决的问题?
有N台机器,为了让数据均匀的存放在N台机器上,我们可以通过hash%N的方式进行映射定位,当其中某台机器挂掉了,我们需要将它踢出集群,此时机器数量为N-1,那么存放关系变为hash%(N-1),我们需要将大量数据进行移动,保证映射关系正确,这是灾难性的。一致性hash解决的问题当新增和减少机器时尽量少的影响已有key的存储关系。
一致性hash采用环形hash空间,将环形分成了0-16383个槽,一般会通过物理机的ip或者机器名将物理机hash到环上的某个槽位,如下图所示,有三台机器(每一个槽位都是主从模式,所以最少是3主3从),分别对应槽位0、槽位5201、槽位9900,假如张三通过
当某些原因机器B故障被踢出集群了,则只需要将李四从机器b移到机器c即可,其他节点数据不需要变动。

redis集群虚拟节点?
虚拟节点是为了是数据分配更均匀。例如当机器ABC的hash分布如下左图所示,则很明显机器A会分配更多的数据,为了解决这种不平均分配问题,可以采用下右图的虚拟节点方式,每个实际节点分配到对应的虚拟节点

为什么是2的14次方=16384个槽位?
因为集群节点之间会通过ping/pong进行通信,通信的内容中包括一个bitmap类型的数组,数据大小与槽位个数相关,当槽位为16384的时候,数据大小为2Kb(16384/8/1024=2Kb),如果槽位个数为65536,则通信的数据大小为8Kb。而节点之间的通信1s中会执行10次,所以如果槽位较多的话会导致暂用过多的通信带宽。
redisCluster使用的hash算法是什么?
RedisCluster 目前使用的计算 slot 槽位的算法为 CRC16 ,该算法本身会产生的 hash 值的大小为 16bit ,因此该算法可以产生 2^16=65536 个不同的值,取值范围为 0~65535 之间