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

相关文章

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

HDFS—集群扩容及缩容

白名单:表示在白名单的主机IP地址可以,用来存储数据。 配置白名单步骤如下: 1)在NameNode节点的/opt/module/hadoop-3.1.4/etc/hadoop目录下分别创建whitelist 和blacklist文件 (1)创建白名单 [lytfly@hadoop102 hadoop]$ vim whitelist 在whitelist中添加如下主机名称,假如集群正常工作的节

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

动态规划---打家劫舍

题目: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。 思路: 动态规划五部曲: 1.确定dp数组及含义 dp数组是一维数组,dp[i]代表

搭建Kafka+zookeeper集群调度

前言 硬件环境 172.18.0.5        kafkazk1        Kafka+zookeeper                Kafka Broker集群 172.18.0.6        kafkazk2        Kafka+zookeeper                Kafka Broker集群 172.18.0.7        kafkazk3

day-51 合并零之间的节点

思路 直接遍历链表即可,遇到val=0跳过,val非零则加在一起,最后返回即可 解题过程 返回链表可以有头结点,方便插入,返回head.next Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}*

[MySQL表的增删改查-进阶]

🌈个人主页:努力学编程’ ⛅个人推荐: c语言从初阶到进阶 JavaEE详解 数据结构 ⚡学好数据结构,刷题刻不容缓:点击一起刷题 🌙心灵鸡汤:总有人要赢,为什么不能是我呢 💻💻💻数据库约束 🔭🔭🔭约束类型 not null: 指示某列不能存储 NULL 值unique: 保证某列的每行必须有唯一的值default: 规定没有给列赋值时的默认值.primary key:

代码随想录冲冲冲 Day39 动态规划Part7

198. 打家劫舍 dp数组的意义是在第i位的时候偷的最大钱数是多少 如果nums的size为0 总价值当然就是0 如果nums的size为1 总价值是nums[0] 遍历顺序就是从小到大遍历 之后是递推公式 对于dp[i]的最大价值来说有两种可能 1.偷第i个 那么最大价值就是dp[i-2]+nums[i] 2.不偷第i个 那么价值就是dp[i-1] 之后取这两个的最大值就是d