在云数据库 Tair(兼容 Redis)迁移完成后,您可以通过redis-full-check工具检查数据的一致性。
前提条件
-
已完成数据迁移。
-
已创建ECS实例,且ECS实例的系统为Linux,创建方法请参见创建ECS实例。
-
ECS实例可以访问迁移源端和目的端Redis实例。
说明-
如果ECS实例与Redis实例在同一可用区的VPC中,可以在Redis白名单中添加ECS内网IP,添加白名单请参见设置IP白名单。
-
如果ECS实例与Redis实例不在同一可用区的VPC中,可以通过外网地址访问,详情请参见使用公网地址连接实例。
-
使用场景
如果数据迁移的过程出现异常,源端与目的端数据将会不一致。使用redis-full-check进行校验能够找出异常数据,为数据对齐提供可靠依据。
redis-full-check是阿里云自研的Redis数据校验工具,能够提取源端和目的端的数据进行多轮差异化比较,并将比较结果记录在一个SQLite3数据库中,从而达到全量数据校验的目的。
如需了解更多redis-full-check相关信息,请参见redis-full-check Github主页。
操作步骤
-
登录可以访问云数据库 Tair(兼容 Redis)的ECS实例,相关操作请参见连接ECS实例。
-
在ECS中下载redis-full-check。
说明建议您下载最新发布的版本。
-
解压redis-full-check.tar.gz。
tar -xvf redis-full-check.tar.gz -
执行如下命令进行数据校验:
./redis-full-check -s "<Redis集群地址1连接地址:Redis集群地址1端口号;Redis集群地址2连接地址:Redis集群地址2端口号;Redis集群地址3连接地址:Redis集群地址3端口号>" -p <Redis集群密码> -t <Redis连接地址:Redis端口号> -a <Redis密码> --m=1 --sourcedbfilterlist=0;2 --targetdbfilterlist=0;2命令示例如下:
./redis-full-check -s "10.xx.xx.1:6379" -p SourcePwd233 -t "r-bp1zc********.redis.rds.aliyuncs.com:6379" -a testaccount:Test1234 --m=1 --sourcedbfilterlist=0;2 --targetdbfilterlist=0;2常用选项说明请见下表,如需了解更多选项及说明,请参见RedisFullCheck 配置说明。
表 1. redis-full-check常用选项说明
选项
说明
示例值
-s
源端Redis的连接地址和端口。
说明-
如果源Redis为集群版,每个集群地址间需要以半角分号(;)分割不同的连接地址。
-
集群地址前后需要添加半角双引号(")。
-
该选项必填。
r-bp1xxxxxxxxxxxxx.redis.rds.aliyuncs.com:6379"10.xx.xx.1:7000;10.xx.xx.1:7001;10.xx.xx.2:7002;10.xx.xx.2:7003"-p
源端Redis的账号、密码,格式为
<username>:<password>,例如testaccount:Test1234。若未设置用户名,可仅输入密码,若未设置密码也可以不填。SourcePwd233或testaccount:Test1234-t
目的端Redis的连接地址和端口。
说明-
如果目的Redis为集群版,每个集群地址间需要以半角分号(;)分割不同的连接地址。
-
集群地址前后需要添加半角双引号(")。
-
该选项必填。
r-bp1xxxxxxxxxxxxx.redis.rds.aliyuncs.com:6379"10.xx.xx.1:7000;10.xx.xx.1:7001;10.xx.xx.2:7002;10.xx.xx.2:7003"-a
目的端Redis的账号、密码,格式为
<username>:<password>,例如testaccount:Test1234。若未使用用户名,可仅输入密码,若未设置密码也可以不填。TargetPwd233或testaccount:Test1234--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的比较。
-m=1
--qps
限速阈值,默认为15000。
说明-
最小值为1。
-
最大值取决于服务器性能。
--qps=10
--filterlist
需要比较的key列表,以竖线(|)分割。
说明-
abc*:表示匹配所有abc开头的key。
-
abc:表示仅匹配abc这个key。
--filterlist=abc*|efg|m*
说明执行完成后命令行输出校对结论,下方示例表示有2个不一致的key。如果此处为0,则两端数据一致。
all finish successfully, totally 2 keys or fields conflict -
-
查看保存异常key的SQLite3数据库。
-
执行
sqlite3 result.db.3。说明异常数据列表默认保存在result.db.3中。
-
执行
SELECT * FROM key;。图 1. 查看异常数据列表
[root@redis-server RedisFullCheck]# sqlite3 result.db.3 SQLite version 3.7.17 2013-05-20 00:56:22 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> SELECT * FROM key; 1|differentkey1|string|lack_target|0|10|0 2|differentkey2|list|lack_target|0|4|0 sqlite>说明SQL3数据库中保存了表key和表field:
-
表key中保存的是不一致的key。
-
表field中保存的是hash、set、zset、list类型数据中不一致数据的详情。
-
-