集群伸缩

Redis 集群提供了灵活的节点扩容和收缩方案,当有新节点加入时,需要把一部分数据迁移到新节点来达到集群的负载均衡;当旧节点退出时,需要把其上的数据迁移到其他节点上,确保该节点上的数据能够被正常访问。从而达到在不影响集群对外服务的情况下,为集群添加节点进行扩容或对节点进行缩容。

集群伸缩的核心其实是数据的迁移,在 Redis 集群中数据是以 slot 为单位的,Redis 集群的伸缩本质上也就是 slot 在不同机器节点间的迁移。

集群扩容

集群扩容简单来说就是增加节点。使用集群命令查看命令操作,如图:

Redis集群系列九 —— 集群伸缩之扩容_集群

一定要先了解集群命令的操作,因为接下来使用的语法都的集群命令有关。

添加节点

添加两个节点,分别为 30007、30008 两个节点。配置与前面创建集群类似,不再赘述,不懂的参考 ​​集群搭建​​。

启动这两个节点,如图:

Redis集群系列九 —— 集群伸缩之扩容_插槽_02

此时两个节点还是独立的两个节点,如图:

Redis集群系列九 —— 集群伸缩之扩容_Redis_03

 接下需要将这两个节点添加到集群中。

加入集群

添加主节点

添加 30007 节点为集群中的主节点,执行集群命令如下:

redis-cli --cluster add-node 127.0.0.1:30007 127.0.0.1:30001

说明:第一个节点地址是需要添加的节点地址,第二个节点地址是集群里存在的任意节点地址。

Redis集群系列九 —— 集群伸缩之扩容_集群_04

再次查看集群状态,如图:

redis-cli -p 30001 cluster nodes

Redis集群系列九 —— 集群伸缩之扩容_扩容_05

通过上面的状态信息发现,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

Redis集群系列九 —— 集群伸缩之扩容_扩容_06

节点已经添加完成,但是集群并没有给新添加的节点分配槽位信息。

分配插槽

上面的图中可以看到,30007 和 30008 已正确添加到集群中,接下来就开始分配槽位。

分配插槽的基本思:从现有的某个节点上迁移部分插槽到新的节点上。我们将 30001、30002、30003 三个节点中的槽位分别迁出一些槽位给 30007。

假设平均分配每个节点的槽位,那么计算公式为: (16384/4)=4096 个槽位。

执行命令:

redis-cli --cluster reshard 127.0.0.1:30001

Redis集群系列九 —— 集群伸缩之扩容_扩容_07

执行命令后会出现第一个提示,输入要转移槽位的数量 4096,为什么是 4096 不是其它的?这个就是上提到的计算公式。

第二个提示是接受槽位的 节点ID。

接下来,Redis 会提问从哪些源节点进行迁移,共有三中方案:

  • all:代表全部,也就是三个节点各转移一部分
  • 具体的id:目标节点的id
  • done:没有了

这里我们选择平均节点的槽位数,所以输入的是“all”。

最后,输入 yes 后开始移动插槽,如图:

Redis集群系列九 —— 集群伸缩之扩容_集群_08

迁移完成后,再次查看集群状态,如图:

Redis集群系列九 —— 集群伸缩之扩容_插槽_09

查看集群详情,如图:

redis-cli --cluster info 127.0.0.1:30001

Redis集群系列九 —— 集群伸缩之扩容_redis_10

总结

启动一个集群模式下的 Redis 节点,然后通过与任意一个集群中的节点握手使得新的节点加入集群,最后再向新的节点分配它负责的 slot 以及向其迁移 slot 对应的数据。

由于 Redis 采用 Gossip 协议,所以可以让新节点与任意一个现有集群节点握手,一段时间后整个集群都会知道新节点的加入。

Redis 集群扩容主要分为如下几步:

  1. 准备新节点
  2. 加入集群
  3. 迁移slot到新节点