redis-full-check的使用背景 在经历了之前的文章内容章节内容,已完成Redis迁移后,可能会存在以下问题需要进行数据迁移之后的对比。例如,如果Redis迁移的过程出现异常,源端与目的端
redis-full-check的使用背景在经历了之前的文章内容章节内容,已完成Redis迁移后,可能会存在以下问题需要进行数据迁移之后的对比。例如,如果Redis迁移的过程出现异常,源端与目的端Redis的数据将会不一致。 在Redis迁移完成后进行数据校验可以检查数据的一致性,该如何校验就是我们本文的内容。我们在这里采用的是阿里开源的数据对比工具与Redis-Shake形成伴侣模式的开源工具redis-full-check,使用redis-full-check进行校验能够找出异常数据,为数据对齐提供可靠依据,本文主要介绍如何使用RedisFullCheck。 redis-full-check的基本介绍redis-full-check是阿里云自研的Redis数据校验工具,能够提取源端和目的端的数据进行多轮差异化比较,并将比较结果记录在一个SQLite3数据库中,从而达到全量数据校验的目的。 迁移源端和目的端Redis实例需为主从版、单节点版、开源集群版以及部分云上带proxy的集群版(阿里云、腾讯云)。 开源地址redis-full-check源码地址: ??https://github.com/aliyun/redis-full-check?? redis-full-check下载地址: ??https://github.com/alibaba/RedisFullCheck/releases?? 编译源码运行 ./bin/redis-full-check.darwin64 or redis-full-check.linux64,它分别在OSX和Linux中构建,然而,二进制文件并不总是最新版本。 或者您可以根据以下步骤构建red- full-check自己:
注意:必须先安装govendor,然后拉出所有依赖
执行build.sh进行编译即可。 基本原理redis-full-check通过全量对比源端和目的端的redis中的数据的方式来进行数据校验,其比较方式通过多轮次比较:每次都会抓取源和目的端的数据进行差异化比较,记录不一致的数据进入下轮对比(记录在sqlite3 db中)。通过多伦比较不断收敛,减少因数据增量同步导致的源库和目的库的数据不一致。最后sqlite中存在的数据就是最终的差异结果。数据对比介绍 redis-full-check对比的方向是单向,如果希望对比双向,则需要对比2次,第一次以A为源库,B为目的库,第二次以B为源库,A为目的库。 首次对别:会抓取源库A的数据,然后检测是否位于B中,反向不会检测,它检测的是源库是否是目的库的子集。每次比较,会先抓取比较的key。 第一轮是从源库中进行抓取,后面轮次是从sqlite3 db中进行抓取;抓取key之后是分别抓取key对应的field和value进行对比,然后将存在差异的部分存入sqlite3 db中,用于下次比较。 数据对比核心流程下图是基本的数据流图。 对比模式(comparemode)有三种可选: KeyOutline:只对比key值是否相等。ValueOutline:只对比value值的长度是否相等。FullValue:对比key值、value长度、value值是否相等。 对比会进行comparetimes轮(默认comparetimes=3)比较: 第一轮,首先找出在源库上所有的key,然后分别从源库和目的库抓取进行比较。第二轮,开始迭代比较,只比较上一轮结束后仍然不一致的key和field。不一致场景下分析 对于key不一致的情况,包括lack_source ,lack_target 和type,从源库和目的库重新取key、value进行比较。 value不一致的string,重新比较key:从源和目的取key、value比较。value不一致的hash、set和zset,只重新比较不一致的field,之前已经比较且相同的filed不再比较。这是为了防止对于大key情况下,如果更新频繁,将会导致校验永远不通过的情况。value不一致的list,重新比较key:从源和目的取key、value比较。 每轮之间会停止一定的时间(Interval)。 对于hash,set,zset,list大key处理采用以下方式:len <= 5192,直接取全量field、value进行比较,使用如下命令:hgetall,smembers,zrange 0 -1 withscores,lrange 0 -1。len > 5192,使用hscan,sscan,zscan,lrange分批取field和value。使用redis-full-check解压redis-full-check.tar.gz:tar -xvf redis-full-check.tar.gz执行如下命令进行数据校验:单机实例之间进行数据对比检测
集群实例之间进行数据对比检测
参数信息介绍redis-full-check中主要参数如下:
对比实现案例对比2个主从版/单节点:
对比主从和集群:
由于集群版只有db0,所以如果一端是集群版,另一端是非集群版(多个逻辑db),则需要添加sourcedbfilterlist或者targetdbfilterlist(非集群版本的一端) 查询对比结果
对比结果差异分析不一致类型redis-full-check判断不一致的方式主要分为2类:key不一致和value不一致。 key不一致key不一致主要分为以下几种情况: lack_target : key存在于源库,但不存在于目的库。type: key存在于源库和目的库,但是类型不一致。value: key存在于源库和目的库,且类型一致,但是value不一致。value不一致不同数据类型有不同的对比标准:string: value不同。hash: 存在field,满足下面3个条件之一: field存在于源端,但不存在与目的端。field存在于目的端,但不存在与源端。field同时存在于源和目的端,但是value不同。set/zset:与hash类似。list: 与hash类似。 field冲突类型有以下几种情况(只存在于hash,set,zset,list类型key中) lack_source: field存在于源端key,field不存在与目的端key。lack_target: field不存在与源端key,field存在于目的端key。value: field存在于源端key和目的端key,但是field对应的value不同。 |
2021-04-08
2021-10-03
2021-07-26
2019-10-11
2022-08-27