文章目录

  • 前言
  • 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 横向扩展 redis扩容时数据如何迁移_redis


现在,新的节点已经添加完成

这就和其他的节点一模一样啦,

完成后还可以使用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 横向扩展 redis扩容时数据如何迁移_单节点_02

忘记节点(下线)

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

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扩容时数据如何迁移_redis_03

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 及 以上,