在Redis迁移完成后进行数据校验可以检查数据的一致性。

前提条件

  • 已完成Redis迁移。
    说明 云数据库Redis版相关迁移方法请参见迁移方案概览
  • 迁移源端和目的端Redis实例需为主从版、单节点版、开源集群版以及部分云上带proxy的集群版(阿里云、腾讯云)。
  • 已创建用于运行redis-full-check的ECS实例,且ECS实例的系统为Linux,创建方法请参见创建ECS实例
  • ECS实例可以访问迁移源端和目的端Redis实例。
    说明
    • 如果ECS实例与Redis实例在同一可用区的VPC中,可以在Redis白名单中添加ECS内网IP,添加白名单请参见设置IP白名单
    • 如果ECS实例与Redis实例不在同一可用区的VPC中,可以通过外网地址访问,详情请参见外网连接

redis-full-check简介

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

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

说明 如需了解更多redis-full-check相关信息,请参见redis-full-check Github主页

操作步骤

  1. 登录可以连接云数据库Redis版实例(目的端Redis)的ECS,相关操作请参见连接ECS实例
  2. 在ECS中下载redis-full-check
    说明 建议您下载最新发布的版本。
  3. 解压redis-full-check.tar.gz
    tar -xvf redis-full-check.tar.gz
  4. 执行如下命令进行数据校验:
    ./redis-full-check -s "<Redis集群地址1连接地址:Redis集群地址1端口号;Redis集群地址2连接地址:Redis集群地址2端口号;Redis集群地址3连接地址:Redis集群地址3端口号>" -p <Redis集群密码> -t <Redis连接地址:Redis端口号> -a <Redis密码> --comparemode=1 --comparetimes=1 --qps=10 --batchcount=100 --sourcedbtype=1 --targetdbfilterlist=0

    常用选项说明请见下表,如需了解更多选项及说明,请参见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的密码。 SourcePwd233
    -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的密码。 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。
    --filterlist=abc*|efg|m*
    说明 执行完成后命令行输出校对结论,下方示例表示有2个不一致的key。如果此处为0,则两端数据一致。
    all finish successfully, totally 2 keys or fields conflict
  5. 查看保存异常key的SQLite3数据库。
    1. 执行sqlite3 result.db.3
      说明 异常数据列表默认保存在result.db.3中。
    2. 执行SELECT * FROM key;
      图 1. 查看异常数据列表


      说明 SQL3数据库中保存了表key和表field:
      • 表key中保存的是不一致的key;
      • 表field中保存的是hash、set、zset、list类型数据中不一致数据的详情。