暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Redis扩容和缩容

Java Miraculous 2021-04-29
2357
铁子们还记得我之前有搭建过Redis集群吗,忘记的可以看下,传送门:

redis单机,主从,哨兵加主从,集群搭建,凡是集群肯定避免不了服务器上下线调整,这时候就会涉及到Redis的扩容和缩容,今天一起来看下redis扩容和缩容的过程。

以下所有命令均在redis的解压目录下执行,比如我的/usr/local/redis-5.0.3
  • 一、redis的扩容

  • 1.1、本地集群介绍(已搭建好的)

  • 192.168.209.128:6379

  • 192.168.209.129:6379

  • 192.168.209.130:6379

  • 192.168.209.128:6380

  • 192.168.209.129:6380

  • 192.168.209.130:6380

  • 1.2、新增两个redis实例

由于电脑内存有限,不再装centos,直接在已有的上面新增两个redis(其实就是复制两个redis.conf配置文件),复制两个redis.conf,分别命名为redis6381.confredis6382.conf,改动里面的和端口相关的配置。
执行
src/redis-server redis6381.conf
src/redis-server redis6382.conf

  • 1.3、增加master节点

执行:

src/redis-cli --cluster add-node 192.168.209.128:6381 192.168.209.128:6379
其中192.168.209.128:6381是要新增的master节点,192.168.209.128:6379这个是集群中的任何一个节点即可。
注意:这一步可能出现一个问题

[WARNING] Node xx.xx.xx.xx:xx has slots in importing state 14041

其中xx.xx.xx.xx:xx就是ip:端口,后面也不一定是14041,根据你们实际的情况来

解决办法:登录xx.xx.xx.xx:xx这个节点,执行cluster setslot 14041 stable即可。

执行:
src/redis-cli --cluster add-node 192.168.209.128:6381 192.168.209.128:6379

,出现New node added correctly表示成功。

  • 1.4、查看集群信息

执行:

src/redis-cli
cluster nodes

这时候你可以看到新增的节点角色已经变为master。

注意:这时候新增的这个master上是没有槽位信息的。

  • 1.5、增加从节点

执行:

src/redis-cli --cluster add-node 192.168.209.128:6382 192.168.209.128:6369 --cluster-slave --cluster-master-id a6a7a1a331bf07f5bfdae9db8537acdf7745c84f

其中192.168.209.128:6382是你要新增的从节点的地址,后面的master-id是上面新增的那个master的id。


再次查看,会发现刚才新增的主从已经加入到集群里了。

  • 1.6、分配槽位

1.4说了,新增的这个master上是没有槽位的,没有槽位的话就存不了数据(redis集群存储数据的原理在这里就不细说了,有兴趣自己可以看下资料,网上有不少讲的很好),所以要给新增的master分配槽位。
执行:
src/redis-cli --cluster reshard 192.168.209.128:6379
其中192.168.209.128:6379用集群里的任何一个实例地址都可以。
期间它会询问你:How many slots do you want to move(from 1 to 16384)?

这里你随便填个数字(比如4096)就行,意思是要给这个新增的master分配多少个槽位。

然后它再询问你:Source node #1: 这里你输入all,表示从其它的master均匀(每个master出的一样)的分配出4096个槽位给它。
上面两个询问的图没截到(MD分配的时候日志老长了,之前的都看不到了,早知道先截图了,呜呜)
分配完后再查看,可以看到新增的master已经有槽位信息了。

  • 二、redis的缩容

扩容的时候扩完需要给新增的master分配槽位,那么缩容的话就得把槽位分配给别的master,分为两步,第一步是把槽位迁移到存在的master上,第二步是将下掉的节点从集群中删除。
  • 2.1、迁移槽位

    这里咱把刚才加的那台去掉,看下现在的集群信息:

咦,不对啊,上午的时候我的maste是192.168.209.128:6381啊,怎么现在成了6382,看下日志:

原来是我中午去吃饭的时候电脑休眠了,slave连不上master的时候就做了主从切换,不得不说redis集群真的强大,时刻保持着高可用。
分别执行:

src/redis-cli --cluster reshard --cluster-from 54a75b1e6c77c26da42666a090b997dbc51aa69c --cluster-to 1765c1bda12cc7bf85b73b9ff7330183b06d98ca --cluster-slots 1365 192.168.209.128:6379

src/redis-cli --cluster reshard --cluster-from 54a75b1e6c77c26da42666a090b997dbc51aa69c --cluster-to 08869829316e5703a8a17d326926b8415378c1c0 --cluster-slots 1365 192.168.209.128:6379

src/redis-cli --cluster reshard --cluster-from 54a75b1e6c77c26da42666a090b997dbc51aa69c --cluster-to 7512f2f291f4ec004d07eae68de654d1ff93f3b1 --cluster-slots 1366 192.168.209.128:6379

  • --cluster-from要删除的主节点id

  • --cluster-to:接收迁移槽的主节点id

  • --cluster-slots:迁移槽的数量

  • ip:端口:集群任意1个节点即可

都写yes,下图显示正在迁移中:

迁移完毕后再看下集群信息,会发现已经没有槽位了。

  • 2.2、删除节点

    这里假设咱后来加的6381和6382在一台机器上,既然这台机器要下掉,那么这一主一从都要删除。

分别执行:

src/redis-cli --cluster del-node 192.168.209.128:6379 54a75b1e6c77c26da42666a090b997dbc51aa69c

src/redis-cli --cluster del-node 192.168.209.128:6379 a6a7a1a331bf07f5bfdae9db8537acdf7745c84f

192.168.209.128:6379为集群中的任意一个节点即可。

删除后再看下集群的信息。

好了,Redis集群基本的扩容和缩容就是这样子了,还有更复杂的场景,以后再说了。
Redis是一个非常优秀的中间件,底层基于C语言开发,因此想要深入的学习,难度很大,需要借助很多的书籍,但是精通Redis的人,只需要精通Redis,他就可以吃一辈子,比如入职上家公司的时候有一个和我一起的同事,面试的时候就讲了redis源码,轻松进入架构部,薪资更是高的吓人,所以不管学什么,只要学精通都是前途无量,但是对应的,你要花比别人多几倍甚至几十倍的时间在学习上。
文章转载自Java Miraculous,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论