概述
Redis的分布式寻址算法有三种:
- hash算法
- 一致性hash算法
- redis-cluster的hash slot算法
1、hash算法
首先计算哈希值,然后对节点数量取模,此时如果节点增加或者减少必然会导致获取到的缓存数据出错,如果节点宕机甚至还会导致缓存雪崩,导致数据库瘫痪。
2、一致性哈希
一致性哈希把哈希空间形成一个虚拟的环,将key的哈希值取模运算后顺时针走动,遇到的第一个节点就是其存储的位置。如果一个节点挂掉了影响的只是此节点和逆时针走动到上一个节点之间的数据,其他不受影响,增加一个节点也是类似。
当一致性哈希算法的节点数量很少时会造成分布不均匀的问题,因此引入了虚拟节点,也就是每个节点会进行多次哈希,每个节点在哈希环上会存在多个虚拟节点
上图的“D1#1”、“D1#2”、“D1#3”三个虚拟节点的数据均定位到 D1 上。
3、hash slot
Redis并没有直接使用一致性hash,而是采用了哈希槽,采用循环冗余校验CRC16.Redis 集群包含了 16384 个哈希槽,每个 Key 经过计算后会落在一个具体的槽位上,而槽位具体在哪个机器上是用户自己根据自己机器的情况配置的,机器硬盘小的可以分配少一点槽位,硬盘大的可以分配多一点。如果节点硬盘都差不多则可以平均分配。所以哈希槽这种概念很好地解决了一致性哈希的弊端。
另外在容错性和扩展性上与一致性哈希一样,都是对受影响的数据进行转移而不影响其它的数据。而哈希槽本质上是对槽位的转移,把故障节点负责的槽位转移到其他正常的节点上。扩展节点也是一样,把其他节点上的槽位转移到新的节点上。
参考文章:
一致性哈希