Last updated
Last updated
Redis 集群间数据检查
一致率 = (key_sum_num - key_diff_num)/key_sum_num * 100%
需求分析重点是需求
不一致的方式主要分为 2 类:key 不一致和 value 不一致。
key 不一致主要分为以下几种情况:
lack_target : key 存在于源库,但不存在于目的库。
type: key 存在于源库和目的库,但是类型不一致。
length: value 长度不一致
value: key 存在于源库和目的库,且类型一致,但是 value 不一致。
string: value 不同。
hash: 存在 field,满足下面 3 个条件之一:
field 存在于源端,但不存在与目的端。
field 存在于目的端,但不存在与源端。
field 同时存在于源和目的端,但是 value 不同。
set/zset:与 hash 类似。
list: 与 hash 类似。
other: 其他异常
field 冲突类型有以下几种情况(只存在于 hash,set,zset,list 类型 key 中):
lack_source: field 存在于源端 key,field 不存在与目的端 key。
lack_target: field 不存在与源端 key,field 存在于目的端 key。
value: field 存在于源端 key 和目的端 key,但是 field 对应的 value 不同。
check_method
length: 对比 value 值的长度是否相等。
content: 对比 value 长度、value 值是否相等。
对于 hash,set,zset,list 大 key 处理采用以下方式:
len <= 1000,直接取全量 field、value 进行比较,使用如下命令:hgetall,smembers,zrange 0 -1 withscores,lrange 0 -1。
len > 1000, 仅打印日志,不校验数据
https://github.com/vipshop/redis-migrate-tool
如果想检查更多的 key,可以使用下面命令:
插入一些测试 key (redis_testinsert)
https://github.com/alibaba/RedisFullCheck
总体设计重点是设计与折衷
一般来说会有个简单的架构图,并配以文字对架构进行简要说明;
架构图中如果有很多模块,需要对各个模块的功能进行简要介绍;
设计与折衷是总体设计中最重要的部分;
详细设计重点在“详细”
(有了数据库 + 接口 + 流程,别的同学拿到详设文档,基本也能够搞定了)
简要的交互可用文字说明,复杂的交互建议使用流程图,交互图或其他图形进行说明
python 中 repr 和 eval 可以用来在数据结构和字符串间互转 在这个功能上,repr 和 str 的作用一样,把一个数据结构转换成字符串,例如:
Redis 中很多 key name 是使用的中文,可以先通过 repr(key) 转为字符串,塞入队列,然后处理 worker 获取到时先 eval(key_str) 进行转换为原数据
10G 数据,不限速
10G 数据(每次 scan 后,等待 10ms)
10G 数据 (900w key)