redis-full-check与阿里云redis数据一致性检查

397 阅读5分钟

问题:

采用阿里云的redis-shake进行redis数据同步的过程中遇见需要进行数据一致性比对

分析:

理论:CRDT--yq.aliyun.com/articles/63…

幸运的是CRDT目前仅支持redis 4.0版本,雪球使用的就是redis4

解决:

采用阿里云开源组件:redis-full-check

 

准备:

1.下载组件

2.启动命令

nohup ./redis-full-check -s '涉密隐藏' --sourcedbtype=1 -t 涉密隐藏:6379 --targetdbtype=2 --comparemode=1 1>>redis-full-check.output 2>&1 &

已经封装在start.sh脚本中

#!/usr/bin/env bash
 
catalog=$(dirname "$0")
 
cd "${catalog}" || exit 1
 
if [ $# != 2 ] ; then
    echo "USAGE: $0 [source] [target]"
    exit 0
fi
 
name="redis-full-check"
 
if [ "Linux" != "$(uname -s)" ];then
    printf "\\nWARNING !!! MacOs doesn't supply to use this script, please use \"./%s -conf=config_file_name\" manual command to run\\n" "$name"
    exit 1
fi
 
nohup ./redis-full-check -s $1 --sourcedbtype=1 -t $2 --targetdbtype=2 --comparemode=1 1>>$name.output 2>&1 &

参数解释:

-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

3.日志分析

# 第一部分 初始化校验
# 第二部分 开始通过scan比较
# 第三部分 开始比较第二轮
# 第三部分 开始比较第三轮
# 第四部分 校验结束
# 第一部分 初始化校验``[INFO ``2020``-``03``-``31``-``22``:``15``:``56 main.go:``65``]: init log success``[INFO ``2020``-``03``-``31``-``22``:``15``:``56 main.go:``168``]: configuration: {涉密隐藏  auth ``1 -``1 涉密隐藏:6379  auth ``2 -``1 result.db  ``3 1 unknown unknown unknown ``15000 5 256 5   false 16384  20445 false``}``[INFO ``2020``-``03``-``31``-``22``:``15``:``56 main.go:``170``]: ---------``[INFO ``2020``-``03``-``31``-``22``:``15``:``56 full_check.go:``238``]: sourceDbType=``1``, p.sourcePhysicalDBList=[``10.10``.``52.100``:``24695 10.10``.``52.100``:``24691``]``[INFO ``2020``-``03``-``31``-``22``:``15``:``56 full_check.go:``241``]: db=``0``:keys=``0``(inaccurate ``for type cluster)``[INFO ``2020``-``03``-``31``-``22``:``15``:``56 full_check.go:``253``]: ---------------- start 1th time compare``[INFO ``2020``-``03``-``31``-``22``:``15``:``56 full_check.go:``278``]: start compare db ``0``[INFO ``2020``-``03``-``31``-``22``:``15``:``56 scan.go:``20``]: build connection[source redis addr: [涉密隐藏]]``[INFO ``2020``-``03``-``31``-``22``:``15``:``56 scan.go:``20``]: build connection[source redis addr: [涉密隐藏]]``# 第二部分 开始通过scan比较``[INFO ``2020``-``03``-``31``-``22``:``15``:``58 full_check.go:``203``]: stat:``times:``1``, db:``0``, dbkeys:``0``, finish:-``1``%, finished:``false``KeyScan:{``354420 0 177210``}``KeyEqualInProcess|string|equal|{``90543 0 45272``}  [INFO ``2020``-``03``-``31``-``22``:``21``:``16 full_check.go:``203``]: stat:``times:``1``, db:``0``, dbkeys:``0``, finish:-``1``%, finished:``false``KeyScan:{``30344088 0 63457``}``KeyEqualInProcess|string|equal|{``30115621 0 81155``} [INFO ``2020``-``03``-``31``-``22``:``21``:``18 full_check.go:``203``]: stat:``times:``1``, db:``0``, dbkeys:``0``, finish:-``1``%, finished:``false``KeyScan:{``30344088 0 0``}``KeyEqualInProcess|string|equal|{``30283336 0 83858``} [INFO ``2020``-``03``-``31``-``22``:``21``:``19 full_check.go:``203``]: stat:``times:``1``, db:``0``, dbkeys:``0``, finish:-``1``%, finished:``true``KeyScan:{``30344088 0 0``}``KeyEqualInProcess|string|equal|{``30344088 60752 83858``} # 第三部分 开始比较第二轮``[INFO ``2020``-``03``-``31``-``22``:``21``:``19 full_check.go:``250``]: wait ``5 seconds before start``[INFO ``2020``-``03``-``31``-``22``:``21``:``24 full_check.go:``253``]: ---------------- start 2th time compare``[INFO ``2020``-``03``-``31``-``22``:``21``:``24 full_check.go:``278``]: start compare db ``0``[INFO ``2020``-``03``-``31``-``22``:``21``:``24 full_check.go:``203``]: stat:``times:``2``, db:``0``, finished:``true``KeyScan:{``0 0 0``} # 第三部分 开始比较第三轮``[INFO ``2020``-``03``-``31``-``22``:``21``:``24 full_check.go:``250``]: wait ``5 seconds before start``[INFO ``2020``-``03``-``31``-``22``:``21``:``29 full_check.go:``253``]: ---------------- start 3th time compare``[INFO ``2020``-``03``-``31``-``22``:``21``:``29 full_check.go:``278``]: start compare db ``0``[INFO ``2020``-``03``-``31``-``22``:``21``:``29 full_check.go:``203``]: stat:``times:``3``, db:``0``, finished:``true``KeyScan:{``0 0 0``} # 第四部分 校验结束``[INFO ``2020``-``03``-``31``-``22``:``21``:``29 full_check.go:``328``]: --------------- finished! ----------------``all finish successfully, totally ``0 key(s) and ``0 field(s) conflict

4.结果分析

结果:没有冲突

耗时:5:18

分析数据量:30344089个key 共5.78G数据

3034

时间戳动作
2020-03-31-22:15:56init log success
2020-03-31-22:15:56---------------- start 1th time compare
2020-03-31-22:21:24---------------- start 2th time compare
2020-03-31-22:21:29---------------- start 3th time compare
2020-03-31-22:21:29--------------- finished! ----------------