redis-full-check

 

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

     redis-full-check是阿里云Redis&MongoDB团队开源的用于校验2个redis数据是否一致的工具。
  redis-full-check通过全量对比源端和目的端的redis中的数据的方式来进行数据校验,其比较方式通过多轮次比较:每次都会抓取源和目的端的数据进行差异化比较,记录不一致的数据进入下轮对比(记录在sqlite3 db中)。然后通过多轮比较不断收敛,减少因数据增量同步导致的源库和目的库的数据不一致。最后sqlite中存在的数据就是最终的差异结果。

_

redis-full-check对比的方向是单向:抓取源库A的数据,然后检测是否位于B中,反向不会检测,也就是说,它检测的是源库是否是目的库的子集。如果希望对比双向,则需要对比2次,第一次以A为源库,B为目的库,第二次以B为源库,A为目的库。

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不同。

比较原理

  对比模式(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不一致的hashsetzset,只重新比较不一致的field,之前已经比较且相同的filed不再比较。这是为了防止对于大key情况下,如果更新频繁,将会导致校验永远不通过的情况。
    • value不一致的list,重新比较key:从源和目的取key、value比较。
  • 每轮之间会停止一定的时间(Interval)。

  对于hashsetzsetlist大key处理采用以下方式:

    • len <= 5192,直接取全量field、value进行比较,使用如下命令:hgetallsmemberszrange 0 -1 withscoreslrange 0 -1
    • len > 5192,使用hscan,sscan,zscan,lrange分批取field和value。
-s, --source=SOURCE               源redis库地址(ip:port),如果是集群版,那么需要以分号(;) 
                                  分割不同的db,只需要配置主或者从的其中之一。例如: 
                                  10.1.1.1:1000;10.2.2.2:2000;10.3.3.3:3000。
  -p, --sourcepassword=Password     源redis库密码
      --sourceauthtype=AUTH-TYPE    源库管理权限,开源reids下此参数无用。
      --sourcedbtype=               源库的类别,0:db(standalone单节点、主从),1: cluster 
                                   (集群版),2: 阿里云
      --sourcedbfilterlist=         源库需要抓取的逻辑db白名单,以分号(;)分割,例如:0;5;15 
                                    表示db0,db5和db15都会被抓取
  -t, --target=TARGET               目的redis库地址(ip:port)
  -a, --targetpassword=Password     目的redis库密码
      --targetauthtype=AUTH-TYPE    目的库管理权限,开源reids下此参数无用。
      --targetdbtype=               参考sourcedbtype
      --targetdbfilterlist=         参考sourcedbfilterlist
  -d, --db=Sqlite3-DB-FILE          对于差异的key存储的sqlite3 db的位置,默认result.db
      --comparetimes=COUNT          比较轮数
  -m, --comparemode=                比较模式,1表示全量比较,2表示只对比value的长度,3只对比 
                                    key是否存在,4全量比较的情况下,忽略大key的比较
      --id=                         用于打metric
      --jobid=                      用于打metric
      --taskid=                     用于打metric
  -q, --qps=                        qps限速阈值
      --interval=Second             每轮之间的时间间隔
      --batchcount=COUNT            批量聚合的数量
      --parallel=COUNT              比较的并发协程数,默认5
      --log=FILE                    log文件
      --result=FILE                 不一致结果记录到result文件中,格式:'db    diff-type    
                                    key    field'
      --metric=FILE                 metric文件
      --bigkeythreshold=COUNT       大key拆分的阈值,用于comparemode=4
  -f, --filterlist=FILTER           需要比较的key列表,以分号(;)分割。例 
                                    如:"abc*|efg|m*"表示对比'abc', 'abc1', 'efg', 'm', 
                                    'mxyz',不对比'efgh', 'p'。
  -v, --version
 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凤舞飘伶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值