《解锁Redis系列7》Redis Cluster集群续集之集群伸缩

觉得不错,点个赞吧!你的支持就是我的动力!微信搜索公众号【达摩克利斯之笔】获取更多资源,文末有二维码!

一、集群伸缩介绍

集群伸缩说白了就是在Redis中上线和下线节点,比如我们上篇文章中使用了6台节点3主3从来存储数据,如果公司业务蒸蒸日上6台节点不够用我们就需要新增节点,这个叫做集群扩容 ,如果有点凉或者高峰期过了就需要下线节点,这个叫做集群缩容。咱么本片就说说Redis5.0.5版本怎么去扩容和缩容集群。

二、节点扩容

2.1、配置文件

这个配置和之前一样,改改端口文件名即可

port 8006
daemonize yes
logfile "8006.log"
dir "/usr/local/redis-5.0.5/data/"
protected-mode no
dbfilename dump-8006.rdb
# 开启集群
cluster-enabled yes
# 集群运行时文件
cluster-config-file nodes-8006.conf
# 是否集群所有的节点都正常集群才可使用,改为no
cluster-require-full-coverage no
# 节点请求超时时间 
cluster-node-timeout 15000
# 关闭保护模式
protected-mode no

2.2、启动节点 

redis-server redis-8006.conf
redis-server redis-8007.conf

2.3、查看节点启动状态

2.4、添加节点

1、使用redis-cli --cluster help命令查看帮助

create:创建一个集群
call:可以执行redis命令
add-node:将一个节点添加到集群里,第一个参数为新节点的ip:port,第二个参数为集群中任意一个已经存在的节点的ip:port
del-node:移除一个节点
reshard:重新分片
check:检查集群状态

2、使用add-node参数添加节点 

redis-cli --cluster add-node 127.0.0.1:8006 127.0.0.1:8000
redis-cli --cluster add-node 127.0.0.1:8007 127.0.0.1:8000

这里抱歉一下:我运行出来的图找不到了,所以借了一张,大概长这样 

 2.5、查看节点状态

说明:我这里大家看到我打有马赛克,因为这张图是我分配完槽之后截的,因为之前的图一样找不到了,大家会发现这里多了两台节点8006和6007

2.6、分配槽

执行以下命令:

redis-cli --cluster reshard 127.0.0.1:8000

 这里会出现下图效果,这里会让你选择你想挪动多少槽,从1到16384,后续信息我在下方使用文字贴出,大家跟着去做!

 How many slots do you want to move (from 1 to 16384)? 2000
说明:需要多少个槽移动到新的节点上,自己设置,比如2000个槽
What is the receiving node ID? de7f62b1b649622bd18e8b4983864573ee6cc0e0
说明:把这2000个hash槽移动到哪个节点上去,需要指定节点id,我这里写的是8006的ID
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:all
注意:输入all为从所有主节点中分别抽取相应的槽数指定到新节点中,抽取的总槽数为2000个;或者输入原节点ID然后输入done,意思将输入的节点ID,抽取的总槽数为2000个,我这里输入的是all。
Do you want to proceed with the proposed reshard plan (yes/no)? yes
注意:输入yes确认开始执行分片任务

2.7、查看新的节点状态

大家算一算这个是不是我们撒谎改变分配的有2000个槽,这2000个槽分别从8000、8001、8002分过来的,而8007并没有分配槽,他是8006的从节点,接下来我们设置一下。

2.8、配置主从关系

哈哈,大家可还记得如何人分配主从?

redis-cli -p 8007 cluster replicate de7f62b1b649622bd18e8b4983864573ee6cc0e0

查看集群状态发现8007变成slave 

至此我们完成了节点扩容,从原本的3主3从,扩容成4主4从。我们这里都是在同一台节点上完成的,在实际生产过程中都是在不同节点上的,只需要修改ip和端口号即可,相信这对优秀的各位来说都是小意思!

三、集群缩容

3.1、下线8007从节点

使用del-node ip:port nodeID

redis-cli --cluster del-node 127.0.0.1:8007 d4aa5b7ea13899beef910b93228fc27b48bf88f4

3.2、查看集群状态

你会发现8007节点已经下线了

3.2、下线8006主节点

这个稍微有点麻烦,因为主节点上有数据槽,需要归还槽,然后在执行下线操作,否则就有可能造成数据丢失,这也是里边的小细节需要大家牢记!

执行:redis-cli --cluster reshard 127.0.0.1:8006

3.3、分配槽

这里一定要注意,我这里怎么变成4000了呢,我之前不是分配了2000个槽到8006吗?因为上边操作错误了。所以这里第一个ID是接收槽的节点的ID也就是8000的ID,第二个填写源节点的ID也就是8006的ID。

3.4、查看集群状态 

我们发现8006已经没有槽了,而8000多了10923-12255槽

 3.5、下线节点

redis-cli --cluster del-node 127.0.0.1:8006 de7f62b1b649622bd18e8b4983864573ee6cc0e0

3.6、查看集群状态

已经成功下线,我们进入集群测试添加查询数据都是没有问题的。

四、重定向

4.1、moved重定向

我们先来看看下边的命令出现的问题

  1. 上边的两个红色框分别为8000的槽和8001的槽
  2. 紧接着的是我们想集群中set了一个数据key为java,value为javaweb
  3. 接下来的cluster keyslot java命令是计算java这个key应该分配到那个槽中,结果为858,那么858这个槽在8000节点上所以数据就存储在了8000节点上
  4. 我们看最后一个红框,计算了python的槽值为7252,被8001节点维护,所以set值时大家发现多出一行提示重定向到8001上接下来我们的客户端就被重定向到了8001端口可以看到最后一行已经由8000编程了8001
  5. 如果我们去获取或者设置数据,如果直接在该节点维护那么会直接完成操作,如果不在该节点,Redis会向客户端回复moved,客户端会重定向到指定的节点上操作

4.2、ask重定向

4.3、moved和ask区别

  1.  两者都是客户端重定向
  2. moved确定槽已经迁移,不在当前节点
  3. ask是槽还在迁移中

大家会发现,如果我们迁移了槽或者槽正在迁移中我们的客户端来访问Redis Cluster中随机一个节点时如果数据不在该节点上会去做moved或者ask操作也就是重定向到其他的节点上 ,这样会对性能造成一定的影响。比如我们集群中有100个节点那么直接命中的概率就是1%。基于这个问题,我们在下片博客中为大家解密,这篇主要介绍Redis集群的伸缩。

未完待续... ...

写在最后:

各位的支持和认可(点赞)是我最大的动力,请不要轻轻的来,用力留下你的足迹!

本篇文章有任何错误希望不吝指出,不胜感激!我们下篇再见!

求知并无捷径,如果有,那就是放弃这个幼稚的想法,静下心来多读书、总结


发布了23 篇原创文章 · 获赞 49 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_36386908/article/details/104413003