Redis Cluster集群动态扩容的实现


Posted in Redis onJuly 15, 2021

一、引言

上一篇文章我们一步一步的教大家搭建了Redis的Cluster集群环境,形成了3个主节点和3个从节点的Cluster的环境。当然,大家可以使用 Cluster info 命令查看Cluster集群的状态,也可以使用Cluster Nodes 命令来详细了解Cluster集群每个节点的详细信息和关系。我们可以在主节点上增加数据、操作数据,也可以在从节点上读取数据,这些操作当然都没有问题。我们今天这篇文章主要是讲解一下如何在不停掉Cluster集群环境的情况下,动态的往集群环境中增加主、从节点和动态的从集群环境中删除节点。好了,废话不多说,开始我们今天的讲解。在开始之前,先要说明一下,因为redis的动态扩容操作都是通过redis-trib.rb脚本文件来完成的,所以我们先来看看对这个脚本文件的说明,效果如图:

[root@linux redis] # ruby redis-trib.rb

Redis Cluster集群动态扩容的实现

二、Cluster集群增加操作

现在正好开始我们的操作,我把增加节点和删除节点分开来写,并且增加或者删除节点,我都分了两个方面来说,一个方面是主节点的操作,另一个方面是从节点的操作,因为主、从节点在操作上会有差异,所以分来来说。增加节点的顺序是先增加Master主节点,然后在增加Slave从节点。当然这篇文章是在上一篇文章所讲的Cluster集群模式的基础之上来讲的,那就让我们先来看看上一篇文章所建立的Cluster集群模式的详细信息。效果如图:

Redis Cluster集群动态扩容的实现

Redis Cluster集群动态扩容的实现

1、动态增加Master主服务器节点

1.1、创建目录7006(Master主节点文件夹)和7007(Slave从节点文件夹),并从以前Cluster集群节点7000-7005任一节点中拷贝配置文件redis.conf到7006和7007目录下。

[root@linux redis-cluster]# pwd
                [root@linux redis-cluster]# /root/application/program/redis-cluster/

                [root@linux redis-cluster]# mkdir 7006 7007

                [root@linux redis-cluster]# ls
                7000 7001 7002 7003 7004 7005 7006 7007

                   [root@linux redis-cluster]# cp 7000/redis.conf 7006
                   [root@linux redis-cluster]# cp 7000/redis.conf 7007

1、创建目录:

Redis Cluster集群动态扩容的实现

2、拷贝配置文件:

Redis Cluster集群动态扩容的实现

1.2、修改配置文件,将7006和7007目录下面的redis.conf配置文件的端口进行相应修改,与自己的目录名称保持一致,修改项目如下:(在linux环境下可以执行如下命令进行全局替换::%s/7000/7006/g,%s/7000/7007/g,保存并退出则可)

1.2.1、7006节点的配置文件:redis.conf

bind 192.168.127.130

                      port 7006
    
                      daemonize yes

                      pidfile /var/run/redis-7006.pid

                      logfile /root/application/program/redis-cluster/7006/redis.log
    
                      dir /root/application/program/redis-cluster/7006/

                      cluster-enabled yes

                      cluster-config-file nodes-7006.conf


                      cluster-node-timeout 15000

                      appendonly yes

                      appendfsync always

1.2.2、7007节点的配置文件:redis.conf

bind 192.168.127.130

                      port 7007

                      daemonize yes

                      pidfile /var/run/redis-7007.pid

                      logfile /root/application/program/redis-cluster/7007/redis.log
    
                      dir /root/application/program/redis-cluster/7007/

                      cluster-enabled yes

                      cluster-config-file nodes-7007.conf


                      cluster-node-timeout 15000

                      appendonly yes

                      appendfsync always

1.3、启动7006和7007目录下Redis实例,并查看效果。

[root@linux redis]# pwd
                [root@linux redis]# /root/application/program/redis/


                [root@linux redis]# redis-server ../redis-cluster/7006/redis.conf
                [root@linux redis]# redis-server ../redis-cluster/7007/redis.conf

效果如图:

Redis Cluster集群动态扩容的实现

Redis Cluster集群动态扩容的实现

1.4、将7006主节点加入到Cluster集群。

 [root@linux redis]# pwd
                [root@linux redis]# /root/application/program/redis/

                [root@linux redis]# ruby redis-trib.rb add-node 192.168.127.130:7006 192.168.127.130:7000

注意:当添加新节点成功以后,新的节点不会有任何数据,因为他没有分配任何的数据Slot(哈希slots),这一步需要手动操作。

1.4.1、增加7006:(192.168.127.130:7006,截图地址错误,端口号是7006,不是9006)

Redis Cluster集群动态扩容的实现

1.4.2、节点增加成功。

Redis Cluster集群动态扩容的实现

1.4.3、cluster info 验证:

Redis Cluster集群动态扩容的实现

1.4.4、cluster nodes验证:

Redis Cluster集群动态扩容的实现

1.5、为7006Master主节点分配数据Slots,分配方法是从集群中知道任何一个主节点(因为只有Master主节点才有数据slots),然后对其进行重新分片工作。

[root@linux redis]# pwd
                [root@linux redis]# /root/application/program/redis/

                [root@linux redis]# ruby redis-trib.rb reshard 192.168.127.130:7000

1.5.1、分配数据槽:

Redis Cluster集群动态扩容的实现

1.5.2、选择接收数据槽的节点和数据槽产生的方式:

Redis Cluster集群动态扩容的实现

1.5.3、执行分配计划:

Redis Cluster集群动态扩容的实现

1.5.4、数据槽分配成功:

Redis Cluster集群动态扩容的实现

2、动态增加Slave从服务器节点

在增加主节点7006的时候,前面的3步是共有的,也就是从1.1-1.3,之后才是建立主节点的内容,前面的3步骤针对从节点7007也是必须的,我只是把这些步骤写到了创建主节点7006的步骤里,大家请知晓。

2.1、将7007节点增加到集群中

[root@linux redis]# pwd
[root@linux redis]# /root/application/program/redis/
[root@linux redis]# ruby redis-trib.rb add-node 192.168.127.130:7007 192.168.127.130:7000

效果如图:

Redis Cluster集群动态扩容的实现

2.2、指定7007节点作为7006的从节点,实现主从的配置。

[root@linux redis]# pwd
[root@linux redis]# /root/application/program/redis/
[root@linux redis]# redis-cli -c -h 192.168.127.130 -p 7007  //登陆7007
192.168.127.130::7007>cluster replicate 71ecd970838e9b400a2a6a15cd30a94ab96203bf(主节点的ID,这里是7006)
192.168.127.130::7007>OK

效果如图:

Redis Cluster集群动态扩容的实现

三、Cluster集群删除操作

由于我们在上面的步骤里面创建7006和7007两个主从的节点,下面接下来的操作,我就是从这个Cluster集群模式中动态的删除掉这两个节点。删除的顺序是先删除Slave从节点,然后在删除Master主节点,最后还原到我们上一篇文章建立的Cluster集群模式,也就是3个主节点和3个从节点。现在是4个主节点和4个从节点。效果如图:

Redis Cluster集群动态扩容的实现

1、动态删除Slave从服务器节点

1.1、删除7007从节点,输入del-node命令,指定删除节点的IP地址和Port端口号,同时还要提供该从节点ID名称。

[root@linux redis]# pwd
[root@linux redis]# /root/application/program/redis/
[root@linux redis]# ruby redis-trib.rb del-node 192.168.127.130:7007 991ed242102aaa08873eb9404a18e0618a4e37bd

删除成功如图:        

Redis Cluster集群动态扩容的实现

删除前如图:          

Redis Cluster集群动态扩容的实现

删除后如图:

Redis Cluster集群动态扩容的实现

2、动态删除Master主服务器节点

要想删除Master主节点,可能要繁琐一些。因为在Master主节点上有数据槽(slots),为了保证数据的不丢失,必须把这些数据槽迁移到其他Master主节点上,然后在删除主节点。

2.1、重新分片,把要删除的Master主节点的数据槽移动到其他Master主节点上,以免数据丢失。

[root@linux redis]# pwd
[root@linux redis]# /root/application/program/redis/
[root@linux redis]# ruby redis-trib.rb reshard 192.168.127.130:7006

2.1.1、移除多少槽如图:创建输入200,这里要输入199,因为计数是从0开始的,切记。

Redis Cluster集群动态扩容的实现

2.1.2、接受槽的Master主节点ID:这个节点可以是任意一个主节点都可以,我选择7002,ID是:3b025b3ecfa65f462de639c7a412be443cf1dd1c

Redis Cluster集群动态扩容的实现

2.1.3、从哪个主节点移除,该主节点是7006,ID是:71ecd970838e9b400a2a6a15cd30a94ab96203bf

Redis Cluster集群动态扩容的实现

2.1.4、执行分区计划,选择yes。分区完成,效果如图:

Redis Cluster集群动态扩容的实现

2.1.5、当前7006主节点已经没有数据槽了。

Redis Cluster集群动态扩容的实现

2.2、删除7006主节点,提供要删除节点的IP地址和Port端口,当然还有要删除的节点的ID名称。

[root@linux redis]# pwd
[root@linux redis]# /root/application/program/redis/
[root@linux redis]# ruby redis-trib.rb del-node 192.168.127.130:7006 71ecd970838e9b400a2a6a15cd30a94ab96203bf

2.2.1、删除成功  

Redis Cluster集群动态扩容的实现

2.2.2、查看节点效果   

Redis Cluster集群动态扩容的实现

四、总结

今天就写到这里了,做一个小小的总结。主从复制和哨兵模式这两个集群模式由于不能动态扩容,而且主节点之间(有多个主节点的情况)数据完全一样,导致了主节点的容量成了整个集群的瓶颈,如果想扩展集群容量,必须扩展主节点的容量。由于以上的问题,redis在3.0开始Cluster集群模式,这个模式在主节点之间数据是不一样的,数据也可以根据需求自动转向其他节点。这样就可以实现横向动态扩容,新增加的主从节点,用于存储新的数据则可,对以前的节点的数据不会有任何影响。再者说,配置也很简单,这才是我们所需要的集群模式。

到此这篇关于Redis Cluster集群动态扩容的实现的文章就介绍到这了,更多相关Redis Cluster集群动态扩容 内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Redis 相关文章推荐
解决redis sentinel 频繁主备切换的问题
Apr 12 Redis
为Java项目添加Redis缓存的方法
May 18 Redis
5分钟教你docker安装启动redis全教程(全新方式)
May 29 Redis
k8s部署redis cluster集群的实现
Jun 24 Redis
redis使用不当导致应用卡死bug的过程解析
Jul 01 Redis
Redis 彻底禁用RDB持久化操作
Jul 09 Redis
springboot使用Redis作缓存使用入门教程
Jul 25 Redis
Redis如何实现分布式锁
Aug 23 Redis
Window server中安装Redis的超详细教程
Nov 17 Redis
SpringBoot整合Redis入门之缓存数据的方法
Nov 17 Redis
基于Redis6.2.6版本部署Redis Cluster集群的问题
Apr 01 Redis
Redis官方可视化工具RedisInsight安装使用教程
Apr 19 Redis
redis requires ruby version2.2.2的解决方案
Jul 15 #Redis
厉害!这是Redis可视化工具最全的横向评测
Redis性能监控的实现
Redis 彻底禁用RDB持久化操作
Jul 09 #Redis
在redisCluster中模糊获取key方式
Redis集群的关闭与重启操作
Jul 07 #Redis
redis不能访问本机真实ip地址的解决方案
Jul 07 #Redis
You might like
dedecms 制作模板中使用的全局标记图文教程
2007/03/11 PHP
php 随机数的产生、页面跳转、件读写、文件重命名、switch语句
2009/08/07 PHP
php echo, print, print_r, sprintf, var_dump, var_expor的使用区别
2013/06/20 PHP
php通过正则表达式记取数据来读取xml的方法
2015/03/09 PHP
Yii2实现log输出到file及database的方法
2016/11/12 PHP
PHP实现唤起微信支付功能
2019/02/18 PHP
FormValidate 表单验证功能代码更新并提供下载
2008/08/23 Javascript
javascript 解析后的xml对象的读取方法细解
2009/07/25 Javascript
jQuery的强大选择器小结
2009/12/27 Javascript
ExtJS4 组件化编程,动态加载,面向对象,Direct
2011/05/12 Javascript
Jquery实现弹出层分享微博插件具备动画效果
2013/04/03 Javascript
不用锚点也可以平滑滚动到页面的指定位置实现代码
2013/05/08 Javascript
JavaScript中Date对象的常用方法示例
2015/10/24 Javascript
node.js中module.exports与exports用法上的区别
2016/09/02 Javascript
微信小程序 tabs选项卡效果的实现
2017/01/05 Javascript
Angular4学习教程之DOM属性绑定详解
2018/01/04 Javascript
基于javascript处理二进制图片流过程详解
2020/06/08 Javascript
vue中的v-model原理,与组件自定义v-model详解
2020/08/04 Javascript
python基础教程之基本数据类型和变量声明介绍
2014/08/29 Python
Python实现网站文件的全备份和差异备份
2014/11/30 Python
Python中的FTP通信模块ftplib的用法整理
2016/07/08 Python
Python3 socket同步通信简单示例
2017/06/07 Python
python微信跳一跳系列之棋子定位像素遍历
2018/02/26 Python
python实现隐马尔科夫模型HMM
2018/03/25 Python
python实现小球弹跳效果
2019/05/10 Python
python写日志文件操作类与应用示例
2019/07/01 Python
关于Pytorch的MNIST数据集的预处理详解
2020/01/10 Python
Django 设置admin后台表和App(应用)为中文名的操作方法
2020/05/10 Python
在pycharm中创建django项目的示例代码
2020/05/28 Python
纯CSS3实现地球自转实现代码(图文教程附送源码)
2012/12/26 HTML / CSS
Ramy Brook官网:美国现代女装品牌
2019/06/18 全球购物
荣耀商城:HIHONOR
2020/11/03 全球购物
儿媳婚宴答谢词
2014/01/14 职场文书
音乐之声音乐广播稿
2014/09/10 职场文书
逃课打麻将检讨书
2014/10/05 职场文书
MySQL限制查询和数据排序介绍
2022/03/25 MySQL