全量检查-Redis

鹰眼

1 项目概述

1.1 背景介绍及目标

  • Redis 集群间数据检查

1.2 名词说明

1.2.1 数据一致率

  • 一致率 = (key_sum_num - key_diff_num)/key_sum_num * 100%

1.3 Roadmap

2 需求分析

需求分析重点是需求

2.1 功能需求

2.1.1 不一致类型

不一致的方式主要分为 2 类:key 不一致和 value 不一致。

2.1.2 key 不一致

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

2.1.3 对比模式

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, 仅打印日志,不校验数据

2.2 非功能需求

2.3 调研

2.3.1 vipshop/redis-migrate-tool

https://github.com/vipshop/redis-migrate-tool

如果想检查更多的 key,可以使用下面命令:

插入一些测试 key (redis_testinsert)

2.3.2 alibaba/RedisFullCheck

https://github.com/alibaba/RedisFullCheck

3 总体设计

总体设计重点是设计与折衷

3.1 系统架构

一般来说会有个简单的架构图,并配以文字对架构进行简要说明;

3.2 模块简介

架构图中如果有很多模块,需要对各个模块的功能进行简要介绍;

3.3 设计与折衷

设计与折衷是总体设计中最重要的部分;

3.4 潜在风险

4 详细设计

详细设计重点在“详细”

4.1 分发任务

(有了数据库 + 接口 + 流程,别的同学拿到详设文档,基本也能够搞定了)

4.1.1 交互流程

简要的交互可用文字说明,复杂的交互建议使用流程图,交互图或其他图形进行说明

4.1.2 数据库设计

4.1.3 接口形式

4.1.4 Redis key

python 中 repr 和 eval 可以用来在数据结构和字符串间互转 在这个功能上,repr 和 str 的作用一样,把一个数据结构转换成字符串,例如:

Redis 中很多 key name 是使用的中文,可以先通过 repr(key) 转为字符串,塞入队列,然后处理 worker 获取到时先 eval(key_str) 进行转换为原数据

5 数据统计

5.1 scan 耗时

  • 10G 数据,不限速

  • 10G 数据(每次 scan 后,等待 10ms)

5.2 scan 并发送任务耗时

  • 10G 数据 (900w key)

Last updated