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类型数据中不一致数据的详情。