redis优化系列(十)Redis cluster集群的收缩操作

内容摘要
该系列博文之上一篇:传送门 走你收缩集群简介收缩集群意味着缩减规模,需要从现有集群中安全下线部分节点,下线节点过程如下图所示:1)首先需要确定下线节点是否有负责的槽,如果是,需
文章正文

该系列博文之上一篇:传送门 走你

收缩集群简介

收缩集群意味着缩减规模,需要从现有集群中安全下线部分节点,下线节点过程如下图所示:

r1.jpg

1)首先需要确定下线节点是否有负责的槽,如果是,需要把槽迁移到其他节点,保证节点下线后整个集群槽节点映射的完整性。

2)当下线节点不再负责槽或者本身是从节点时,就可以通知集群内其他节点忘记下线节点,当所有的节点都忘记该节点后可以正常关闭。


下线节点并迁移槽

下线节点需要把自己负责的槽迁移到其它节点上,原理与之前的节点扩容的迁移槽过程一致,但是过程收缩正好和扩容迁移方向相反,下线节点变为源节点,其它主节点变为目标节点,源节点需要把自身负责的N(因为上篇博文我们一共是4个节点,所以这里的N就是4096)个槽均匀地迁移到其它主节点上。


使用 redis-trib.rb reshard 命令完成槽迁移。由于每次执行 reshard 命令只能有一个目标节点,因此需要执行N(这里的是N是3)次 reshard 命令。不过我们这里只执行一次就好,然后使用 redis-trib.rb rebalance 命令来平衡集群中每一台redis节点的槽的数量。

忘记节点

由于集群内的节点不停地通过 Gossip 消息彼此交换节点状态,因此需要通过一种健壮的机制让集群内所有节点忘记下线的节点。也就是说让其他节点不再与要下线节点进行 Gossip 消息交换。Redis 提供了 cluster forget{downNodeId}命令实现该功能,会把这个节点信息放入黑名单,但是60s之后会恢复。


生产环境当中使用redis-trib.rb del-node {host:port}{downNodeId}命令进行相关操作


实战之redis cluster集群收缩操作

上篇博文中,我们的扩容操作增加了6397、6398两台redis节点,本次收缩操作我们就将6397、6398这两台redis节点给下线。另外上篇博文中说过一个redis-trib.rb工具中的 rebalance 命令,这是一个平衡集群中每个redis节点的所拥有的槽的数量的一个命令,上篇博文中没有实际演示,本次收缩操作可以演示下这个命令。


进入8台redis节点容器中的任意一台redis节点容器,我这里进入redis-master1这台redis节点容器

#进入redis-master1这台redis节点容器里面
docker exec -it redis-master1 bash


然后使用redis-trib.rb管理工具进行一系列操作

redis-trib.rb reshard 119.3.220.26:6397
#使用reshard命令获取集群中的所有节点信息,相当于获取集群信息的入口,后面的6397可以写成6391、6392、6393......等,只要是集群中的任意一台redis节点都可以的。


运行以上命令之后,然后看下面一系列的截图,截图中都有文字说明的。

r1.png


r2.png

r3.png


r4.png


到这里,我们槽的导入迁移操作已经完成了,然后进入集群中的另外一台redis节点容器,使用cluster nodes命令来查看集群中的变化发生了什么。

docker exec -it redis-master2 bash

redis-cli -p 6392

示例截图如下:

r5.png

从上图中可以看出,6397这台redis节点已经没有槽了,而6398这台redis之前是属于6397的从节点的,6397做了槽导入到6392之后,6398也自动变成了6392的从节点了。


上面的步骤中我们已经将6397这台redis节点的槽迁移到了6392那台redis节点中,6397已经没有槽了,接下来可以将6397这台节点从redis集群中移除掉,使用redis-trib.rb del-node 命令来完成移除集群中的某一台redis节点。命令如下:

#将50849d38117989c6fa5837119fba3554911f035d这台节点(也就是6397)从集群中移除
redis-trib.rb del-node 119.3.220.26:6391 50849d38117989c6fa5837119fba3554911f035d

#上面中的6391你可能会有疑问,不应该是6397吗?其实都可以的,只要是集群中的任意一台节点就可以,最后面的节点id才是最重要的,小心看清楚 别把节点id给错了。。

示例截图如下:

r1.png


然后进入redis中,再次使用cluster nodes命令来查看redis集群信息,发现6397那台redis节点在集群中已经没有了,截图如下:

r2.png


由于我们将6397中原本4096个槽全都迁移给了6392这台redis节点,6392这台redis节点中的槽会比现在集群中任意一台的redis节点中的槽多很多,所以接下来我们使用redis-trib.rb管理工具中的 rebalance  命令,来将集群中的redis节点的槽做一个平衡操作,使集群中的每一台redis节点中的槽的数量都差不多一样多。


使用redis-trib.rb工具来平衡集群中每一台redis节点的槽的数量

redis-trib.rb rebalance 119.3.220.26:6391

#再次强调。。6391可以换成6392、6393......等只要是集群中的任意一台redis节点即可

示例截图如下:

r1.png


输入以上命令,然后按回车之后,就开始进行平衡操作了。效果如下:

r2.png

由上图中可以看到,工具自动帮我们把6392的部分槽移动到了6391,然后再次将部分槽移动到了6393,然后平衡完毕了。。


可以进入redis客户端使用cluster nodes命令查看集群中的节点信息,截图如下:

r3.png

可以根据上图最新的槽的变化跟没做平衡之前的节点做比较来看一下


注意:要做这个平衡操作,之前的主节点(这里就是6397那台redis主节点)的槽必须迁移完毕,并且已经从集群删除后,才能执行平衡操作,否则的话会有问题。


redis集群中的收缩操作就到这里了。。结束



春水初生  春林初盛  春风十里不如你    -->冯唐【三十六计】



代码注释
[!--zhushi--]

作者:喵哥笔记

IDC笔记

学的不仅是技术,更是梦想!