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. OGG报错:Cannot load ICU resource bundle 'ggMessage', error code 2 - No such file or directory

    [oracle@dgdb1 ~]$ ggsci Oracle GoldenGate Command Interpreter for OracleVersion 11.2.1.0.3 14400833 ...

  2. 设置RAC DB归档

    1.关闭集群数据库 srvctl stop database -d RAC 2.将节点一设置为归档模式 sqlplus / as sysdba startup mount alter database ...

  3. ubuntu ImportError: No module named setuptools 一句命令解决方案

    https://blog.csdn.net/Super_jm_/article/details/81947563 使用pip安装文件时候提示  ImportError: No module named ...

  4. JavaSE02-基本语法

    1.注释 注释是对代码的解释和说明文字,可以提高程序的可读性,因此在程序中添加必要的注释文字十分重要. Java中的注释分为三种: 单行注释.单行注释的格式是使用//,从//开始至本行结尾的文字将作为 ...

  5. Elastic Search 学习之路(二)——inverted index(反向索引)

    这是篇翻译文,图画的挺有意思. Elastic使用非常特殊的数据结构,称作反向索引.反向索引中,包括了一组document中出现的唯一的单词,和对应的单词,所出现的位置.反向索引是在ES中,docum ...

  6. 2020-2021-1 20209307 《Linux内核原理与分析》第九周作业

    这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)> 这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第九周作业> 这个作业的目标 & ...

  7. DRF类视图让你的代码DRY起来

    刚开始写views.py模块的代码,一般都是用def定义的函数视图,不过DRF更推荐使用class定义的类视图,这能让我们的代码更符合DRY(Don't Repeat Yourself)设计原则: 使 ...

  8. sqli-labs Less24 登录出现报错Cannot send session cache limiter....

    问题描述 这是一道二次注入题,注册完成后,应该登录然后修改密码,但是登录的时候出现: Warning: session_start(): Cannot send session cache limit ...

  9. 浅析Linux 64位系统虚拟地址和物理地址的映射及验证方法

    虚拟内存 先简单介绍一下操作系统中为什么会有虚拟地址和物理地址的区别.因为Linux中有进程的概念,那么每个进程都有自己的独立的地址空间. 现在的操作系统都是64bit的,也就是说如果在用户态的进程中 ...

  10. 对着爬虫网页HTML学习Python正则表达式re

    1.正则表达式初探 用比较经典的例子,查找一段文本中的手机号码.比如对于文本"我现在用的电话是188-8888-8888,之前那个186-6666-6666已经不用了",我们想获取 ...