一 Redis cluster 集群节点维护
集群运行时间长久之后,难免由于硬件故障、网络规划、 业务增长等原因对已有集群进行相应的调整, 比如增加 Redis node 节点、 减少节点、 节点迁移、更换服务器等。
增加节点和删除节点会涉及到已有的槽位重新分配及数据迁移
二 动态添加master节点
增加 Redis node 节点,需要与之前的 Redis node 版本相同、配置一致,然后分别启动两台 Redis node,因为一主一从。
案例:
因公司业务发展迅猛, 现有的三主三从 redis cluster 架构可能无法满足现有业务的并发写入需求,
因此公司紧急采购一台服务器 192.168.99.124,需要将其动态添加到集群当中其不能影响业务使用和数据丢失,注意添加前,新加的主机数据需要清空。添加过程如下:
1 编译安装脚本
#下载地址:http://106.53.11.101/sh/redis/
这是地址的响应内容
Index of /sh/redis/
…/
release/ 08-Sep-2019 10:15 -
redis_cluster.sh 10-Sep-2019 03:58 2145
redis_install.sh 10-Sep-2019 03:58 3520
bash redis_install.sh
2 配置文件
#配置文件(改这几项)
vim /apps/redis/etc/redis.conf
3 重启服务
#重启服务
#systemctl restart redis
.在编译安装有redis-trib.rb命令的主机上执行
a 要添加的新 redis 节点 IP 和端口 添加到的集群中的 master IP:端口, 加到集群之后默认是 master 节点但是没有 slots 数据,需要重新分配。
#Redis 4 添加方式:
redis-trib.rb add-node 192.168.99.124:6379 192.168.99.101:6379
b 前面是要添加节点的ip,后面是本主机ip
# Redis 5 添加方式:
redis-cli -a 123 --cluster \
add-node 192.168.99.124:6379 192.168.99.101:6379
验证当前状态:
#Redis 3/4
redis-trib.rb check 192.168.99.101:6379
#Redis 5
c 使用命令对新加的主机重新分配槽位; 添加主机之后需要对添加至集群种的新主机重新分片否则其没有分片
# Redis 3/4:
redis-trib.rb reshard 192.168.99.101:6379
#完成后再验证
redis-trib.rb check 192.168.99.101:6379
# Redis 5重新分片:
redis-cli -a 123456 --cluster reshard 192.168.7.104:6379
三、为 master 添加 slave 节点
1 slave节点:192.168.99.123
# Redis 4 添加方式:
redis-trib.rb add-node 192.168.99.123:6379 192.168.99.101:6379
# Redis 5 添加方式:
redis-cli -a 123 --cluster \
add-node 192.168.99.123:6379 192.168.99.101:6379
2 验证当前状态:
# Redis 3/4:
redis-trib.rb check 192.168.99.101:6379
# Redis 5:
redis-cli -a 123 --cluster check 192.168.99.101:6379
3 更改新节点更改状态为 slave
需要手动将其指定为某个 master 的 slave, 否则其默认角色为 master
(1)# redis-cli -h 192.168.99.123 -p 6379 -a 123
(2)192.168.99.123:6380> CLUSTER NODES
#CLUSTER NODES 查看当前集群节点,找到目标master的id
#CLUSTER REPLICATE 讲其设置位slave 命令格式为cluster repplicate MASTERID
(3)192.168.99.123:6380> CLUSTER REPLICATE 886338acd50c3015be68a760502b239f4509881c
4 验证当前集群状态
redis-trib.rb check 192.168.99.101:6379
四、删除master节点
#添加节点的时候是先添加 node 节点到集群,然后分配槽位,删除节点的操作与添加节点的操作正好相反, 是先将被删除的 Redis node 上的槽位迁移到集群中的其他 Redis node 节点上,然后再将其删除。
移除192.168.99.118:
# Redis 4
redis-trib.rb reshard 192.168.99.101:6379
如果迁移失败需要修复集群
redis-trib.rb fix 192.168.99.101:6379
# Redis 5
redis-cli -a 123456 --cluster reshard 192.168.7.102:6379
2 验证槽位迁移完成
# Redis 3/4:
redis-trib.rb check 192.168.99.101:6379
# Redis 5:
redis-cli -a 123 --cluster check 192.168.99.101:6379
3.从集群删除服务器
#命令格式
redis-cli -a 123456 --cluster del-node IP:Port ID
#Redis 3 /4
redis-trib.rb del-node 192.168.99.118:6379 \
#Redis 5
redis-cli -a 123456 --cluster del-node 192.168.99.118:6379 f4cfc5cf821c0d855016488d6fbfb62c03a14fda
4 验证 node 是否删除:
#Redis 3 /4
redis-trib.rb check 192.168.99.101:6379
#Redis 5
redis-cli -a 123 --cluster check 192.168.99.101:6379 f4cfc5cf821c0d855016488d6fbfb62c03a14fda
192.168.99.118 已经被删除,而192.168.99.120拥有2个slave
四、删除slave节点
1.从集群删除slave节点:192.168.99.119
#Redis 4:
redis-trib.rb del-node 192.168.99.119:6379 \
20a64105a16d9178fc8a8a319ddba7996cd51f7e
#20a64105a1…为192.168.99.119的id
#Redis 5
redis-cli -a 123456 --cluster del-node 192.168.99.118:6379 f4cfc5cf821c0d855016488d6fbfb62c03a14fda
2.验证 node 是否删除:
#Redis 3/4:
redis-trib.rb check 192.168.99.101:6379
#Redis 5:
redis-cli -a 123 --cluster check 192.168.99.101:6379
删除了192.168.99.119这个slave节点后,把192.168.99.101的从节点删除了,导致101节点没有从节点,而192.168.99.120上有2个slave,将其中一个slave转移到101上。
3.检查192.168.99.120上有哪些slave
redis-cli -h 192.168.99.120 -a 123 info Replication
4.把192.168.99.121转移到192.168.99.101上。查询拿到192.168.99.101的id
redis-cli -h 192.168.99.121 -p 6379 -a 123 CLUSTER NODES
5 转移
redis-cli -h 192.168.99.121 -p 6379 -a 123 \
CLUSTER REPLICATE 31073a489d0176ba305428568fbb54cad1b5a538
6 验证集群 Master 与 Slave 对应关系
#Redis Slave 节点一定不能跟 master 在一个物理服务器,必须为跨主机交叉备份模式,避免主机故障后主备全部挂掉, 如果出现 Redis Slave 与 Redis master 在同一台 Redis node 的情况, 则需要安装以上步骤重新进行 slave 分配,直到不相互交叉备份为止。
redis-trib check 192.168.99.101:6379
五、导入现有 Redis 数据
导入数据需要 redis cluster 不能与被导入的数据有重复的 key 名称, 否则导入不成功或中断。
案例:
公司将 redis cluster 部署完成之后,需要将之前的数据导入之 Redis cluster 集群, 但是由于 Redis cluster 使用的分片保存 key 的机制,因此使用传统的 AOF 文件或 RDB 快照无法满足需求,因此需要使用集群数据导入命令完成。
1.基础环境准备:
导入数据之前需要关闭各 redis 服务器的密码, 包括集群中的各 node 和源 Redis server, 避免认证带来的环境不一致从而无法导入, 可以加参数–cluster-replace 强制替换 Redis cluster 已有的 key
redis-cli -h 192.168.99.101 -p 6379 -a 123 CONFIG SET requirepass ""
redis-cli -h 192.168.99.118 -p 6379 -a 123 CONFIG SET requirepass ""
redis-cli -h 192.168.99.119 -p 6379 -a 123 CONFIG SET requirepass ""
redis-cli -h 192.168.99.120 -p 6379 -a 123 CONFIG SET requirepass ""
redis-cli -h 192.168.99.121 -p 6379 -a 123 CONFIG SET requirepass ""
redis-cli -h 192.168.99.122 -p 6379 -a 123 CONFIG SET requirepass ""
2.执行数据导入
#Redis 3/4:
redis-trib.rb import --from 192.168.99.101:6382 --replace 172.18.200.107:6379
#Redis 5
#redis-cli --cluster import 集群服务器 IP:PORT --cluster-from \
#外部Redis node-IP:PORT --cluster-copy --cluster-replace
redis-cli --cluster import 192.168.7.103:6379 --cluster-from \
192.168.7.101:6379 --cluster-copy