【Redis 技术探索】「数据迁移实战」手把手教你如何实现在线 + 离线模式进行迁移 Redis 数据实战指南(scan模式迁移)

简介: 【Redis 技术探索】「数据迁移实战」手把手教你如何实现在线 + 离线模式进行迁移 Redis 数据实战指南(scan模式迁移)

在线数据迁移方式


对于大多数场景下的Redis的数据迁移,还是比较推荐大家参考我之前的前两篇文章。


  • 【Redis 技术探索】「数据迁移实战」手把手教你如何实现在线 + 离线模式进行迁移 Redis 数据实战指南(在线同步数据)


  • 【Redis 技术探索】「数据迁移实战」手把手教你如何实现在线 + 离线模式进行迁移 Redis 数据实战指南(离线同步数据)




scan模式在线数据迁移的场景和原因


但是还有一种常见是前两篇文章无法实现的,就是当云厂商出于种种考虑禁用了Redis的 psync 命令时,前述方案不可用。 对于这种情况可以使用redis-shake的scan模式来进行数据迁移。


scan模式的简单原理


原理是调用scan命令来获取 Redis 中的 key,然后使用 dump 命令获取 key 的内容,最终使用 restore 命令恢复 key 至目的端。


scan模式的局限性


  • 如果某个 key 在迁移过程中一直存在,scan 模式能保证他一定被迁移


  • 如果某个 key 在迁移过程中不是一直存在,scan 模式不保证其一定被迁移


  • 如果某个 key 在迁移过程中被修改,scan 模式不保证修改能同步到对端


  • 可见 scan 模式会有许多缺点,所以推荐 sync 模式,其次 restore 模式。



redis-shake 的 scan 模式来迁移数据案例


使用redis-shake的scan在线迁移操作,主要通过scan.toml文件进行配置和执行迁移操作,如下图所示。

image.png


实例信息


单机实例1


  • 地址:ip1
  • 端口:6379
  • 密码:123456


单机实例2


  • 地址:ip2
  • 端口:6379
  • 无密码



集群实例1


  • 地址:


  • 192.168.0.1:6379
  • 192.168.0.2:6379
  • 192.168.0.3:6379
  • 192.168.0.4:6379
  • 密码:123456



集群实例2


  • 地址:


  • 192.168.1.1:6379
  • 192.168.1.2:6379
  • 192.168.1.3:6379
  • 192.168.1.4:6379
  • 密码:123456




源Redis单机实例(1)到目标Redis单机实例(2)


修改 scan.toml,改为如下配置:

type = "scan"
[source]
address = "ip1:6379"
password = "123456"
[target]
type = "standalone"
address = "ip2:6379"
password =
复制代码
启动 redis-shake:
./redis-shake scan.toml
复制代码



源Redis单机实例(1)到目标Redis集群实例(2)


修改 scan.toml,改为如下配置:

type = "scan"
[source]
address = "ip1:6379"
password = "r-aaaaa:xxxxx"
[target]
type = "cluster"
address = "192.168.0.1:6379" # 这里写集群中的任意一个节点的地址即可,redis-shake可以根据这个ip地址,拉取集群的其他节点的ip和端口信息。
password = "123456"
复制代码



启动 redis-shake:
./redis-shake scan.toml
复制代码



源Redis集群实例(1)到目标Redis集群实例(2)


方案1-手动起多个redis-shake,集群1有四个节点:


  • 192.168.0.1:6379
  • 192.168.0.2:6379
  • 192.168.0.3:6379
  • 192.168.0.4:6379

把4个节点当成 4 个单机实例,参照前文部署 4 个 redis-shake 进行数据同步



方案2-借助 cluster_helper.py 启动


脚本cluster_helper.py方便启动多个 redis-shake 从集群迁移数据,效果等同于方法1。

注意


源端有多少个分片,cluster_helper.py 就会起多少个 redis-shake 进程,所以如果源端分片数较多的时候,需要评估当前机器是否可以承担这么多进程。


cluster_helper.py 异常退出的时候,可能没有正常退出 redis-shake 进程,需要 ps aux | grep redis-shake 检查。


每个 redis-shake 进程的执行日志记录在 RedisShake/cluster_helper/data/xxxxx 中,反馈问题请提供相关日志。


依赖


Python 需要 python3.6 及以上版本,安装 Python 依赖:

cd RedisShake/cluster_helper
pip3 install -r requirements.txt
复制代码



配置

修改 scan.toml:

type = "scan"
[source]
address = "192.168.0.1:6379" # 集群 C 中任意一个节点地址
password = "r-ccccc:xxxxx"
[target]
type = "cluster"
address = "192.168.1.1:6380" # 集群 D 中任意一个节点地址
password = "r-ddddd:xxxxx"
复制代码


运行
cd RedisShake/cluster_helper
python3 cluster_helper.py ../redis-shake ../scan.toml
复制代码



  • 参数 1 是 redis-shake 可执行程序的路径


  • 参数 2 是配置文件路径


image.png


Redis哨兵模式


sentinel 节点,将哨兵拓扑当成普通的主从节点即可,参照单机到单机:A->B配置文件:

  • source 的 address 写源端的 master 或 slave 节点地址,推荐 slave 节点。
  • target 的 address 些目的端的 master 节点地址。




相关文章
|
10月前
|
存储 缓存 NoSQL
Redis专题-实战篇二-商户查询缓存
本文介绍了缓存的基本概念、应用场景及实现方式,涵盖Redis缓存设计、缓存更新策略、缓存穿透问题及其解决方案。重点讲解了缓存空对象与布隆过滤器的使用,并通过代码示例演示了商铺查询的缓存优化实践。
396 1
Redis专题-实战篇二-商户查询缓存
|
10月前
|
存储 NoSQL 前端开发
Redis专题-实战篇一-基于Session和Redis实现登录业务
本项目基于SpringBoot实现黑马点评系统,涵盖Session与Redis两种登录方案。通过验证码登录、用户信息存储、拦截器校验等流程,解决集群环境下Session不共享问题,采用Redis替代Session实现数据共享与自动续期,提升系统可扩展性与安全性。
572 3
Redis专题-实战篇一-基于Session和Redis实现登录业务
|
10月前
|
存储 运维 NoSQL
Redis集群模式
Redis集群是一种分布式存储方案,旨在解决数据存储容量不足的问题。它通过将数据分片存储在多个节点上,实现数据的横向扩展。常见的分片算法包括哈希求余、一致性哈希和哈希槽分区。其中,Redis采用哈希槽分区算法,将数据均匀分配到16384个槽位中,每个分片负责一部分槽位。当节点故障时,集群通过故障检测和主从切换机制,确保服务的高可用性。集群还支持自动的数据迁移和负载均衡,保障系统稳定运行。
NoSQL 数据可视化 关系型数据库
238 0
|
NoSQL Redis UED
redis数据迁移、数据导出和导入用什么工具
用户体验好的客户端,我建议使用yunedit-redis来做数据迁移,因为它支持图形化,还支持多种导出方式。 yunedit-redis它支持全库导出,也支持选择部分key导出,还支持用*号表达式导出。
|
机器学习/深度学习 存储 NoSQL
基于 Flink + Redis 的实时特征工程实战:电商场景动态分桶计数实现
本文介绍了基于 Flink 与 Redis 构建的电商场景下实时特征工程解决方案,重点实现动态分桶计数等复杂特征计算。通过流处理引擎 Flink 实时加工用户行为数据,结合 Redis 高性能存储,满足推荐系统毫秒级特征更新需求。技术架构涵盖状态管理、窗口计算、Redis 数据模型设计及特征服务集成,有效提升模型预测效果与系统吞吐能力。
1385 10
|
缓存 监控 NoSQL
Redis 实操要点:Java 最新技术栈的实战解析
本文介绍了基于Spring Boot 3、Redis 7和Lettuce客户端的Redis高级应用实践。内容包括:1)现代Java项目集成Redis的配置方法;2)使用Redisson实现分布式可重入锁与公平锁;3)缓存模式解决方案,包括布隆过滤器防穿透和随机过期时间防雪崩;4)Redis数据结构的高级应用,如HyperLogLog统计UV和GeoHash处理地理位置。文章提供了详细的代码示例,涵盖Redis在分布式系统中的核心应用场景,特别适合需要处理高并发、分布式锁等问题的开发场景。
682 42
|
缓存 NoSQL 算法
高并发秒杀系统实战(Redis+Lua分布式锁防超卖与库存扣减优化)
秒杀系统面临瞬时高并发、资源竞争和数据一致性挑战。传统方案如数据库锁或应用层锁存在性能瓶颈或分布式问题,而基于Redis的分布式锁与Lua脚本原子操作成为高效解决方案。通过Redis的`SETNX`实现分布式锁,结合Lua脚本完成库存扣减,确保操作原子性并大幅提升性能(QPS从120提升至8,200)。此外,分段库存策略、多级限流及服务降级机制进一步优化系统稳定性。最佳实践包括分层防控、黄金扣减法则与容灾设计,强调根据业务特性灵活组合技术手段以应对高并发场景。
3548 7
|
存储 缓存 NoSQL
告别数据僵尸!Redis实现自动清理过期键值对
在数据激增的时代,Redis如同内存管理的智能管家,支持键值对的自动过期功能,实现“数据保鲜”。通过`EXPIRE`设定生命倒计时、`TTL`查询剩余时间,结合惰性删除与定期清理策略,Redis高效维护内存秩序。本文以Python实战演示其过期机制,并提供最佳实践指南,助你掌握数据生命周期管理的艺术,让数据优雅退场。
666 0
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?