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 ...
随机推荐
- webpack与vue使用
项目基本结构目录: index.html <!DOCTYPE html> <html lang="en"> <head> <meta ch ...
- 手机版LED弹幕显示屏
这是一款可以自制超大滚动字幕的LED显示屏APP.可以随你喜欢, 演唱会,电竞比赛,晚会,接机,寻人! 随时随地输入文字, 传达讯息,酒吧夜店疯狂打Call工具!蹦迪必备!超帅!下载地址:https: ...
- 容器编排系统之Pod资源配置清单基础
前文我们了解了k8s上的集群管理工具kubectl的基础操作以及相关资源的管理,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/14130540.html:今天我 ...
- Linux修改系统时间为东八区北京时间(上海时间)
1. Linux时间 Linux的时间分为 System Clock(系统时间)和 Real Time Clock(硬件时间,简称RTC). 系统时间:指系统内核中的时间. 硬件时间:指主 ...
- 3分钟快速搞懂Java的桥接方法
什么是桥接方法? Java中的桥接方法(Bridge Method)是一种为了实现某些Java语言特性而由编译器自动生成的方法. 我们可以通过Method类的isBridge方法来判断一个方法是否是桥 ...
- 面试 11-02.ES6
11-02.ES6 #Class和普通构造函数有何区别 我们经常会用ES6中的Class来代替JS中的构造函数做开发. Class 在语法上更加贴合面向对象的写法 Class 实现继承更加易读.易理解 ...
- Docker被替代 PodMan成为程序员新宠
- CentOS7部署GeoServer
CentOS7部署GeoServer 一.安装JDK81.下载jdk1.8 wget http://download.oracle.com/otn-pub/java/jdk/8u181-b13/96a ...
- Asp.Net Core使用MongoDB
MongoDB 是一个基于分布式且面向文档存储的开源 NoSql数据库系统 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的.它支持的数据结构 ...
- 记一次Ajax请求MVC调优
问题描述 ASP.NETMVC项目,编辑页面赋值操作,ajax请求很慢. 对同一个控制器有2个请求 一个为获取该表的树形结构数据(绑定下拉框) 一个为获取某实体的单条记录(编辑操作) 排查过程 数据库 ...