文章目录
- 前言
- redis节点扩容
- 在redis1,上准备新节点
- 启动新节点
- 配置使新节点加入群集
- 在其他的master上分配槽
- redis节点收缩
- 忘记节点(下线)
- 移除后验证是否成功
- redis 数据导入导出(迁移)
- 需求背景
- 准备一个新节点,不加入集群,模拟集群前的数据
- redis-migrate-tool安装
- 创建配置文件
- 生成测试数据
- 执行导入命令
- 数据校验,抽样检查
前言
这一篇是承接上一篇博客的,是在redis自动构建完成以后的操作
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个槽全部分配完了,所以新的节点需要从他们那里要一些过来
redis-5.0.x 版本:
[root@redis1 ~]# redis-cli --cluster reshard 192.168.10.3:6380
How many slots do you want to move (from 1 to 16384)? 2048 ##打印出进群每个节点信息后,reshard命令需要确认迁移的槽数量,这里我们输入2048个
What is the receiving node ID? 6390的ID号 #输入6390的节点ID作为目标节点,也就是要扩容的节点,目标节点只能指定一个
Source node #1:all #之后输入源节点的ID,这里分别输入每个主节点的6380的ID最后输入done,或者直接输入all
####################################################################################
redis-3.2.x版本:
[root@redis1 ~]# cd /opt/redis_cluster/redis/src/
[root@redis1 src]# ./redis-trib.rb reshard 192.168.10.3:6380
How many slots do you want to move (from 1 to 16384)? 2048
What is the receiving node ID? 6390的ID号
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个槽
如下:
redis-5.0.x版本:
[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-3.2.x版本:
[root@redis1 ~]# cd /opt/redis_cluster/redis/src/
[root@redis1 src]# ./redis-trib.rb rebalance 192.168.10.3:6380
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
来平衡群集
命令格式如下:
redis-5.0.x版本:
[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-3.2.x版本:
[root@redis1 ~]# cd /opt/redis_cluster/redis/src/
[root@redis1 src]# ./redis-trib.rb rebalance 192.168.10.3:6380
忘记节点(下线)
由于我们的集群是做了高可用的,所以当主节点下线的时候从节点也会顶上,所以最好我们先下线从节点
,然后再下线主节点
命令:
redis-5.0.x版本:
redis-cli --cluster del-node 192.168.10.3:6391 ID
redis-cli --cluster del-node 192.168.10.3:6390 ID
#############################################################################
redis-3.2.x版本:
cd /opt/redis_cluster/redis/src/
./redis-trib.rb del-node 192.168.10.3:6391 ID
./redis-trib.rb 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-migrate-tool工具只不支持
4.x及以上的版本(所以我 前面的使用的5.0.6,肯定不行了),所以以下所见内容是我本人重新用redis-3.2.9做了一遍,划重点就是下面只是版本发生了变化,其他都一样,知道是在redis-3.2.x做的就好。
需求背景
举例如:公司之前没有做集群,但是已经把数据存到了redis单节点里或要和其他集群的 业务合并,现在,集群搭好了,肯定会面临数据导入的问题,所以这里推荐使用redis-migrate-tool工具
来导入单节点数据到集群里或别的集群迁移到本地现在的集群;
redis-migrate-tool 是维品会开源的一款redis数据迁移工具,基于redis复制,快速,稳定,划重点 实时迁移
迁移过程中,源集群不影响对外提供服务
下载地址:https://github.com/vipshop/redis-migrate-tool
准备一个新节点,不加入集群,模拟集群前的数据
上面有192.168.10.3:6390
现成的,我们就不新建一个单节点了;
怎么创建,上边都有;
ok,现在,修改它的配置文件,把集群项
去掉,使其成为真正的单节点
[root@redis1 ~]# cat /opt/redis_cluster/redis_6390/conf/redis_6390.conf
bind 192.168.10.3
port 6390
daemonize yes
pidfile "/opt/redis_cluster/redis_6390/pid/redis_6390.pid"
logfile "/opt/redis_cluster/redis_6390/logs/redis_6390.log"
dbfilename "redis_6390.rdb"
dir "/data/redis_cluster/redis_6390/"
开启服务,确保192.168.10.3:6390是单节点
[root@redis1 ~]# sh redis_shell.sh start 6390
root 6354 1 0 07:57 ? 00:00:13 redis-server 192.168.10.3:6380 [cluster]
root 6367 1 0 07:57 ? 00:00:08 redis-server 192.168.10.3:6381 [cluster]
root 49109 2701 0 10:22 pts/0 00:00:00 sh redis_shell.sh start 6390
root 49117 1 0 10:22 ? 00:00:00 redis-server 192.168.10.3:6390
root 49119 49109 0 10:22 pts/0 00:00:00 grep redis
[root@redis1 ~]#
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:6390
[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 6390 set k$i v$i
done
执行导入命令
[root@redis1 ~]# redis-migrate-tool -c rmt.conf -o log -d
部分指令解析:
-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
如果想检查更多key,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
🆗,现在去集群里面看看有没有k1000
[root@redis1 ~]# sh redis_shell.sh login 6380
192.168.10.3:6380>
192.168.10.3:6380>
192.168.10.3:6380> get k1000
-> Redirected to slot [6429] located at 192.168.10.4:6380
"v1000"
192.168.10.4:6380>
现在,redis没加入集群的单数据已经导入成功!
再次强调,一定注意:
redis-migrate-tool目前不支持redis 4.x 及 以上,