Redis集群扩容与收缩和群集数据迁移

前言

这一篇是承接上一篇博客的,是在redis自动构建完成以后的操作
可参考:https://blog.csdn.net/weixin_43815140/article/details/106163920

redis节点扩容

redis节点扩容步骤类似于我们前面的手动搭建redis高可用集群,不同的是我们得手动去给新节点划分槽;

Redis集群的扩容操作可分为以下几个步骤:

  • 准备新节点
  • 加入集群
  • 迁移槽和数据

在redis1,上准备新节点

[root@redis1 ~]# mkdir -p /opt/redis_cluster/redis_{6390,6391}/{conf,logs,pid}
[root@redis1 ~]# mkdir -p /data/redis_cluster/redis_{6390,6391}
[root@redis1 ~]# cd /opt/redis_cluster/
[root@redis1 redis_cluster]# ls
redis  redis-5.0.6  redis_6380  redis_6381  redis_6390  redis_6391
[root@redis1 redis_cluster]# cp redis_6380/conf/redis_6380.conf ./redis_6390/conf/redis_6390.conf
[root@redis1 redis_cluster]# cp redis_6380/conf/redis_6380.conf ./redis_6391/conf/redis_6391.conf
[root@redis1 redis_cluster]# sed -i 's#6380#6390#g' redis_6390/conf/redis_6390.conf
[root@redis1 redis_cluster]# sed -i 's#6380#6391#g' redis_6391/conf/redis_6391.conf
[root@redis1 redis_cluster]# 

启动新节点

[root@redis1 redis_cluster]# cd
[root@redis1 ~]# 
[root@redis1 ~]# sh redis_shell.sh start 6390
root      50096      1  0 19:35 ?        00:00:06 redis-server 192.168.10.3:6380 [cluster]
root      50110      1  0 19:35 ?        00:00:06 redis-server 192.168.10.3:6381 [cluster]
root      51038   2640  0 21:03 pts/0    00:00:00 sh redis_shell.sh start 6390
root      51046      1  0 21:03 ?        00:00:00 redis-server 192.168.10.3:6390 [cluster]
root      51048  51038  0 21:03 pts/0    00:00:00 grep redis
[root@redis1 ~]# sh redis_shell.sh start 6391
root      50096      1  0 19:35 ?        00:00:06 redis-server 192.168.10.3:6380 [cluster]
root      50110      1  0 19:35 ?        00:00:06 redis-server 192.168.10.3:6381 [cluster]
root      51046      1  0 21:03 ?        00:00:00 redis-server 192.168.10.3:6390 [cluster]
root      51052   2640  0 21:03 pts/0    00:00:00 sh redis_shell.sh start 6391
root      51060      1  0 21:03 ?        00:00:00 redis-server /opt/redis_cluster/redis_6391/conf/redis_6391.conf
root      51062  51052  0 21:03 pts/0    00:00:00 grep redis
[root@redis1 ~]# 

配置使新节点加入群集

[root@redis1 ~]# redis-cli -c -h 192.168.10.3 -p 6380 cluster meet 192.168.10.3 6390 
OK
[root@redis1 ~]# redis-cli -c -h 192.168.10.3 -p 6380 cluster meet 192.168.10.3 6391
OK
[root@redis1 ~]# 

还没有完,看了上一篇的也知道,这是他俩都是master且还没有槽存储数据

在其他的master上分配槽

因为前三个master已经把16384个槽全部分配完了,所以新的节点需要从他们那里要一些过来

[root@redis1 ~]# redis-cli --cluster reshard 192.168.10.3 6380
#打印出进群每个节点信息后,reshard命令需要确认迁移的槽数量,这里我们输入2048个:
How many slots do you want to move (from 1 to 16384)? 2048
#输入6390的节点ID作为目标节点,也就是要扩容的节点,目标节点只能指定一个
What is the receiving node ID? 6390的ID号
#之后输入源节点的ID,这里分别输入每个主节点的6380的ID最后输入done,或者直接输入all
Source node #1:all

分配完后,6390和6391都是master,且6391master没有分配槽,所以,需要把6391做成从节点,这里只是测试,再次强调,在线上一定不要把master和slave放在一台主机,要交叉分布,我这里是没有办法了,就只有6390可分配

[root@redis1 ~]# redis-cli -h 192.168.10.3 -p 6391 cluster replicate 093beec91d9568e56e840b32a3537c6ba2d8d24f
OK
[root@redis1 ~]# 

在这里插入图片描述
现在,新的节点已经添加完成
这就和其他的节点一模一样啦,
完成后还可以使用redis-cli --cluster rebalance 192.168.10.3:6380来完成重新平衡集群状态,使每个节点分到的槽数一样多,这样你之前划分给了6390多少,都会中和掉,所以原来给的2048明显低于平均数,16384/4=4096 4096-2048=2048 2048/3=682
所以,其他的3个master还得每个master在分出682个槽
如下:

[root@redis1 ~]# redis-cli --cluster rebalance 192.168.10.3:6380
>>> Performing Cluster Check (using node 192.168.10.3:6380)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Rebalancing across 4 nodes. Total weight = 4.00
Moving 682 slots from 192.168.10.8:6380 to 192.168.10.3:6390
####################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################
Moving 683 slots from 192.168.10.4:6380 to 192.168.10.3:6390
####################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################
Moving 683 slots from 192.168.10.3:6380 to 192.168.10.3:6390
####################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################
[root@redis1 ~]# 

redis节点收缩

流程说明:
1).首先需要确定下线节点是否有负责的槽,
如果是,需要把槽迁移到其他节点,保证节点下线后整个集群槽节点映射的完整性.
2).当下线节点不再负责槽或者本身是从节点时,
就可以通知集群内其他节点忘记该下线节点,当所有的节点忘记该节点后可以正常关闭.

具体操作:
这里我们准备将刚才新添加的节点下线,也就是6390和6391
收缩和扩容迁移的方向相反,6390变为源节点,其他节点变为目标节点,源节点把自己负责的4096个槽均匀的迁移到其他节点上,因为redis-cli命令只能有一个目标节点,因此需要执行3次reshard命令,分别迁移1365,1365,1366个槽给其他3个master;
也可以把4096个槽全部给某一个,再把6390,6391移除群集
使用redis-cli --cluster rebalance 192.168.10.3:6380 来平衡群集
命令格式如下:

[root@redis1 ~]# redis-cli --cluster reshard 192.168.10.3:6380  
How many slots do you want to move (from 1 to 16384)? 1365  #分配多少个槽
输入6380的id                    #分配给谁(目标节点)
输入6390的id                    #从哪里分配(源节点)
done                           #只有一个源节点,回车后done完成

在这里插入图片描述

忘记节点(下线)

由于我们的集群是做了高可用的,所以当主节点下线的时候从节点也会顶上,所以最好我们先下线从节点,然后再下线主节点
命令:

redis-cli --cluster del-node 192.168.10.3:6391 ID
redis-cli --cluster del-node 192.168.10.3:6390 ID
[root@redis1 ~]# redis-cli --cluster del-node 192.168.10.3:6391 16be087fd0a4312d5631f9aafd02058057082a6a
>>> Removing node 16be087fd0a4312d5631f9aafd02058057082a6a from cluster 192.168.10.3:6391
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.
[root@redis1 ~]# redis-cli --cluster del-node 192.168.10.3:6390 093beec91d9568e56e840b32a3537c6ba2d8d24f
>>> Removing node 093beec91d9568e56e840b32a3537c6ba2d8d24f from cluster 192.168.10.3:6390
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.
[root@redis1 ~]# 

移除后验证是否成功

在这里插入图片描述

redis 数据导入导出(迁移)

需求背景

刚切换到redis集群的时候肯定会面临数据导入的问题,所以这里推荐使用redis-migrate-tool工具来导入单节点数据到集群里或别的集群迁移到本地现在的集群;

redis-migrate-tool 是维品会开源的一款redis数据迁移工具,基于redis复制,快速,稳定,划重点 实时迁移 迁移过程中,源集群不影响对外提供服务
下载地址:https://github.com/vipshop/redis-migrate-tool

redis-migrate-tool安装

无意间发现有一篇redis-migrate-tool的详解
redis-migrate-tool

#安装依赖
yum -y install automake libtool autoconf bzip2 git 
#构建安装
cd /opt/redis_cluster/
git clone https://github.com/vipshop/redis-migrate-tool.git
cd redis-migrate-tool/
autoreconf -fvi
./configure
make && make install 

创建配置文件

[root@redis1 ~]# cat /opt/redis_cluster/redis-migrate-tool/rmt.conf
[source]
type: single
servers:
- 192.168.10.3:6379
 
[target]
type: redis cluster
servers:
- 192.168.10.3:6380 
 
[common]
listen: 0.0.0.0:8888
source_safe: true

生成测试数据

#!/bin/bash
for i in {1..1000}
do
	redis-cli -c -h 192.168.10.3 -p 6379 set k$i v$i
done

执行导入命令

[root@redis1 ~]# redis-migrate-tool -c rmt.conf

部分指令解析:

-h, --help:帮助
-V, --version:显示版本
-d, --daemonize:后台进程运行
-I, --information:打印一些有用的信息,包括可以解析的指令(126个),不支持的指令(14个)等等
-v, --verbosity=N:设置日志等级。(默认: 5, 最低: 0, 最高: 11)
-o, --output=S:设置输出的日志文件
-c, --conf-file=S:设置配置文件。(默认: rmt.conf)
-C, --command=S:设置运行的指令(默认: redis_migrate ,迁移)。redis_check 比较源和目的,默认1000个样本key。redis_testinsert测试插入Keys,默认所有类型总共1000个。
-T, --thread=N:设置多少个线程用来运行工具。(默认: 4)

数据校验,抽样检查

[root@redis1 ~]# redis-migrate-tool -c rmt.conf -C redis_check

如果想查更多,redis_check 后自己定义

redis-migrate-tool -c rmt.conf -C "redis_check 200000"

[root@redis1 ~]# redis-migrate-tool -c rmt.conf -C redis_check
Check job is running...

Checked keys: 1000
Inconsistent value keys: 0
Inconsistent expire keys : 0
Other check error keys: 0
Checked OK keys: 1000

All keys checked OK!
Check job finished, used 1.041s

注意:
redis-migrate-tool目前不支持redis 4.x 及 以上,
因此实验最好使用redis 3.2.3版本。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章