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 集群节点维护 (三)的更多相关文章

  1. redis cluster 集群畅谈(三) 之 水平扩容、slave自动化迁移

    上一篇http://www.cnblogs.com/qinyujie/p/9029522.html, 主要讲解 实验多master写入.读写分离.实验自动故障切换(高可用性),那么本篇我们就来聊了聊r ...

  2. Redis Cluster 集群节点信息 维护篇(二)

    集群信息文件: # cluster 集群内部信息对应文件,由集群自动维护. /data/soft/redis/6379data/nodes-6379.conf 集群信息查看: ./redis-trib ...

  3. centos6下redis cluster集群部署过程

    一般来说,redis主从和mysql主从目的差不多,但redis主从配置很简单,主要在从节点配置文件指定主节点ip和端口,比如:slaveof 192.168.10.10 6379,然后启动主从,主从 ...

  4. JFinal redis cluster集群插件

    JFinal redis cluster集群插件 JFinal 框架到了2.1版本号,可是依旧仅仅支持redis的主从集群,没有看到Cluster集群的插件.笔者照着主从的插件方式,改了改,实现了个简 ...

  5. K8S部署Redis Cluster集群(三主三从模式) - 部署笔记

    一.Redis 介绍 Redis代表REmote DIctionary Server是一种开源的内存中数据存储,通常用作数据库,缓存或消息代理.它可以存储和操作高级数据类型,例如列表,地图,集合和排序 ...

  6. 输出redis cluster集群所有节点指定的参数的配置

    需要:实现类似redis-trib.rb call 命令的功能,输出redis cluster集群所有节点指定的参数的配置 redis-trib.rb的输出 [redis@lxd-vm3 ~]$ re ...

  7. Redis Cluster集群搭建与应用

    1.redis-cluster设计 Redis集群搭建的方式有多种,例如使用zookeeper,但从redis 3.0之后版本支持redis-cluster集群,redis-cluster采用无中心结 ...

  8. Redis cluster集群:原理及搭建

    Redis cluster集群:原理及搭建 2018年03月19日 16:00:55 阅读数:6120 1.为什么使用redis? redis是一种典型的no-sql 即非关系数据库 像python的 ...

  9. Redis Cluster集群搭建<原>

    一.环境配置 一台window 7上安装虚拟机,虚拟机中安装的是centos系统. 二.目标     Redis集群搭建的方式有多种,根据集群逻辑的位置,大致可以分为三大类:基于客户端分片的Redis ...

随机推荐

  1. IE各版本和Windows的关系

  2. C++11新特性 变参模板、完美转发(简述)

    变参模板 (Variadic Template) - 使得 emplace 可以接受任意参数,这样就可以适用于任意对象的构建 完美转发 - 使得接收下来的参数 能够原样的传递给对象的构造函数,这带来另 ...

  3. 精尽Spring MVC源码分析 - 文章导读

    该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...

  4. Oracle 要慌了!华为终于开源了自家的 Huawei JDK——毕昇 JDK!

    没错,自阿里.腾讯之后,华为也终于开源了自家的 JDK--毕昇 JDK! 免费!免费!免费!!! Oracle 要慌了? 毕昇 JDK 毕昇 JDK 是华为内部 OpenJDK 定制版 Huawei ...

  5. sonarqube代码质量检查简单使用说明

    本文翻译自sonarqube官网文档,原地址为:https://docs.sonarqube.org/latest/architecture/architecture-integration/ 一,架 ...

  6. 第一次软件工程与UML的编程作业

    博客班级 https://edu.cnblogs.com/campus/fzzcxy/2018SE1/ 作业要求 https://edu.cnblogs.com/campus/fzzcxy/2018S ...

  7. 牛客挑战赛46 B

    题目链接: 最小的指数 乍一看还以为是Pollard_rho算法,其实大可不必. 发现\(1<= n <= 1e18\),我们可以将n分为两部分(分块思想降低时间复杂度). 剔除小于等于\ ...

  8. ssh 免密码登陆设置不成功

    记一次centos6设置免密码登陆设置不成功的解决.自己挖的坑自己填. ssh 免密码登陆设置( 正常情况下是这样的,设置成功后登陆主机是不需要密码的) [root@master .ssh]# ssh ...

  9. 1-解决java Scanner出现 java.util.NoSuchElementException

    起因:在函数中新建scanner对象,然后多次调用此方法出现上述异常 原因:Scanner(system.in)在Scanner中接受的是键盘 输入,当调用close()方法时 Scanner的关闭会 ...

  10. 使用h5开发跨平台APP确保数据安全交互---服务器篇

    从eclipse到android studio的安卓开发经验告诉我原声开发才是硬道理,其实以前很抵触html5开发app的,虽然没有去了解过,但是冥冥中就觉得它运行速度太慢了,加载渲染根本比不上原生开 ...