redis在线迁移

redis迁移 参考文档:https://github.com/alibaba/RedisShake

实战:redis4.X集群版本迁移redis5.x集群

1.下载阿里云数据同步&迁移工具

wget -c https://github.com/alibaba/RedisShake/releases/download/release-v2.0.3-20200724/redis-shake-2.0.3.tar.gz
tar -xvf redis-shake.tar.gz

2.修改redis-shake.conf配置文件,sync模式涉及的主要参数说明如下。

参数 说明 示例
source.type 源Codis/Redis的类型。 cluster
source.address 源Codis/Redis集群的连接地址与服务端口。说明 由于执行迁移将占用一定的资源,为避免对源集群的业务产生影响,您可以填写各从节点的连接地址和服务端口。(只要主或者从的其中一个即可) 10.xx.xx.1:7000;10.xx.xx.1:7002;10.xx.xx.1:7003;10.xx.xx.1:7004 #我只写了主节点,按照实际情况写,master@10.xx.xx.1:7000 # 将会自动探测到10.xx.xx.1:7000集群下的所有节点,并从所有master进行拉取。同理如果是slave@10.xx.xx.1:7000将会扫描集群下的所有slave节点。
source.password_raw 源Codis/Redis集群的连接密码。 SourcePass233
target.type 目的Redis的类型。 cluster
target.address 目的Redis的连接地址与服务端口 只能是master或者不配置 10.xx.xx.1:7000;10.xx.xx.1:7002;10.xx.xx.1:7003;10.xx.xx.1:7004 #我只写了主节点,按照实际情况写,@10.xx.xx.1:700 # 将会自动探测到10.xx.xx.1:700集群下的所有节点,并写入所有master
target.password_raw 目的Redis的连接密码,此处为云数据库Redis版实例的密码。 TargetPass233
rewrite 如果目的Redis有与RDB文件中相同的key,是否覆盖,可选值:true(覆盖);false(不覆盖)。说明 默认为true,建议对目的Redis中的有效数据进行完善的备份再执行迁移。如设置为false且存在数据冲突则会出现异常提示。 true #此处我默认none
target.db 设置待迁移的数据在目的Redis中的逻辑数据库名。例如,要将所有数据迁移到目的Redis中的DB10,则需将此参数的值设置为10。当该值设置为-1时,逻辑数据库名在源Redis和目的Redis中的名称相同,即源Redis中的DB0将被迁移至目的Redis中的DB0,DB1将被迁移至DB1,以此类推。 -1
parallel RDB文件同步中使用的并发线程数,用于提高同步性能。说明最小值为1。最大值取决于服务器性能。推荐值为64。 32

3.使用如下命令进行迁移

./redis-shake.linux -conf=redis-shake.conf -type=sync

4.查看同步日志确认同步状态,当出现sync rdb done时,全量同步已经完成,同步进入增量阶段

Codis/Redis集群版每个节点同步完成都会生成sync rdb done日志信息

5.当所有节点同步完成之后,若+forwardCommands=0,则此时源端没有新的数据写入,同步链路中没有增量数据正在传输,您可以以此为依据选择适当的时机将业务对接到新Redis版。

redisredis-full-check数据校验工具

如果Redis迁移的过程出现异常,源端与目的端Redis的数据将会不一致。使用redis-full-check进行校验能够找出异常数据,为数据对齐提供可靠依据。

redis-full-check是阿里云自研的Redis数据校验工具,能够提取源端和目的端的数据进行多轮差异化比较,并将比较结果记录在一个SQLite3数据库中,从而达到全量数据校验的目的

1.在git中下载并解压

https://github.com/alibaba/RedisFullCheck/releases

tar -xvf redis-full-check.tar.gz

2.执行如下命令进行数据校验:

./redis-full-check -s "10.249.0.78:7001;10.249.0.16:7003;10.249.0.83:7005" -p YH2020s2b -t "10.249.0.33:7001;10.249.0.62:7002;10.249.0.62:7003" -a YH2020s2b --comparemode=1 --comparetimes=1 --qps=10 --batchcount=100 --sourcedbtype=1 --targetdbtype=1

3.表 1. redis-full-check常用选项说明

选项 说明 示例值
-s 源端Redis的连接地址和端口。
说明
如果源Redis为集群版,每个集群地址间需要以半角分号(;)分割不同的连接地址。
集群地址前后需要添加半角双引号(")
"10.249.0.78:7001;10.249.0.16:7003;10.249.0.83:7005"
-p 源端Redis的密码。 SourcePwd233
-t 目的端Redis的连接地址和端口。
说明
如果目的Redis为集群版,每个集群地址间需要以半角分号(;)分割不同的连接地址。
集群地址前后需要添加半角双引号(")。
"10.249.0.33:7001;10.249.0.62:7002;10.249.0.62:7003"
-a 目的端Redis的密码。 TargetPwd233
--sourcedbtype 源库的类别:
0:单节点版、主从版
1:集群版
2:阿里云/腾讯云
--sourcedbtype=1
--sourcedbfilterlist 源端Redis指定需要校验的DB。
说明
开源集群版Redis无需填写该选项。
非开源集群版Redis不指定该选项表示校验所有DB。
多个DB之间使用半角分号(;)连接。
--sourcedbfilterlist=0;1;2
--targetdbtype 目的库的类别:
0:单节点版、主从版
1:集群版
2:阿里云/腾讯云
--targetdbtype=0
--targetdbfilterlist 目的端Redis指定需要校验的DB。
说明
开源集群版Redis无需填写该选项。
非开源集群版Redis不指定该选项表示校验所有DB。
多个DB之间使用半角分号(;)连接。
--targetdbfilterlist=0;1;2
-d 异常数据列表保存的文件名称,默认为result.db。 xxx.db
--comparetimes 校验次数。
该选项不填则默认为3次。
最小值为1。
无最大值,建议不超过5次。
--comparetimes=1
-m 校验模式。
1:全量校验
2:仅校验value的长度
3:仅校验key是否存在
4:全量对比的情况下,忽略大key的比较
1
--qps 限速阈值。
说明
最小值为1。
最大值取决于服务器性能。
--qps=10
--filterlist 需要比较的key列表,以竖线分割。
说明
abc*:表示匹配所有abc开头的key。
abc:表示仅匹配abc这个key。
这个可选项 我没写

4.说明 执行完成后命令行输出校对结论,下方示例表示有2个不一致的key。如果此处为0,则两端数据一致。

all finish successfully, totally 2 keys or fields conflict 

5.查看保存异常key的SQLite3数据库

执行sqlite3 result.db.3    #说明 异常数据列表默认保存在result.db.3中

6.查看异常数据列表

执行SELECT * FROM key;

说明 SQL3数据库中保存了表key和表field:

表key中保存的是不一致的key;

表field中保存的是hash、set、zset、list类型数据中不一致数据的详情。

posted @ 2021-02-08 11:10  記憶や空白  阅读(273)  评论(0编辑  收藏  举报