Redis学习总结(六)--Redis集群伸缩
我们在上一章讲了如何创建集群,今天我们来实现下集群的伸缩。
添加节点
操作流程
1.启动节点
2.将节点加入到集群中
3.将数据槽从原来的节点迁移部分到新节点上
实践
1)准备两个新节点并启动
[root@VM_0_15_centos config]# sed 's/7000/7006/g' redis-7000.conf > redis-7006.conf
[root@VM_0_15_centos config]# sed 's/7000/7007/g' redis-7000.conf > redis-7007.conf
[root@VM_0_15_centos config]# cd ..
[root@VM_0_15_centos redis4]# ./redis-server config/redis-7006.conf
[root@VM_0_15_centos redis4]# ./redis-server config/redis-7007.conf
[root@VM_0_15_centos redis4]# ps -ef | grep redis
root 10788 1 0 14:20 ? 00:00:00 ./redis-server *:7006 [cluster]
root 10793 1 0 14:20 ? 00:00:00 ./redis-server *:7007 [cluster]
root 10817 1362 0 14:21 pts/0 00:00:00 grep --color=auto redis
root 29570 1 0 10:15 ? 00:00:11 ./redis-server *:7000 [cluster]
root 29575 1 0 10:15 ? 00:00:10 ./redis-server *:7001 [cluster]
root 29581 1 0 10:15 ? 00:00:12 ./redis-server *:7002 [cluster]
root 29587 1 0 10:15 ? 00:00:12 ./redis-server *:7003 [cluster]
root 29593 1 0 10:15 ? 00:00:11 ./redis-server *:7004 [cluster]
root 29599 1 0 10:15 ? 00:00:11 ./redis-server *:7005 [cluster]
- 将节点加入集群
有两种方式可以添加:
- 原生命令
- redis-trib 工具
原生命令
# 进入任一集群节点
[root@VM_0_15_centos redis4]# ./redis-cli -p 7000
# 将新增加的节点加入到集群中来
127.0.0.1:7000> cluster meet 127.0.0.1 7006
OK
127.0.0.1:7000> cluster meet 127.0.0.1 7007
OK
redis-trib 工具
redis-trib.rb add-node 127.0.0.1:6387 127.0.0.1:7006
redis-trib.rb add-node 127.0.0.1:6388 127.0.0.1:7007
新节点刚开始都是主节点状态,但是由于没有负责的槽,所以不能接受任何读写操作。对于新节点的后续操作一般有两种选择:
◆ 为它迁移槽和数据实现扩容
◆ 作为其他主节点的从节点负责故障转移
- 迁移槽和数据,将 7000 端口中的部分槽迁移到 7006 端口中
# redis-trib.rb 执行槽重分片命令
[root@VM_0_15_centos redis4]# ./redis-trib.rb reshard 127.0.0.1:7000
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: 5de648cc0cc7c503169638bbe3a56fc3f4c3aa72 127.0.0.1:7000
slots:666-5460 (4795 slots) master
0 additional replica(s)
M: 90ab3e9992a4b0f6abddc75d03fce63099b4fb38 127.0.0.1:7003
slots:6128-10922 (4795 slots) master
1 additional replica(s)
M: 65cc70270ae44c1c8ca29bb09c609b5b5c878eef 127.0.0.1:7007
slots: (0 slots) master
0 additional replica(s)
S: 892668ae60f407be5094a667f3532e760b867e64 127.0.0.1:7005
slots: (0 slots) slave
replicates 90ab3e9992a4b0f6abddc75d03fce63099b4fb38
M: 1e3ec7626adcb2662700aa0ca9933d60232847a6 127.0.0.1:7002
slots:11589-16383 (4795 slots) master
1 additional replica(s)
M: 03274e13cb092f92a51a05a5eaca3a7a5618c356 127.0.0.1:7006
slots:0-665,5461-6127,10923-11588 (1999 slots) master
0 additional replica(s)
S: 5a2bbf95047bdf9719ca60152cf91e48e8a956bd 127.0.0.1:7004
slots: (0 slots) slave
replicates 1e3ec7626adcb2662700aa0ca9933d60232847a6
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
# 需要迁移的槽数量,这里选择2000
How many slots do you want to move (from 1 to 16384)? 2000
# 选择要迁移到的目标节点,这里选择 7006 端口对应的节点
What is the receiving node ID? 03274e13cb092f92a51a05a5eaca3a7a5618c356
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.
# 输入源节点的ID,这里选择全部 all
Source node #1: all
# 数据迁移之前会打印出所有的槽从源节点到目标节点的计划,确认计划无误后输入 yes 执行迁移工作,计划执行完成之后reshard命令自动退出。
Do you want to proceed with the proposed reshard plan (yes/no)? yes
- 将 70007 端口设为 7006 端口的从服务器
[root@VM_0_15_centos redis4]# ./redis-cli -h 127.0.0.1 -p 7000 cluster nodes
90ab3e9992a4b0f6abddc75d03fce63099b4fb38 127.0.0.1:7003@17003 master - 0 1542955379299 2 connected 6794-10922
65cc70270ae44c1c8ca29bb09c609b5b5c878eef 127.0.0.1:7007@17007 master - 0 1542955376000 0 connected
892668ae60f407be5094a667f3532e760b867e64 127.0.0.1:7005@17005 slave 90ab3e9992a4b0f6abddc75d03fce63099b4fb38 0 1542955376000 6 connected
1e3ec7626adcb2662700aa0ca9933d60232847a6 127.0.0.1:7002@17002 master - 0 1542955376294 3 connected 12255-16383
03274e13cb092f92a51a05a5eaca3a7a5618c356 127.0.0.1:7006@17006 master - 0 1542955378298 7 connected 0-1332 5461-6793 10923-12254
5a2bbf95047bdf9719ca60152cf91e48e8a956bd 127.0.0.1:7004@17004 slave 1e3ec7626adcb2662700aa0ca9933d60232847a6 0 1542955377296 4 connected
5de648cc0cc7c503169638bbe3a56fc3f4c3aa72 127.0.0.1:7000@17000 myself,master - 0 1542955377000 1 connected 1333-5460
[root@VM_0_15_centos redis4]# ./redis-cli -h 127.0.0.1 -p 7007 cluster replicate 03274e13cb092f92a51a05a5eaca3a7a5618c356
OK
删除节点
操作流程
删除节点跟增加节点的流程刚好相反:
1.将数据槽从当前节点迁移到其他节点上
2.让其他节点忘记当前节点
3.将节点服务停止
实践
1)迁移槽
查看节点信息
[root@VM_0_15_centos redis4]# ./redis-cli -h 127.0.0.1 -p 7000 cluster nodes
90ab3e9992a4b0f6abddc75d03fce63099b4fb38 127.0.0.1:7003@17003 master - 0 1542955959000 2 connected 6794-10922
65cc70270ae44c1c8ca29bb09c609b5b5c878eef 127.0.0.1:7007@17007 slave 03274e13cb092f92a51a05a5eaca3a7a5618c356 0 1542955961405 7 connected
892668ae60f407be5094a667f3532e760b867e64 127.0.0.1:7005@17005 slave 90ab3e9992a4b0f6abddc75d03fce63099b4fb38 0 1542955960404 6 connected
1e3ec7626adcb2662700aa0ca9933d60232847a6 127.0.0.1:7002@17002 master - 0 1542955959402 3 connected 12255-16383
03274e13cb092f92a51a05a5eaca3a7a5618c356 127.0.0.1:7006@17006 master - 0 1542955958400 7 connected 0-1332 5461-6793 10923-12254
5a2bbf95047bdf9719ca60152cf91e48e8a956bd 127.0.0.1:7004@17004 slave 1e3ec7626adcb2662700aa0ca9933d60232847a6 0 1542955958000 4 connected
5de648cc0cc7c503169638bbe3a56fc3f4c3aa72 127.0.0.1:7000@17000 myself,master - 0 1542955959000 1 connected 1333-5460
可以看到 7006 节点上有三个范围的槽 0-1332 5461-6793 10923-12254
# 从 7006 节点迁移 1333 槽到 7000 节点
[root@VM_0_15_centos redis4]# ./redis-trib.rb reshard --from 03274e13cb092f92a51a05a5eaca3a7a5618c356 --to 5de648cc0cc7c503169638bbe3a56fc3f4c3aa72 --slots 1333 127.0.0.1:7006
# 确认迁移
Do you want to proceed with the proposed reshard plan (yes/no)? yes
在查看下节点信息
[root@VM_0_15_centos redis4]# ./redis-cli -h 127.0.0.1 -p 7000 cluster nodes
03274e13cb092f92a51a05a5eaca3a7a5618c356 127.0.0.1:7006@17006 master - 0 1542956707000 7 connected 5461-6793 10923-12254
可以看到 7006 节点 只剩下 5461-6793 和 10923-12254,依次迁移
[root@VM_0_15_centos redis4]# ./redis-trib.rb reshard --from 03274e13cb092f92a51a05a5eaca3a7a5618c356 --to 5de648cc0cc7c503169638bbe3a56fc3f4c3aa72 --slots 1333 127.0.0.1:7006
[root@VM_0_15_centos redis4]# ./redis-trib.rb reshard --from 03274e13cb092f92a51a05a5eaca3a7a5618c356 --to 5de648cc0cc7c503169638bbe3a56fc3f4c3aa72 --slots 1 127.0.0.1:7006
查看节点信息:
[root@VM_0_15_centos redis4]# ./redis-cli -h 127.0.0.1 -p 7000 cluster nodes
03274e13cb092f92a51a05a5eaca3a7a5618c356 127.0.0.1:7006@17006 master - 0 1542956939273 7 connected
已经没有槽了。
2)忘记节点
# 先下从节点 7007 端口
[root@VM_0_15_centos redis4]# ./redis-trib.rb del-node 127.0.0.1:7000 65cc70270ae44c1c8ca29bb09c609b5b5c878eef
>>> Removing node 65cc70270ae44c1c8ca29bb09c609b5b5c878eef from cluster 127.0.0.1:7000
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.
# 再下主节点 7006 端口
[root@VM_0_15_centos redis4]# ./redis-trib.rb del-node 127.0.0.1:7000 03274e13cb092f92a51a05a5eaca3a7a5618c356
>>> Removing node 03274e13cb092f92a51a05a5eaca3a7a5618c356 from cluster 127.0.0.1:7000
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.
# 查看节点情况
[root@VM_0_15_centos redis4]# ./redis-cli -h 127.0.0.1 -p 7000 cluster nodes
90ab3e9992a4b0f6abddc75d03fce63099b4fb38 127.0.0.1:7003@17003 master - 0 1542957326994 2 connected 6794-10922
892668ae60f407be5094a667f3532e760b867e64 127.0.0.1:7005@17005 slave 90ab3e9992a4b0f6abddc75d03fce63099b4fb38 0 1542957325992 6 connected
1e3ec7626adcb2662700aa0ca9933d60232847a6 127.0.0.1:7002@17002 master - 0 1542957327995 3 connected 12255-16383
5a2bbf95047bdf9719ca60152cf91e48e8a956bd 127.0.0.1:7004@17004 slave 1e3ec7626adcb2662700aa0ca9933d60232847a6 0 1542957325000 4 connected
5de648cc0cc7c503169638bbe3a56fc3f4c3aa72 127.0.0.1:7000@17000 myself,master - 0 1542957326000 8 connected 0-6793 10923-12254
查看 Redis 进程
[root@VM_0_15_centos redis4]# ps -ef | grep redis
root 9326 1362 0 15:17 pts/0 00:00:00 grep --color=auto redis
root 29570 1 0 10:15 ? 00:00:17 ./redis-server *:7000 [cluster]
root 29575 1 0 10:15 ? 00:00:12 ./redis-server *:7001 [cluster]
root 29581 1 0 10:15 ? 00:00:17 ./redis-server *:7002 [cluster]
root 29587 1 0 10:15 ? 00:00:17 ./redis-server *:7003 [cluster]
root 29593 1 0 10:15 ? 00:00:14 ./redis-server *:7004 [cluster]
root 29599 1 0 10:15 ? 00:00:14 ./redis-server *:7005 [cluster]
可以看到 7006 和 7007 端口的服务已经停止了
Redis学习总结(六)--Redis集群伸缩的更多相关文章
- Redis学习笔记八:集群模式
作者:Grey 原文地址:Redis学习笔记八:集群模式 前面提到的Redis学习笔记七:主从复制和哨兵只能解决Redis的单点压力大和单点故障问题,接下来要讲的Redis Cluster模式,主要是 ...
- redis 学习笔记(6)-cluster集群搭建
上次写redis的学习笔记还是2014年,一转眼已经快2年过去了,在段时间里,redis最大的变化之一就是cluster功能的正式发布,以前要搞redis集群,得借助一致性hash来自己搞shardi ...
- Redis学习笔记~conf自主集群模式
回到目录 Redis自主提供了集群模式,当然也只是比较简单的读写分离模式,或者叫主从模式,它在各个redis服务端自己做数据同步机制,当然就是将主服务端的信息同步到各个slave服务器上,在客户端集成 ...
- 深入学习Redis(5):集群
前言 在前面的文章中,已经介绍了Redis的几种高可用技术:持久化.主从复制和哨兵,但这些方案仍有不足,其中最主要的问题是存储能力受单机限制,以及无法实现写操作的负载均衡. Redis集群解决了上述问 ...
- redis集群伸缩【转】
一:实验介绍 在不影响集群对外服务的情况下,可以为集群添加节点进行扩容,也可以下线部分节点进行缩容. 原理可以抽象为槽和对应数据在不同节点之间灵活移动. 如果希望加入一个节点来实现集群扩容时,需要通过 ...
- Redis源码阅读(六)集群-故障迁移(下)
Redis源码阅读(六)集群-故障迁移(下) 最近私人的事情比较多,没有抽出时间来整理博客.书接上文,上一篇里总结了Redis故障迁移的几个关键点,以及Redis中故障检测的实现.本篇主要介绍集群检测 ...
- Redis学习总结(五)--Redis集群创建
在之前我们讲到了主从,但是对于大数据量的场景下我们就需要用到集群了,让我们来了解下集群吧. 为什么需要集群 单机内存太小 redis最高可以达到10万/s 请求,如果超过该频率呢? 数据分布方式 数据 ...
- redis学习五,redis集群搭建及添加主从节点
redis集群 java架构师项目实战,高并发集群分布式,大数据高可用,视频教程 在redis3.0之前,出现了sentinel工具来监控各个Master的状态(可以看上一篇博客).如果Master异 ...
- SpringBoot学习笔记(13)----使用Spring Session+redis实现一个简单的集群
session集群的解决方案: 1.扩展指定server 利用Servlet容器提供的插件功能,自定义HttpSession的创建和管理策略,并通过配置的方式替换掉默认的策略.缺点:耦合Tomcat/ ...
随机推荐
- SQL SERVER Suspect(质疑/挂起) 状态恢复
数据库服务器,在断电时,偶尔会出现Suspect状态,导致数据库无法使用. 解决办法如下: 数据库名带‘[]’可以避免库名中带‘.’等特殊符号的情况. USE [master]GOALTER DATA ...
- Android的简述4
NoteEditor深入分析 首先来弄清楚“日志编辑“的状态转换,通过上篇文章的方法来做下面这样一个实验,首先进入“日志编辑“时会触发onCreate和onResume,然后用户通过Option Me ...
- Appium+python自动化(二十五)- 那些让人抓耳挠腮、揪头发和掉头发的事 - 获取控件ID(超详解)
简介 在前边的第二十二篇文章里,已经分享了通过获取控件的坐标点来获取点击事件的所需要的点击位置,那么还有没有其他方法来获取控件点击事件所需要的点击位置呢?答案是:Yes!因为在不同的大小屏幕的手机上获 ...
- Eclipse "R cannot be resolved"问题
前两天 Eclipse 又遇到了这个问题.网上找了不少,不过最终还是没能解决我的问题,无奈重装了 Eclipse…… 搜索中找到了下面这几篇文章,常见的解决方法都在这里,还是不错的,分享一下: htt ...
- Ubuntu 下jdk的安装
因为我ubuntu下需要运行一个java程序,其实是想做一下tc,因为浏览器要运行java插件,那个客户端一直下载不了,我记得我装过的,这个问题后面说.然后我就打算重新安装,通过查找资料,终于解决了手 ...
- .NET Core CSharp 中级篇 2-2 List,ArrayList和Dictionary
.NET Core CSharp 中级篇 2-2 本节内容为List,ArrayList,和Dictionary 简介 在此前的文章中我们学习了数组的使用,但是数组有一个很大的问题就是存储空间不足,我 ...
- 设置Myeclipse的jvm内存参数
Myeclipse经常会遇到内存溢出和Gc开销过大的情况,这时候就需要修改Myeclipse的Jvm内存参数 修改如下:(使用Extjs做公司大项目时候,不要让项目Builders的Javascrip ...
- 【kafka】一、消息队列
在高并发的应用场景中,由于来不及同步处理请求,接收到的请求往往会发生阻塞.例如,大量的插入.更新请求同时到达数据库,这会导致行或表被锁住,最后会因为请求堆积过多而触发“连接数过多的异常” 的错误.因此 ...
- weblogic10.3.6漏洞修改方案
1.CVE-2018-2628漏洞 CVE-2018-2628漏洞利用的第一步是与weblogic服务器开放在服务端口上的T3服务建立socket连接,可通过控制T3协议的访问来临时阻断攻击行为. W ...
- 安装yarn实况
[**前情提要**]最近在gayhub上面得到一个开源项目,遂准备研究一下源码,当然第一步就是要把项目运行起来.然后看了一下技术栈,发现包管理工具是使用yarn,以前也听说过yarn但是也没有具体使用 ...