这篇“Redis Cluster集群收缩主从节点的方法”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Redis Cluster集群收缩主从节点的方法”文章吧。

1.Cluster集群收缩概念

当项目压力承载力过高时,需要增加节点来提高负载,当项目压力不是很大时,也希望能够将集群收缩下来,给其他项目使用,这就要用到集群收缩了

集群收缩操作和集群扩容是一样的,只需要把方向反过来即可。

扩容的时候执行一次命令就可以实现槽位迁移成功,而收缩的时候有几个主节点就需要执行多少次,比如除去要下线的节点,还有3个主节点,那么就需要执行三次,填写迁移出槽位的数量也需要除以3,每个节点也需要平均分配。

收缩的时候首先要填写分出多少个槽位,然后填写要分给谁,最后填写从哪分出槽位,一般分多少个槽位,就需要看要下线的主机上有多少个槽位,然后除以集群主节点数,使每一个主机点分到的槽位都是相同的,填写要分配给谁的时候,第一次填写第一个主节点的ID,第二次填写第二个主节点的ID,最后填写提供槽位的节点ID,就是下线节点的ID号。

集群收缩扩容槽位的时候不会影响数据的使用。

集群收缩的源端就是要下线的主节点,目标端就是在线的主节点(分配给谁的节点)。
咱们要清楚一点,只有主节点是有槽位的,因此呢需要将主节点的槽位分配给其他主节点,当槽位清空后,这个主机节点就可以下线了。


收缩集群前后对比图

集群收缩操作步骤:

1.执行reshard命令将需要下线的主节点进行槽位分散。

2.有几个主节点就需要执行几次reshard命令,首先填写要分出的槽位数,然后填写分给谁,最后填写从哪里分。

3.当槽位分散完成后,要下线的主节点没有任何数据时,将节点从集群中删除。

集群信息

目前集群时四主四从共8个节点,我们需要将集群改为三主三从,收缩出两个节点给其他程序使用。

2.将6390主节点从集群中收缩2.1.计算需要分给每一个节点的槽位数

可以看到6390节点上有4096个槽位,删除要下线的6390节点后,我们还有3个主节点,4096除3得到1365,分配槽位的时候给每个节点分配1365个槽位即可均匀。

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

我们需要将192.168.81.240的6390节点分出1365个槽位给192.168.81.210的6380节点。

只需要把What is the receiving node ID填写成192.168.81.210的6380节点ID即可,指的是分配出来的槽位要给谁。

然后source node填写192.168.81.240的6390节点的ID,这里指的是从哪个节点上分出1365个槽位,填写ID后,回车后会提示还要从哪个节点上分配槽位,因为只有6390需要分出槽位,所以在这里填写done,表示只有这个一个节点分出1365个槽位给其他节点。

[root@redis-1/data/redis_cluster/redis-3.2.9/src]#./redis-trib.rbreshard192.168.81.210:6380Howmanyslotsdoyouwanttomove(from1to16384)?1365#分配出多少个槽位WhatisthereceivingnodeID?80e256579658eb256c5b710a3f82c439665794ba#将槽位分给那个节点PleaseenterallthesourcenodeIDs.Type'all'touseallthenodesassourcenodesforthehashslots.Type'done'onceyouenteredallthesourcenodesIDs.Sourcenode#1:6bee155f136f40e28e1f60c8ddec3b158cd8f8e8#从哪个节点分出槽位Sourcenode#2:doneDoyouwanttoproceedwiththeproposedreshardplan(yes/no)?yes#输入yes继续

下面是收缩节点的过程截图。

数据迁移过程。

槽位分出迁移成功。

2.3.分配1365个槽位给192.168.81.220的6380节点

[root@redis-1/data/redis_cluster/redis-3.2.9/src]#./redis-trib.rbreshard192.168.81.210:6380Howmanyslotsdoyouwanttomove(from1to16384)?1365#分配出多少个槽位WhatisthereceivingnodeID?10dc7f3f9a753140a8494adbbe5a13d0026451a1#将槽位分给那个节点PleaseenterallthesourcenodeIDs.Type'all'touseallthenodesassourcenodesforthehashslots.Type'done'onceyouenteredallthesourcenodesIDs.Sourcenode#1:6bee155f136f40e28e1f60c8ddec3b158cd8f8e8#从哪个节点分出槽位Sourcenode#2:doneDoyouwanttoproceedwiththeproposedreshardplan(yes/no)?yes#输入yes继续

收缩过程截图展示。



2.4.分配1365个槽位给192.168.81.230的6380节点

[root@redis-1/data/redis_cluster/redis-3.2.9/src]#./redis-trib.rbreshard192.168.81.210:6380Howmanyslotsdoyouwanttomove(from1to16384)?1366#分配出多少个槽位WhatisthereceivingnodeID?a4381138fdc142f18881b7b6ca8ae5b0d02a3228#将槽位分给那个节点PleaseenterallthesourcenodeIDs.Type'all'touseallthenodesassourcenodesforthehashslots.Type'done'onceyouenteredallthesourcenodesIDs.Sourcenode#1:6bee155f136f40e28e1f60c8ddec3b158cd8f8e8#从哪个节点分出槽位Sourcenode#2:doneDoyouwanttoproceedwiththeproposedreshardplan(yes/no)?yes#输入yes继续

收缩过程截图展示。


当最后一个节点迁移完数据后,6390主节点槽位数变为0。

2.5.查看当前集群槽位分配

槽位及数据已经从6390即将下线的主机迁移完毕,可以看下当前集群三个主节点的槽位数。

可以非常清楚的看到,现在每个主节点的槽位数为5461。

如果觉得槽位重新分配后顺序不太满意,那么在执行一下reshard,把其它节点的槽位都分给192.168.81.210的6380上,这样一来,210的6380拥有的槽位就是0-16383,然后在将210的槽位一个节点分给5461个,分完之后,各节点的顺序就一致了。

3.验证数据迁移过程是否导致数据异常

多开几个窗口,一个执行数据槽位迁移,一个不断创建key,一个查看key的创建进度,一个查看key的数据。
持续测试,发现没有任何数据异常,全部显示ok。

4.将下线的主节点从集群中删除4.1.删除节点

使用redis-trib删除一个节点,如果这个节点存在复制关系,有节点在复制当前节点或者当前节点复制别的节点的数据,redis-trib会自动处理复制关系,然后将节点删除,节点删除后会把对应的进程也停止运行。

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

命令:./redis-trib.rb del-node 节点IP:端口 ID

[root@redis-1/data/redis_cluster/redis-3.2.9/src]#./redis-trib.rbdel-node192.168.81.240:63906bee155f136f40e28e1f60c8ddec3b158cd8f8e8>>>Removingnode6bee155f136f40e28e1f60c8ddec3b158cd8f8e8fromcluster192.168.81.240:6390>>>SendingCLUSTERFORGETmessagestothecluster...>>>SHUTDOWNthenode.[root@redis-1/data/redis_cluster/redis-3.2.9/src]#./redis-trib.rbdel-node192.168.81.240:6391f6b9320dfbc929ad5a31cdb149360b0fd8de2e60>>>Removingnodef6b9320dfbc929ad5a31cdb149360b0fd8de2e60fromcluster192.168.81.240:6391>>>SendingCLUSTERFORGETmessagestothecluster...>>>SHUTDOWNthenode.

4.2.调整主从交叉复制

删掉192.168.81.240服务器上的两个redis节点后,192.168.81.210服务器上的6380就没有了复制关系,我们需要把192.168.81.230的6381节点复制192.168.81.210的6380节点。

[root@redis-1~]#redis-cli-h192.168.81.230-p6381192.168.81.230:6381>CLUSTERREPLICATE80e256579658eb256c5b710a3f82c439665794baOK

4.3.当节点存在数据无法删除

[root@redis-1/data/redis_cluster/redis-3.2.9/src]#./redis-trib.rbdel-node192.168.81.220:638010dc7f3f9a753140a8494adbbe5a13d0026451a1>>>Removingnode10dc7f3f9a753140a8494adbbe5a13d0026451a1fromcluster192.168.81.220:6380[ERR]Node192.168.81.220:6380isnotempty!Resharddataawayandtryagain.

5.将下线主机清空集群信息

redis-trib虽然能够将节点在集群中删除,但是无法将其的集群信息清空,如果集群信息还有保留,那么该接地那就无法加入其它集群。

在下线的redis节点上使用cluster reset删除集群信息即可。

192.168.81.240:6390>CLUSTERresetOK

以上就是关于“Redis Cluster集群收缩主从节点的方法”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注亿速云行业资讯频道。