Code前端首页关于Code前端联系我们

民工兄的Redis教程(十四):集群集群缩容原理与实践

terry 2年前 (2023-09-26) 阅读数 164 #后端开发

集群集群缩容概念

当项目的压力容量太大时,需要增加节点来增加负载。当项目压力不太大的时候, ,也希望能够将集群收缩,用于其他项目,这就需要集群收缩

集群收缩操作和集群扩容一样,只是方向相反而已。

扩容时,执行一次该命令即可实现槽位迁移成功。收缩时,有多个主节点就需要执行多次。例如,如果某个节点下线,那么您还需要 3 个主节点。执行3次后,迁移槽数必须除以3,并且每个节点必须均分。

收缩时,首先要填写要分配的槽位数量,然后填写要分配给谁,最后填写从哪里分配槽位。一般来说,要分配的时隙数量取决于预计有多少主机离线。然后除以集群主节点的数量,使分配给每个主机的插槽相等。填写分配给谁时,第一次填写第一个主节点的ID,第二次填写第一个主节点的ID。填写第二个主节点的ID,最后填写提供槽位的节点的ID,即下线节点的ID号。

集群收缩和扩展槽位时,不会影响数据使用。

集群收缩的源端是下线的主节点,目的端是在线的主节点(其分配的节点)。
需要澄清的是,只有主节点才有槽位,所以主节点的槽位必须由其他主节点分配。槽位释放后,主机节点即可下线。 民工哥死磕Redis教程(十四): Cluster 集群收缩原理与实践

集群缩减前后对比表
民工哥死磕Redis教程(十四): Cluster 集群收缩原理与实践更多Redis学习文章请参见:众多NoSQL数据库中的Redis。该系列持续更新。

聚类归约操作步骤:

  • 1。执行reshard命令,为需要下线的主节点分配槽位。
  • 2。如果有多个master节点,则必须多次执行reshard命令。首先填写要分割的槽数,然后填写从谁分割,最后填写从哪里分割。
  • 3。当槽位分配完成且待下线的主节点无数据时,将该节点从集群中移除。

集群信息

当前集群有四主四从,共8个节点。我们需要将集群改为三主三从,并收缩两个节点以供其他程序使用。 ?最后我们有3个主要节点。将4096除以3得到1365。分配槽位时,为每个节点分配1365个槽位,使其均匀。
民工哥死磕Redis教程(十四): Cluster 集群收缩原理与实践

将节点 6380 的 1365 个槽位分配给 192.168.81.210

我们需要将节点 61092.16 到节点 61092.16 的 1365 个槽位分配给节点 61092.16 192.168 .81.210。

只需填写 What is the Receiving Node ID 作为 Node ID 6380 192.168.81.210,它指的是谁将被分配该插槽。

然后源节点填写节点ID 6390,即192.168.81.240。这是指1365个槽位是从哪个节点分配的。填写完ID后,回车后,会询问你从哪个节点分配槽位。由于只需要分配6390个槽位,所以这里填写done,表示只有这个节点已经为其他节点分配了1365个槽位。

[root@redis-1 /data/redis_cluster/redis-3.2.9/src]# ./redis-trib.rb reshard 192.168.81.210:6380
How many slots do you want to move (from 1 to 16384)? 1365    #分配出多少个槽位

What is the receiving node ID? 80e256579658eb256c5b710a3f82c439665794ba    #将槽位分给那个节点

Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
Source node #1:6bee155f136f40e28e1f60c8ddec3b158cd8f8e8     #从哪个节点分出槽位
Source node #2:done

Do you want to proceed with the proposed reshard plan (yes/no)? yes   #输入yes继续

以下是节点缩减过程截图。
民工哥死磕Redis教程(十四): Cluster 集群收缩原理与实践 数据迁移过程。
民工哥死磕Redis教程(十四): Cluster 集群收缩原理与实践 槽位分支迁移成功。
民工哥死磕Redis教程(十四): Cluster 集群收缩原理与实践

将 1365 个槽位分配给 192.168.81.220 处的 6380 个节点

[root@redis-1 /data/redis_cluster/redis-3.2.9/src]# ./redis-trib.rb reshard 192.168.81.210:6380
How many slots do you want to move (from 1 to 16384)? 1365    #分配出多少个槽位

What is the receiving node ID? 10dc7f3f9a753140a8494adbbe5a13d0026451a1    #将槽位分给那个节点

Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
Source node #1:6bee155f136f40e28e1f60c8ddec3b158cd8f8e8     #从哪个节点分出槽位
Source node #2:done

Do you want to proceed with the proposed reshard plan (yes/no)? yes   #输入yes继续

显示收缩过程的屏幕截图。 民工哥死磕Redis教程(十四): Cluster 集群收缩原理与实践民工哥死磕Redis教程(十四): Cluster 集群收缩原理与实践民工哥死磕Redis教程(十四): Cluster 集群收缩原理与实践

在 192.168.81.230 为 6380 个节点分配 1365 个槽位

[root@redis-1 /data/redis_cluster/redis-3.2.9/src]# ./redis-trib.rb reshard 192.168.81.210:6380
How many slots do you want to move (from 1 to 16384)? 1366    #分配出多少个槽位

What is the receiving node ID? a4381138fdc142f18881b7b6ca8ae5b0d02a3228    #将槽位分给那个节点

Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
Source node #1:6bee155f136f40e28e1f60c8ddec3b158cd8f8e8     #从哪个节点分出槽位
Source node #2:done

Do you want to proceed with the proposed reshard plan (yes/no)? yes   #输入yes继续

显示收缩过程的屏幕截图。 民工哥死磕Redis教程(十四): Cluster 集群收缩原理与实践民工哥死磕Redis教程(十四): Cluster 集群收缩原理与实践迁移最后一个节点的数据后,主节点6390的槽位数量变为0。 民工哥死磕Redis教程(十四): Cluster 集群收缩原理与实践

显示当前集群槽位分配情况

槽位和数据已从主机6390迁移,主机6390接近离线状态。可以查看当前集群中3个Master节点的槽位数量。

可以非常清楚地看到,每个主节点的槽数现在为 5461 个。 民工哥死磕Redis教程(十四): Cluster 集群收缩原理与实践 如果你觉得槽位重新分配顺序不理想,请进行重新分片,将其他节点的槽位从 192.16 分配到 6380 个.81.210。这样210的6380槽位是0-16383,然后在210到5461槽位分配一个节点。分配完成后,每个节点的顺序就会一致。
民工哥死磕Redis教程(十四): Cluster 集群收缩原理与实践 更多关于Redis学习的文章可以参见:NoSQL数据库系列-Redis。该系列持续更新。

验证数据迁移过程没有造成数据异常

打开其他几个窗口,一个进行数据槽迁移,一个用于持续生成密钥,一个用于查看密钥生成进度,一个用于查看密钥数据。

持续测试未发现数据异常,一切正常。?对于节点数据,redis-trib会自动处理复制关系,然后移除节点。当一个节点被删除时,相应的进程也会停止。

删除节点前,必须确保该节点没有槽位、没有数据,否则删除会失败。

命令:./redis-trib.rb 删除节点节点IP:端口ID

[root@redis-1 /data/redis_cluster/redis-3.2.9/src]# ./redis-trib.rb del-node 192.168.81.240:6390 6bee155f136f40e28e1f60c8ddec3b158cd8f8e8
>>> Removing node 6bee155f136f40e28e1f60c8ddec3b158cd8f8e8 from cluster 192.168.81.240:6390
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.

[root@redis-1 /data/redis_cluster/redis-3.2.9/src]# ./redis-trib.rb del-node 192.168.81.240:6391 f6b9320dfbc929ad5a31cdb149360b0fd8de2e60
>>> Removing node f6b9320dfbc929ad5a31cdb149360b0fd8de2e60 from cluster 192.168.81.240:6391
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.
民工哥死磕Redis教程(十四): Cluster 集群收缩原理与实践

编辑主从交叉复制

删除redis服务器上的两个节点后,服务器81.210上的66.18.818.1 6380 .没有复制关系。我们需要将节点 6381 从 192.168.81.230 复制到节点 6380 从 192.168.81.210。

[root@redis-1 ~]# redis-cli -h 192.168.81.230 -p 6381
192.168.81.230:6381> CLUSTER REPLICATE 80e256579658eb256c5b710a3f82c439665794ba
OK
民工哥死磕Redis教程(十四): Cluster 集群收缩原理与实践

当节点有数据时,无法删除

[root@redis-1 /data/redis_cluster/redis-3.2.9/src]# ./redis-trib.rb del-node 192.168.81.220:6380 10dc7f3f9a753140a8494adbbe5a13d0026451a1
>>> Removing node 10dc7f3f9a753140a8494adbbe5a13d0026451a1 from cluster 192.168.81.220:6380
[ERR] Node 192.168.81.220:6380 is not empty! Reshard data away and try again.
民工哥死磕Redis教程(十四): Cluster 集群收缩原理与实践

清除离线主机集群信息

redis-trib虽然可以删除集群中的节点,但无法清除其集群信息。如果集群信息仍然保留,那么接地后就无法连接到其他集群。 民工哥死磕Redis教程(十四): Cluster 集群收缩原理与实践 只需在离线的redis节点上使用cluster Reset即可删除集群信息。

192.168.81.240:6390> CLUSTER reset
OK
民工哥死磕Redis教程(十四): Cluster 集群收缩原理与实践来源:https://jianxl.blog.csdn.net/article/details/121465277

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

热门