集群伸缩
Redis 集群提供了灵活的节点扩容和收缩方案,当有新节点加入时,需要把一部分数据迁移到新节点来达到集群的负载均衡;当旧节点退出时,需要把其上的数据迁移到其他节点上,确保该节点上的数据能够被正常访问。从而达到在不影响集群对外服务的情况下,为集群添加节点进行扩容或对节点进行缩容。
集群伸缩的核心其实是数据的迁移,在 Redis 集群中数据是以 slot 为单位的,Redis 集群的伸缩本质上也就是 slot 在不同机器节点间的迁移。
集群扩容
集群扩容简单来说就是增加节点。使用集群命令查看命令操作,如图:
一定要先了解集群命令的操作,因为接下来使用的语法都的集群命令有关。
添加节点
添加两个节点,分别为 30007、30008 两个节点。配置与前面创建集群类似,不再赘述,不懂的参考 集群搭建。
启动这两个节点,如图:
此时两个节点还是独立的两个节点,如图:
接下需要将这两个节点添加到集群中。
加入集群
添加主节点
添加 30007 节点为集群中的主节点,执行集群命令如下:
redis-cli --cluster add-node 127.0.0.1:30007 127.0.0.1:30001
说明:第一个节点地址是需要添加的节点地址,第二个节点地址是集群里存在的任意节点地址。
再次查看集群状态,如图:
redis-cli -p 30001 cluster nodes
通过上面的状态信息发现,30007 节点已加入了集群,并成了 master 节点。接下来给 30007 节点添加从节点。
添加从节点
将节点 30008 加入集群,并设为 30007 从节点,执行命令如下:
redis-cli --cluster add-node 127.0.0.1:30008 127.0.0.1:30001 --cluster-slave --cluster-master-id 086be9d60012518ef3d7bb9958f99cbaff6cb567
说明:第一个节点地址是需要添加的节点地址,第二个节点地址是集群里存在的任意节点地址,最后一个参数是添加 30007 节点的 master-id。
再次查看集群状态
redis-cli -p 30001 cluster nodes
节点已经添加完成,但是集群并没有给新添加的节点分配槽位信息。
分配插槽
上面的图中可以看到,30007 和 30008 已正确添加到集群中,接下来就开始分配槽位。
分配插槽的基本思:从现有的某个节点上迁移部分插槽到新的节点上。我们将 30001、30002、30003 三个节点中的槽位分别迁出一些槽位给 30007。
假设平均分配每个节点的槽位,那么计算公式为: (16384/4)=4096 个槽位。
执行命令:
redis-cli --cluster reshard 127.0.0.1:30001
执行命令后会出现第一个提示,输入要转移槽位的数量 4096,为什么是 4096 不是其它的?这个就是上提到的计算公式。
第二个提示是接受槽位的 节点ID。
接下来,Redis 会提问从哪些源节点进行迁移,共有三中方案:
- all:代表全部,也就是三个节点各转移一部分
- 具体的id:目标节点的id
- done:没有了
这里我们选择平均节点的槽位数,所以输入的是“all”。
最后,输入 yes 后开始移动插槽,如图:
迁移完成后,再次查看集群状态,如图:
查看集群详情,如图:
redis-cli --cluster info 127.0.0.1:30001
总结
启动一个集群模式下的 Redis 节点,然后通过与任意一个集群中的节点握手使得新的节点加入集群,最后再向新的节点分配它负责的 slot 以及向其迁移 slot 对应的数据。
由于 Redis 采用 Gossip 协议,所以可以让新节点与任意一个现有集群节点握手,一段时间后整个集群都会知道新节点的加入。
Redis 集群扩容主要分为如下几步:
- 准备新节点
- 加入集群
- 迁移slot到新节点