一次Redis-shake迁移数据缺少key问题记录

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,倚天版 1GB 1个月
简介:

1、背景

某客户卡卷Redis集群数据迁移到阿里云redis,通过redis-shake工具迁移,遇到如下问题:
        ①源端:idc自建redis cluster,版本3.0.5,库中key基本都带过期时间
        ②目标端:阿里云redis 4分片集群,版本4.0
        ③通过redis-shake工具迁移,初始化完成,日志显示sync rdb done,进入增量阶段,发现目标库比源库少好多key,重试了多次,数据仍有缺失。

2、问题排查

2.1、观察redis-shake日志

        sync初始化完成进入增量,日志如下:

image

2.2、通过redis-full-check进行校验

        在上面初始化完成,进入增量后,通过redis-full-check校验数据,发现源端和目标端key相差较大,信息如下:

image

2.3、查看rdb文件

        这次拿的的redis-shake工具备份的备份文件,在查看备份文件rdb时发现,上面目标端缺少的key在rdb中没有,但是实际在源端是存在的。
        因为备份的文件看出有问题,这次去拿实际的redis rdb文件,登录到redis集群服务器,查看redis参数文件,找到rdb文件相关信息,发现
        ①三个主节点配置的dbfilename dump.rdb;dir ./这两个参数都是一样的
        ②去拿rdb文件,发现服务器上dump.rdb只有一个,结合上面参数的设置,怀疑三个主节点都写入到了同一个dump.rdb中

image


        ③查看redis三个主节点启动路径,验证②中的猜测

image


image


        从这里可以看到,redis集群主节点启动路径是一样的,多个节点数据都写入到了一个dump.rdb文件中。

2.4、redis-shake sync

        从上面看到的信息,结合本次使用的redis-shake工具,使用了sync模式,在全量初始化的时候,redis-shake需要去拿主节点的dump.rdb文件,结果源端只有一个dump.rdb文件,三个主节点之间数据互相覆盖,导致数据不完整,redis-shake进入增量之后,redis-full-check校验数据相差较大。

3、解决方法

        结合这次迁移环境,源端写入的key都是带过期时间的,等目标端缺少的这些key在源端过期后,之后的增量能实时从源库同步到目标库,达到数据迁移的目的。
        上面的方法只是针对这次的实际环境,最好是源端重新配置那两个参数,每个节点生成一个rdb文件,重新配置redis-shake全量+增量迁移。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
23天前
|
缓存 NoSQL Java
Redis 缓存与数据库数据不一致问题
Redis 缓存与数据库数据不一致问题
51 3
|
1天前
|
存储 NoSQL Redis
Redis存储原理与数据模型
Redis存储原理与数据模型
|
7天前
|
NoSQL Redis
Redis——大批量删除redis的key
Redis——大批量删除redis的key
22 1
|
7天前
|
NoSQL Redis
Redis——批量设置key的过期时间
Redis——批量设置key的过期时间
17 1
|
26天前
|
NoSQL Linux Redis
Redis性能优化问题之想确认Redis延迟变大是否因为fork耗时导致的,如何解决
Redis性能优化问题之想确认Redis延迟变大是否因为fork耗时导致的,如何解决
|
3天前
|
NoSQL Go Redis
Go语言中如何扫描Redis中大量的key
在Redis中,遍历大量键时直接使用`KEYS`命令会导致性能瓶颈,因为它会一次性返回所有匹配的键,可能阻塞Redis并影响服务稳定性。为解决此问题,Redis提供了`SCAN`命令来分批迭代键,避免一次性加载过多数据。本文通过两个Go语言示例演示如何使用`SCAN`命令:第一个示例展示了基本的手动迭代方式;第二个示例则利用`Iterator`简化迭代过程。这两种方法均有效地避免了`KEYS`命令的性能问题,并提高了遍历Redis键的效率。
11 0
|
26天前
|
缓存 NoSQL Redis
Redis性能优化问题之当Redis内存达到maxmemory后,淘汰数据的逻辑是怎样的
Redis性能优化问题之当Redis内存达到maxmemory后,淘汰数据的逻辑是怎样的
|
4天前
|
存储 NoSQL Redis
Tair的发展问题之在Redis集群模式下,Lua脚本操作key面临什么问题,如何解决
Tair的发展问题之在Redis集群模式下,Lua脚本操作key面临什么问题,如何解决
|
5天前
|
存储 NoSQL Ubuntu
在Ubuntu 14.04上如何备份和恢复Redis数据
在Ubuntu 14.04上如何备份和恢复Redis数据
11 0
|
5天前
|
缓存 NoSQL Shell
"揭秘!Redis数据导出大揭秘:从繁琐到一键搞定,让你的数据飞跃而出,感受前所未有的数据导出快感!"
【8月更文挑战第15天】Redis是高性能键值存储系统,适用于缓存等多种场景。随数据增长,需导出数据以分析、备份或迁移。本文详述三种导出方法:1) Redis命令与重定向,如SCAN与GET命令结合;2) 利用RDB快照或AOF持久化机制;3) 第三方工具如redis-dump。每种方法各有优势,可根据数据量及需求选择,同时需考虑操作对性能的影响及数据安全。
13 0