redis集群新增结点slot迁移原理
写在前面:最近在复习redis知识点,遇到一个问题很疑惑,就是集群新增结点时,是将slot重新分配,然后移动?这样集群节点之间不就需要互相传送数据吗,但是又明确知道是所有节点向新节点传送数据,原有结点之间并无数据传输,所以就在网上搜索,但是没看到相关的解释,最终在这篇文章redis实战第九篇 集群扩容自动迁移槽(redis-cli)中的一句话上找到了答案,在此记录一下
- 首先我们知道,redis集群中会将16384个slot平均分配到各个节点上,比如我一开始有三个节点,则此时节点上的slot分布有0-5461、5462-10924、10925-16383;如果此时我们增加一个节点,则会造成slot重新分配,但是是重新划定区间然后将所有slot重新填入相应的节点吗?并不是的,因为我们定位slot是根据key算出来的hash值对16384取余,而不用管节点的下标,如果节点之间再进行数据迁移,开销会非常大,流程也会变得很复杂,而且很容易产生错误,所以redis采用了“将每个节点的一部分slot迁移到新节点上”的方法,流程如下:
- 先算出需要迁移的slot总数,在上面的例子中,最终一共有4个结点,所以需要分配16384/4 = 4096个结点给他
- 得出总数之后,将该总数的slot迁移任务均分到各个节点,也就是每个节点分到4096/3 = 1365个迁移任务
- 然后每个节点开始迁移,有第一个节点迁移0-1365、第二个节点迁移5463-7007、第三个节点迁移10925-12290到第四个节点
- 至此,迁移完成
- 下面是图示
以上
希望对后来者有所帮助