redis-full-check校验工具

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: redis-full-check是阿里云Redis&MongoDB团队开源的用于校验2个redis数据是否一致的工具,通常用于redis数据迁移后正确性的校验。

  redis-full-check是阿里云Redis&MongoDB团队开源的用于校验2个redis数据是否一致的工具,通常用于redis数据迁移(redis-shake)后正确性的校验。

  支持:单节点、主从版、集群版、带proxy的云上集群版(阿里云)之间的同构或者异构对比,版本支持2.x-5.x。

基本原理

  下图给出了最基本的比较逻辑。

image.png

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

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

  下图是基本的数据流图,redis-full-check内部分为多轮比较,也就是黄色框所指示的部分。每次比较,会先抓取比较的key,第一轮是从源库中进行抓取,后面轮次是从sqlite3 db中进行抓取;抓取key之后是分别抓取key对应的field和value进行对比,然后将存在差异的部分存入sqlite3 db中,用于下次比较。

9265b38541eb1d1ea61daa12cf3392c284e796b6.png

不一致类型

  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。


开源地址

redis-full-check: https://github.com/aliyun/redis-full-check

数据迁移工具redis-shake: https://github.com/aliyun/redis-shake

如果有问题或者建议,请在github issue上进行留言,也欢迎大家一起加入开源开发。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
3月前
|
NoSQL Redis 数据库
数据传输DTS中金融云跨账号同步Redis,增量校验报错了
【1月更文挑战第16天】【1月更文挑战第80篇】数据传输DTS中金融云跨账号同步Redis,增量校验报错了
65 1
|
NoSQL Redis
Redis远程连接工具,安装教程,附安装包(重要)!
Redis远程连接工具,安装教程,附安装包(重要)!
919 0
Redis远程连接工具,安装教程,附安装包(重要)!
|
6月前
|
NoSQL Go 数据库
2023最新版 Navicat 16.2+系列安装和试用教程详解:轻松掌握最新版本的数据库管理工具连接Redis
2023最新版 Navicat 16.2+系列安装和试用教程详解:轻松掌握最新版本的数据库管理工具连接Redis
281 0
|
1月前
|
NoSQL Redis
Redis企业项目实战--登录校验拦截器
Redis企业项目实战--登录校验拦截器
|
1月前
|
存储 NoSQL 前端开发
【SpringBoot】Redis集中管理Session和自定义用户参数解决登录状态及校验问题
【SpringBoot】Redis集中管理Session和自定义用户参数解决登录状态及校验问题
|
1月前
|
缓存 NoSQL 安全
【Redis】2、Redis应用之【根据 Session 和 Redis 进行登录校验和发送短信验证码】
【Redis】2、Redis应用之【根据 Session 和 Redis 进行登录校验和发送短信验证码】
51 0
|
5月前
|
监控 NoSQL Redis
Redis监控数据分布工具Redis-audit 使用总结
Redis监控数据分布工具Redis-audit 使用总结
51 0
|
6月前
|
NoSQL Redis
32Redis - redis图形化工具安装教程
32Redis - redis图形化工具安装教程
38 0
|
6月前
|
NoSQL Java Redis
Redisson集群管理工具、对Redis节点的操作
Redisson集群管理工具、对Redis节点的操作
141 1
|
7月前
3.redis图形化界面工具的使用
3.redis图形化界面工具的使用
39 0

热门文章

最新文章