上一篇阐述了redis的主从、哨兵模式,现在我们要新增一个节点到哨兵模式里面,应该怎么做呢?是否需要把redis主节点的所有键值全部复制到新增节点中呢?全量复制是否对集群的性能会产生影响呢?
为了解决新增节点全量复制的问题,cluster的解决方案也就应运而生。
假设目前存在5台redis集群,每台存储的键值对不是全量的,键值对存储的方式是使用哈希的方式,取模后落到对应机器台数上。假如redis节点不新增不删除,这种方式几乎没什么错误。那假如要新增一台机器呢?原先redis的取模除数+1,可想而知原先存储到前5台机器上的键值对的查找都会发生错误。
1、一致性哈希算法是怎么保证数据均匀分布的呢?
一致性哈希算法中存在一个slot槽的概念。redis集群每次新增节点都是对已知的槽节点进行分配。一致性哈希算法提供了一个哈希环,环中分配了2^32个槽。我们知道key值每次进行存储的时候都会通过crc16算法进行确定key值放置到哪个槽节点中,其实可以简单的理解成为取模16384。也就保证数据均匀分布在哈希槽里面。
一致性哈希算法为了解决数据倾斜的问题,提供了一个虚拟节点的概念,物理节点多次哈希之后会生成多个虚拟节点,每个物理节点管理这些虚拟节点,虚拟节点会均匀分布到哈希环上。