RedisCluster集群之动态增删节点

2023-11-06 08:50

本文主要是介绍RedisCluster集群之动态增删节点,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

RedisCluster集群之动态增删节点

  • Redis基本数据结构见《Redis基本语法与数据结构》
  • 如何搭建cluster集群见《RedisCluster集群之搭建》

前言:之前我们尝试搭建了cluster集群,并且通过redis-cli客户端查看了集群状态,下面我们将会继续介绍如何动态添加节点与删除节点。

预先准备内容:新增两个节点,并启动(步骤与前一文6个节点服务类似)

一、动态添加集群节点

计划添加 7007与7008两个节点服务,并且分别对应master与slave。

./src/redis-server cluster-config/7007/redis.conf
./src/redis-server cluster-config/7008/redis.conf

1.1 先添加Master节点(7007)

1.1.1 新增节点

利用 redis-trib.rb 的命令 add-node newIP:port oldIP:port

# 第一个IP为新添加的节点IP地址,第二个IP为当前集群中已经存在的任意一个节点,主要是为了建立关系
./src/redis-trib.rb add-node 127.0.0.1:7007 127.0.0.1:7001

输出

>>> Adding node 127.0.0.1:7007 to cluster 127.0.0.1:7001
>>> Performing Cluster Check (using node 127.0.0.1:7001)
M: 44c678a77a5181b99f6fe0a5e24a98462d687288 127.0.0.1:7001slots:0-5460 (5461 slots) master1 additional replica(s)
M: 0d68dfae22060574a19712f2b6ee2608dbf1b471 127.0.0.1:7003slots:10923-16383 (5461 slots) master1 additional replica(s)
S: ca9146ea9ce9ef7aa60ac2511f90bd91677285ff 127.0.0.1:7004slots: (0 slots) slavereplicates 0d68dfae22060574a19712f2b6ee2608dbf1b471
S: bb5f01c7e82348e6c90ce7da209696d02e06546b 127.0.0.1:7005slots: (0 slots) slavereplicates 44c678a77a5181b99f6fe0a5e24a98462d687288
S: 88a52d61d4c5f5ee00551a546460697bf9f1c475 127.0.0.1:7006slots: (0 slots) slavereplicates 83e9712ba4520f949119b21a4ebb3de2d66ed2a0
M: 83e9712ba4520f949119b21a4ebb3de2d66ed2a0 127.0.0.1:7002slots:5461-10922 (5462 slots) master1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Send CLUSTER MEET to node 127.0.0.1:7007 to make it join the cluster. 
[OK] New node added correctly. // 提示新的节点成功加入

客户端连接查看nodes节点

./src/redis-cli -c -h 127.0.0.1 -p 7001
127.0.0.1:7001> cluster nodes
0d68dfae22060574a19712f2b6ee2608dbf1b471 127.0.0.1:7003@17003 master - 0 1537151595086 3 connected 10923-16383
ca9146ea9ce9ef7aa60ac2511f90bd91677285ff 127.0.0.1:7004@17004 slave 0d68dfae22060574a19712f2b6ee2608dbf1b471 0 1537151596091 4 connected
bb5f01c7e82348e6c90ce7da209696d02e06546b 127.0.0.1:7005@17005 slave 44c678a77a5181b99f6fe0a5e24a98462d687288 0 1537151595086 5 connected
88a52d61d4c5f5ee00551a546460697bf9f1c475 127.0.0.1:7006@17006 slave 83e9712ba4520f949119b21a4ebb3de2d66ed2a0 0 1537151595588 6 connected
// 新节点,master,没有槽点
b062c61070542120c4cc6d6bb1e9c800a28f1be7 127.0.0.1:7007@17007 master - 0 1537151594000 0 connected
83e9712ba4520f949119b21a4ebb3de2d66ed2a0 127.0.0.1:7002@17002 master - 0 1537151594077 2 connected 5461-10922
44c678a77a5181b99f6fe0a5e24a98462d687288 127.0.0.1:7001@17001 myself,master - 0 1537151594000 1 connected 0-5460

会发现新添加的节点为master,但是并没有分配槽点

// 与其他master相比,没有槽点信息
b062c61070542120c4cc6d6bb1e9c800a28f1be7 127.0.0.1:7007@17007 master - 0 1537151594000 0 connected 
1.1.2 分配槽点

重新分片 reshard

./src/redis-trib.rb reshard 127.0.0.1:7007

提示

// 打算分配多少槽点给当前节点
How many slots do you want to move (from 1 to 16384)?

输入 200 (意思是给当前节点分配200个槽点)

// 接收节点的ID是多少,也就是当前节点的ID
What is the receiving node ID? 

输入 b062c61070542120c4cc6d6bb1e9c800a28f1be7

// 这里支持从所有节点平均分配槽点,以及从指定节点分配槽点两种方式
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: // 这里输入槽点来源节点的ID,已done结束,或all(如果是all,则表示从所有节点获取)

这里提示 Source node #1: 我们输入 7001 对应的ID,回车后,输入 done 执行提交

Source node #2: done

回车后会展示分配计划,并提问是否确认分片计划

Do you want to proceed with the proposed reshard plan (yes/no)? yes

输入 yes 即可。

此时新节点添加完成,下面我们验证一下

1.1.3 验证节点

进入客户端,并输入 cluster nodes 得出如下内容

0d68dfae22060574a19712f2b6ee2608dbf1b471 127.0.0.1:7003@17003 master - 0 1537152323501 3 connected 10923-16383
ca9146ea9ce9ef7aa60ac2511f90bd91677285ff 127.0.0.1:7004@17004 slave 0d68dfae22060574a19712f2b6ee2608dbf1b471 0 1537152323198 4 connected
bb5f01c7e82348e6c90ce7da209696d02e06546b 127.0.0.1:7005@17005 slave 44c678a77a5181b99f6fe0a5e24a98462d687288 0 1537152322000 5 connected
88a52d61d4c5f5ee00551a546460697bf9f1c475 127.0.0.1:7006@17006 slave 83e9712ba4520f949119b21a4ebb3de2d66ed2a0 0 1537152322190 6 connected
// 7007 多出 0-199
b062c61070542120c4cc6d6bb1e9c800a28f1be7 127.0.0.1:7007@17007 master - 0 1537152322000 7 connected 0-199
83e9712ba4520f949119b21a4ebb3de2d66ed2a0 127.0.0.1:7002@17002 master - 0 1537152323098 2 connected 5461-10922
// 7001 少了0-199,变为200-5460
44c678a77a5181b99f6fe0a5e24a98462d687288 127.0.0.1:7001@17001 myself,master - 0 1537152323000 1 connected 200-5460
  • 7007节点的后面比之前多出了 0-199 的内容,标识分配0~199共200个槽点。
  • 7001节点少了200个节点(现在的范围是200~5460

1.2 先添加Slave节点(7008)

1.2.1 新增节点

利用 redis-trib.rb 的命令 add-node 添加节点

./src/redis-trib.rb add-node 127.0.0.1:7008 127.0.0.1:7001

通过上面我们已经知道,新添加的节点是master,这里我们需要将7008节点变为7007节点的slave节点

1.2.2 切换身份

客户端连接进入7008

./src/redis-cli -c -h 127.0.0.1 -p 7008

将7008节点变为7007节点的slave节点

# 最后输入的是 目标Master对应的IP
127.0.0.1:7008> cluster replicate b062c61070542120c4cc6d6bb1e9c800a28f1be7

至此,slave节点已经添加完成了

1.2.3 验证节点

进入客户端,并输入 cluster nodes 得出如下内容

b062c61070542120c4cc6d6bb1e9c800a28f1be7 127.0.0.1:7007@17007 master - 0 1537153050731 7 connected 0-199
bb5f01c7e82348e6c90ce7da209696d02e06546b 127.0.0.1:7005@17005 slave 44c678a77a5181b99f6fe0a5e24a98462d687288 0 1537153049000 1 connected
88a52d61d4c5f5ee00551a546460697bf9f1c475 127.0.0.1:7006@17006 slave 83e9712ba4520f949119b21a4ebb3de2d66ed2a0 0 1537153049522 2 connected
ca9146ea9ce9ef7aa60ac2511f90bd91677285ff 127.0.0.1:7004@17004 slave 0d68dfae22060574a19712f2b6ee2608dbf1b471 0 1537153050227 3 connected
83e9712ba4520f949119b21a4ebb3de2d66ed2a0 127.0.0.1:7002@17002 master - 0 1537153049000 2 connected 5461-10922
44c678a77a5181b99f6fe0a5e24a98462d687288 127.0.0.1:7001@17001 master - 0 1537153050000 1 connected 200-5460
0d68dfae22060574a19712f2b6ee2608dbf1b471 127.0.0.1:7003@17003 master - 0 1537153049522 3 connected 10923-16383
// 变为Slave
99496d346dd4ab3b1b40ec1b802245a80ab9b1cd 127.0.0.1:7008@17008 myself,slave b062c61070542120c4cc6d6bb1e9c800a28f1be7 0 1537153049000 0 connected 

可见当前节点(7008)已成为Slave

二、动态删除集群节点

2.1 删除Master节点(7007)

2.1.1 移出槽点

步骤与分配槽点一样

输入重新分片命令

./src/redis-trib.rb reshard 127.0.0.1:7007

提示

// 移出200
How many slots do you want to move (from 1 to 16384)?  200
// 输入接收槽点的节点的ID,这里输入的是7001的ID
What is the receiving node ID? 44c678a77a5181b99f6fe0a5e24a98462d687288
// 输入移出槽点的节点的ID,这里先输入7007的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.
// 输入7007的ID
Source node #1:b062c61070542120c4cc6d6bb1e9c800a28f1be7
// 输入done执行指定节点的模式提交,all表示从所有节点上面平均分配
Source node #2:done
// 是否执行重新分片计划,输入yes
Do you want to proceed with the proposed reshard plan (yes/no)? yes 

此时通过客户端查看 cluster nodes

// 7007 这里没有了之前的槽点
b062c61070542120c4cc6d6bb1e9c800a28f1be7 127.0.0.1:7007@17007 master - 0 1537153624000 7 connected 
bb5f01c7e82348e6c90ce7da209696d02e06546b 127.0.0.1:7005@17005 slave 44c678a77a5181b99f6fe0a5e24a98462d687288 0 1537153624350 8 connected
88a52d61d4c5f5ee00551a546460697bf9f1c475 127.0.0.1:7006@17006 slave 83e9712ba4520f949119b21a4ebb3de2d66ed2a0 0 1537153625000 2 connected
ca9146ea9ce9ef7aa60ac2511f90bd91677285ff 127.0.0.1:7004@17004 slave 0d68dfae22060574a19712f2b6ee2608dbf1b471 0 1537153625565 3 connected
83e9712ba4520f949119b21a4ebb3de2d66ed2a0 127.0.0.1:7002@17002 master - 0 1537153625565 2 connected 5461-10922
// 7001 恢复如初
44c678a77a5181b99f6fe0a5e24a98462d687288 127.0.0.1:7001@17001 master - 0 1537153623846 8 connected 0-5460 
0d68dfae22060574a19712f2b6ee2608dbf1b471 127.0.0.1:7003@17003 master - 0 1537153625000 3 connected 10923-16383
99496d346dd4ab3b1b40ec1b802245a80ab9b1cd 127.0.0.1:7008@17008 myself,slave 44c678a77a5181b99f6fe0a5e24a98462d687288 0 1537153625000 0 connected

可见

  • 7007节点的槽点已经没有了,此时7007节点的数据已经迁移完毕,可以随时删除7007节点。
  • 7001节点的槽点已经恢复为0-5460了。
2.1.2 集群移除节点

直接使用命令 del-node ip:port id

./src/redis-trib.rb del-node 127.0.0.1:7007 b062c61070542120c4cc6d6bb1e9c800a28f1be7

提示如下,说明删除成功

>>> Removing node b062c61070542120c4cc6d6bb1e9c800a28f1be7 from cluster 127.0.0.1:7007
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.
2.1.3 验证结果

进入客户端输入命令 cluster nodes

0d68dfae22060574a19712f2b6ee2608dbf1b471 127.0.0.1:7003@17003 master - 0 1537154183000 3 connected 10923-16383
ca9146ea9ce9ef7aa60ac2511f90bd91677285ff 127.0.0.1:7004@17004 slave 0d68dfae22060574a19712f2b6ee2608dbf1b471 0 1537154183391 4 connected
bb5f01c7e82348e6c90ce7da209696d02e06546b 127.0.0.1:7005@17005 slave 44c678a77a5181b99f6fe0a5e24a98462d687288 0 1537154183592 8 connected
88a52d61d4c5f5ee00551a546460697bf9f1c475 127.0.0.1:7006@17006 slave 83e9712ba4520f949119b21a4ebb3de2d66ed2a0 0 1537154183000 6 connected
83e9712ba4520f949119b21a4ebb3de2d66ed2a0 127.0.0.1:7002@17002 master - 0 1537154183895 2 connected 5461-10922
99496d346dd4ab3b1b40ec1b802245a80ab9b1cd 127.0.0.1:7008@17008 slave 44c678a77a5181b99f6fe0a5e24a98462d687288 0 1537154182080 8 connected
44c678a77a5181b99f6fe0a5e24a98462d687288 127.0.0.1:7001@17001 myself,master - 0 1537154182000 8 connected 0-5460

发现7007成功移除了

2.2 删除Slave节点(7008)

slave节点,直接移除即可

./src/redis-trib.rb del-node 127.0.0.1:7008 99496d346dd4ab3b1b40ec1b802245a80ab9b1cd

三、综上

至此,实现动态添加、删除节点的功能。

我们总结一下添加和删除的步骤

添加节点

  • 添加Master节点
    • 加入集群:使用 redis-trib.rb add-node newIP:port oldIP:port
    • 分配槽点:使用 redis-trib.rb reshard ip:port 进行重新分片
  • 添加Slave节点
    • 加入集群:使用 redis-trib.rb add-node newIP:port oldIP:port
    • 更换角色:客户端连接进入当前节点,cluster replicate masterIP

删除节点

  • 删除Master节点
    • 移出槽点:使用redis-trib.rb reshard ip:port 进行重新分片,并移出
    • 移出集群:使用redis-trib.rb del-node ip:port id
  • 删除Slave节点
    • 移出集群:使用redis-trib.rb del-node ip:port id

博客

开源中国博客地址

https://my.oschina.net/gmarshal

个人博客地址

http://blog.foruo.top

欢迎关注我的个人微信订阅号:(据说这个头像程序猿专用)

输入图片说明

转载于:https://my.oschina.net/gmarshal/blog/2052817

这篇关于RedisCluster集群之动态增删节点的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/355636

相关文章

Java数组动态扩容的实现示例

《Java数组动态扩容的实现示例》本文主要介绍了Java数组动态扩容的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1 问题2 方法3 结语1 问题实现动态的给数组添加元素效果,实现对数组扩容,原始数组使用静态分配

MyBatis-Plus使用动态表名分表查询的实现

《MyBatis-Plus使用动态表名分表查询的实现》本文主要介绍了MyBatis-Plus使用动态表名分表查询,主要是动态修改表名的几种常见场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作... 目录1. 引入依赖2. myBATis-plus配置3. TenantContext 类:租户上下文

MySQL MHA集群详解(数据库高可用)

《MySQLMHA集群详解(数据库高可用)》MHA(MasterHighAvailability)是开源MySQL高可用管理工具,用于自动故障检测与转移,支持异步或半同步复制的MySQL主从架构,本... 目录mysql 高可用方案:MHA 详解与实战1. MHA 简介2. MHA 的组件组成(1)MHA

Java中的随机数生成案例从范围字符串到动态区间应用

《Java中的随机数生成案例从范围字符串到动态区间应用》本文介绍了在Java中生成随机数的多种方法,并通过两个案例解析如何根据业务需求生成特定范围的随机数,本文通过两个实际案例详细介绍如何在java中... 目录Java中的随机数生成:从范围字符串到动态区间应用引言目录1. Java中的随机数生成基础基本随

golang实现nacos获取配置和服务注册-支持集群详解

《golang实现nacos获取配置和服务注册-支持集群详解》文章介绍了如何在Go语言中使用Nacos获取配置和服务注册,支持集群初始化,客户端结构体中的IpAddresses可以配置多个地址,新客户... 目录golang nacos获取配置和服务注册-支持集群初始化客户端可选参数配置new一个客户端 支

基于Nacos实现SpringBoot动态定时任务调度

《基于Nacos实现SpringBoot动态定时任务调度》本文主要介绍了在SpringBoot项目中使用SpringScheduling实现定时任务,并通过Nacos动态配置Cron表达式实现任务的动... 目录背景实现动态变更定时机制配置化 cron 表达式Spring schedule 调度规则追踪定时

MySQL集群高可用架构的两种使用小结

《MySQL集群高可用架构的两种使用小结》本文介绍了MySQL的两种高可用解决方案:组复制(MGR)和MasterHighAvailability(MHA),文中通过示例代码介绍的非常详细,对大家的学... 目录一、mysql高可用之组复制(MGR)1.1 组复制核心特性与优势1.2 组复制架构原理1.3

Docker + Redis 部署集群的实现步骤

《Docker+Redis部署集群的实现步骤》本文详细介绍了在三台服务器上部署高可用Redis集群的完整流程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋... 目录一、环境准备1. 服务器规划(3 台服务器)2. 防火墙配置(三台服务器均执行)3. 安装 docke

springBoot (springCloud2025)集成redisCluster 集群的操作方法

《springBoot(springCloud2025)集成redisCluster集群的操作方法》文章介绍了如何使用SpringBoot集成RedisCluster集群,并详细说明了pom.xm... 目录pom.XMLapplication.yamlcluster配置类其他配置类连接池配置类Redis

Spring Boot整合Redis注解实现增删改查功能(Redis注解使用)

《SpringBoot整合Redis注解实现增删改查功能(Redis注解使用)》文章介绍了如何使用SpringBoot整合Redis注解实现增删改查功能,包括配置、实体类、Repository、Se... 目录配置Redis连接定义实体类创建Repository接口增删改查操作示例插入数据查询数据删除数据更