Redis Cluster 集群节点维护 (三)
Redis Cluster 集群节点维护:
集群运行很久之后,难免由于硬件故障,网络规划,业务增长,等原因对已有集群进行相应的调整,比如增加redis nodes 节点,减少节点,节点迁移,更换服务器等
增加节点和删除节点会涉及到已有槽位的重新分配及数据迁移。
一 ) Redis Cluster节点添加:
# 1.1 节点添加环境:
主从 1 主从 2 主从 3 主从4(待添加)
master 10.10.5.11 10.10.5.12 10.10.5.13 10.10.5.17
slave 10.10.5.15 10.10.5.16 10.10.5.14 10.10.5.18
# 1.2 三个节点的slots区间是:
节点A覆盖0-5460;
节点B覆盖5461-10922;
节点C覆盖10923-16383.
# 1.3
二 ) 集群维护之动态添加节点:
# 2.1 增加节点需要与之前的redis node 版本相同,配置一致,然后分别启动两台 redis nodes(一主一从).
案例:
因公司业务发展迅猛现有的三主三从 Redis Cluster 架构可能无法满足现有业务的并发写入需求,因此公司采购服务器,需要将它动态添加到集群当中,因为是生产业务的redis cluster 不能影响使用和数据丢失,整体如下:
同步之前redis node 的配置文件到 10.10.5.17 - 18 redis 编译安装目录,注意配置文件的监听ip
# 2.2 提前做好两台主机的redis,安装并启动redis.
master 10.10.5.17
slave 10.10.5.18
控制节点 10.10.5.11
2.2.1 将17 18两台主机都加入到cluster 集群。
2.2.2 将18加入17变成slave. (刚加入cluster 两者均为master).
2.2.3 给新加入的节点(17)分配槽位.
# 2.3 在控制节点上操作添加命令:
# 添加一个node节点, 后面需要跟着集群内的主机(任意一台即可),别忘记加端口号.
./redis-trib.rb add-node 10.10.5.17:6379 10.10.5.16:6379
./redis-trib.rb add-node 10.10.5.18:6379 10.10.5.16:6379
# 2.4 进入集群内执行命令
redis-cli -a 123456 cluster nodes # 查找一下17和18的ID
10.10.5.17 390a1809c3312fc3c01ef69382e6836cdbbe8977
10.10.5.18 bfd4dbea0b85db2895c5152246638832ba1d2ce2
# 在10.10.5.18(slave)上执行命令后面加的是5.17(master)的ID,执行后主从成功创建:
*** 注意此处的命令需要在新加入cluster内,即将成为从的redis 内执行!***
cluster replicate 390a1809c3312fc3c01ef69382e6836cdbbe8977
验证主从是否创建成功:
[root@srv-1 src]# ./redis-trib.rb info 10.10.5.16:6379
10.10.5.17:6379 (390a1809...) -> 0 keys | 0 slots | 1 slaves. # 主上已经显示有了一个slave.
10.10.5.13:6379 (3a311c96...) -> 0 keys | 5461 slots | 1 slaves.
10.10.5.15:6379 (761fbb98...) -> 4 keys | 5461 slots | 1 slaves.
10.10.5.12:6379 (905e3ecb...) -> 1 keys | 5462 slots | 1 slaves.
[OK] 5 keys in 4 masters.
0.00 keys per slot on average.
# 重新分配槽位:
./redis-trib.rb reshard 10.10.5.11:6379
.............省略部分
M: 390a1809c3312fc3c01ef69382e6836cdbbe8977 10.10.5.17:6379
slots: (0 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)? 4096 # 要分多少个槽位slots给新的节点.
What is the receiving node ID? 390a1809c3312fc3c01ef69382e6836cdbbe8977 # 接收槽位的节点ID(master)。
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拿出来给新节点
Source node #1:all # 这是新的集群 我就直接ALL,生产环境可能会碰见分配错误.
.............省略部分
Moving slot 1364 from 761fbb98a72600b8322fc34e3b2bbf0adbd3822e
Do you want to proceed with the proposed reshard plan (yes/no)? # 确认分配的槽位
** 从哪些节点上分配槽位给新节点, 数据不多的可以选择all
** 会问一些分多少slots给新的节点。 参考 16382 / 4 = 4096个
# 重新分配的时候因为之前在其他老节点添加过数据,所以产生如下问题:
Moving slot 5798 from 10.10.5.12:6379 to 10.10.5.17:6379: # 5799 这个slots这个位置发生了错误.
[ERR] Calling MIGRATE: ERR Syntax error, try CLIENT (LIST | KILL | GETNAME | SETNAME | PAUSE | REPLY)
*** 笨点的方法竟然是清除所有数据,如果是生产环境有大量数据 不建议这么操作 ***
# 根据提示 5799发生了错误, 看slots数值应该是在B节点上 10.10.5.12
redis-cli -h 10.10.5.12 -a 123456 flushall
redis-cli -h 10.10.5.12 -a 123456 bgsave
# 至此重新执行分配槽位, 不负众望再次出现了错误, 提示需要fix 来修复.(此时如果是生产环境一定要淡定!整个关老爷在边上镇着.)
./redis-trib.rb reshard 10.10.5.11:6379
[WARNING] The following slots are open: 5798
>>> Check slots coverage...
[OK] All 16384 slots covered.
*** Please fix your cluster problems before resharding
# 修复cluster集群数据:
./redis-trib.rb fix 10.10.5.11:6379
.............省略部分
>>> Check for open slots...
>>> Fixing open slot 5798
Set as importing in: 10.10.5.17:6379
Moving slot 5798 from 10.10.5.12:6379 to 10.10.5.17:6379:
>>> Check slots coverage...
[OK] All 16384 slots covered.
*** 至此redis cluster 添加节点并分配槽位完成 ***
# 查看最后分配的slots情况:
[root@srv-1 src]# ./redis-trib.rb info 10.10.5.11:6379
10.10.5.13:6379 (3a311c96...) -> 0 keys | 5461 slots | 1 slaves.
10.10.5.15:6379 (761fbb98...) -> 0 keys | 5461 slots | 1 slaves.
10.10.5.17:6379 (390a1809...) -> 0 keys | 338 slots | 1 slaves. # 由于分配槽位时发生了错误,导致仅仅分配了338个slots.
10.10.5.12:6379 (905e3ecb...) -> 0 keys | 5124 slots | 1 slaves.
[OK] 0 keys in 4 masters.
0.00 keys per slot on average.
*** 由于分配槽位时发生了错误,导致仅仅分配了338个slots,这在生产环境是绝对不能原谅的, 为了均衡每个机器上的slots数量 可以再次进行重新分配
*** 生产环境还是 建议一台一台操作 分配每台多余的slots给新加入的节点, 不要用all 这个自动分配的选项. 虽然单台操作比较麻烦,数据无价.
# 查看集群节点上的key 和 slots个数:
[root@srv-1 src]# ./redis-trib.rb info 10.10.5.16:6379
10.10.5.17:6379 (390a1809...) -> 0 keys | 0 slots | 0 slaves. # 5.17 没有slots和slave
10.10.5.13:6379 (3a311c96...) -> 0 keys | 5461 slots | 1 slaves.
10.10.5.18:6379 (bfd4dbea...) -> 0 keys | 0 slots | 0 slaves. # 5.18 没有slots和slave
10.10.5.15:6379 (761fbb98...) -> 4 keys | 5461 slots | 1 slaves.
10.10.5.12:6379 (905e3ecb...) -> 1 keys | 5462 slots | 1 slaves.
[OK] 5 keys in 5 masters.
0.00 keys per slot on average.
# 查看添加到集群内主机的信息,
[root@srv-1 src]# ./redis-trib.rb check 10.10.5.16:6379
>>> Performing Cluster Check (using node 10.10.5.16:6379)
S: 57e6cc3af523aa829705cd0072d6283b988a43c7 10.10.5.16:6379
slots: (0 slots) slave
replicates 905e3ecb99a4723b12bb5d7fda91372ee72909be
M: 390a1809c3312fc3c01ef69382e6836cdbbe8977 10.10.5.17:6379 # 新添加的节点主机
slots: (0 slots) master # 没有分配任何slots,是个master.
0 additional replica(s) # 没有主从关系, 没有从库.
M: 3a311c961450d50f6236d814106fcd0f7723e071 10.10.5.13:6379
slots:10923-16383 (5461 slots) master
1 additional replica(s)
M: bfd4dbea0b85db2895c5152246638832ba1d2ce2 10.10.5.18:6379 # 新添加的节点主机
slots: (0 slots) master # 没有分配任何slots,是个master.
0 additional replica(s) # 没有主从关系, 没有从库.
S: bad22bcf6c5c42b13c3692c4d1cfcbde7fd7ce14 10.10.5.14:6379
slots: (0 slots) slave
replicates 3a311c961450d50f6236d814106fcd0f7723e071
M: 761fbb98a72600b8322fc34e3b2bbf0adbd3822e 10.10.5.15:6379
slots:0-5460 (5461 slots) master
1 additional replica(s)
M: 905e3ecb99a4723b12bb5d7fda91372ee72909be 10.10.5.12:6379
slots:5461-10922 (5462 slots) master
1 additional replica(s)
S: 291faee66636effee60e8409894a4ebae40fe4a6 10.10.5.11:6379
slots: (0 slots) slave
replicates 761fbb98a72600b8322fc34e3b2bbf0adbd3822e
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
Redis Cluster 集群节点维护 (三)的更多相关文章
- redis cluster 集群畅谈(三) 之 水平扩容、slave自动化迁移
上一篇http://www.cnblogs.com/qinyujie/p/9029522.html, 主要讲解 实验多master写入.读写分离.实验自动故障切换(高可用性),那么本篇我们就来聊了聊r ...
- Redis Cluster 集群节点信息 维护篇(二)
集群信息文件: # cluster 集群内部信息对应文件,由集群自动维护. /data/soft/redis/6379data/nodes-6379.conf 集群信息查看: ./redis-trib ...
- centos6下redis cluster集群部署过程
一般来说,redis主从和mysql主从目的差不多,但redis主从配置很简单,主要在从节点配置文件指定主节点ip和端口,比如:slaveof 192.168.10.10 6379,然后启动主从,主从 ...
- JFinal redis cluster集群插件
JFinal redis cluster集群插件 JFinal 框架到了2.1版本号,可是依旧仅仅支持redis的主从集群,没有看到Cluster集群的插件.笔者照着主从的插件方式,改了改,实现了个简 ...
- K8S部署Redis Cluster集群(三主三从模式) - 部署笔记
一.Redis 介绍 Redis代表REmote DIctionary Server是一种开源的内存中数据存储,通常用作数据库,缓存或消息代理.它可以存储和操作高级数据类型,例如列表,地图,集合和排序 ...
- 输出redis cluster集群所有节点指定的参数的配置
需要:实现类似redis-trib.rb call 命令的功能,输出redis cluster集群所有节点指定的参数的配置 redis-trib.rb的输出 [redis@lxd-vm3 ~]$ re ...
- Redis Cluster集群搭建与应用
1.redis-cluster设计 Redis集群搭建的方式有多种,例如使用zookeeper,但从redis 3.0之后版本支持redis-cluster集群,redis-cluster采用无中心结 ...
- Redis cluster集群:原理及搭建
Redis cluster集群:原理及搭建 2018年03月19日 16:00:55 阅读数:6120 1.为什么使用redis? redis是一种典型的no-sql 即非关系数据库 像python的 ...
- Redis Cluster集群搭建<原>
一.环境配置 一台window 7上安装虚拟机,虚拟机中安装的是centos系统. 二.目标 Redis集群搭建的方式有多种,根据集群逻辑的位置,大致可以分为三大类:基于客户端分片的Redis ...
随机推荐
- linux修改文件所属的用户组以及用户
linux修改文件所属的用户组以及用户 将文件夹从A用户(huangxf)目录复制B用户(zhenglf)目录,其中B没有sudo权限.将A的Downloads文件夹下的所有文件,复制到B的Docum ...
- ThreadX——IPC应用之信号量
一.应用简介 在RTOS的应用开发中,信号量也是经常使用到的一种用于多任务之间信息同步.资源互斥访问的一种手段,常用于协调多个任务访问同一资源的场景.信号量又分为计数信号量和互斥信号量.计数信号量可以 ...
- apt-get could not get lock /var/lib/dpkg/lock报错
用apt-get命令安装一些软件包时,报这个错 could not get lock /var/lib/dpkg/lock 出现这个问题的原因可能是有另外一个程序正在运行,导致资源被锁不可用.而导致资 ...
- 公司项目适配IOS9总结
1.JSONKit 项目在xcode7 IOS9 开发环境上报错,不能进行JSONSring和JSONData的使用 .在真机上没有问题,在模拟器上put和post数据适合JSONKit报空对象野指针 ...
- js下 Day05、DOM案例
一.简易购物车 效果图: 功能思路分析: 功能一:数量加减 \1. 找到所有的加号按钮,循环绑定点击事件.点击加号时让对应的数量+1 (找清楚加号和数量的关系,让数量标签的内容++) \2. 找到所有 ...
- [日常摸鱼]poj1151Atlantis-扫描线
题意:给一堆长宽平行于坐标轴的长方形求并的面积 我个沙茶快写了一晚上- 大概思想就是先根据$y$坐标排个序,把$y$坐标离散化一下,放到线段树里面维护,这里的写法是让线段树的节点储存这个点对应的整段线 ...
- 啊!Java虚方法
什么是Java的虚方法呢,我们首先看看什么是虚函数 虚函数 百度百科的解释为: 在某基类中声明为 virtual 并在一个或多个派生类中被重新定义的[成员函数],用法格式为:virtual 函数返回 ...
- Web服务器-并发服务器-Epoll(3.4.5)
@ 目录 1.介绍 2.代码 关于作者 1.介绍 epoll是一种解决方案,nginx就是用的这个 中心思想:不要再使用多进程,多线程了,使用单进程,单线程去实现并发 在上面博客实现的代码中使用过的轮 ...
- 抢先看:笔者亲历的2020年中国.NET开发者大会活动纪实
2020年中国.NET开发者大会活动纪实 1 2020年12月19日的苏州工业园区,天公作美,阳光明媚,气象迷人,正是一个搞事的好日子.在这里,数百名中国.NET开发者们汇聚一堂,怀揣着激情和梦想,一 ...
- RocketMQ源码分析 broker启动,commitlog、consumequeue、indexfile、MappedFileQueue、MappedFile之间的关系以及位置说明
目录 1.MappedFile类属性说明 1.1.MappedFile类属性如下 1.2.MappedFile构造器说明 2.MappedFileQueue类说明 2.1.属性说明 2.2.Mappe ...