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

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 【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 节点地址。




相关实践学习
基于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
相关文章
|
2天前
|
缓存 NoSQL 应用服务中间件
|
2天前
|
存储 缓存 NoSQL
解决Redis缓存击穿问题的技术方法
解决Redis缓存击穿问题的技术方法
14 2
|
2天前
|
NoSQL Redis 数据库
12)Redis 的游标迭代器(scan)
12)Redis 的游标迭代器(scan)
8 1
|
14天前
|
存储 NoSQL Redis
Redis 管道技术
【9月更文挑战第16天】Redis 管道技术通过批量发送命令并一次性读取响应,显著提升了与 Redis 服务器交互的性能。其工作原理包括命令缓冲、批量发送、响应接收与处理。管道技术减少了网络往返次数,提高了资源利用效率,并使代码更简洁。适用于批量操作、高并发环境及复杂业务逻辑等场景,是优化 Redis 应用性能的强大工具。
|
18天前
|
缓存 NoSQL PHP
使用PHP-redis实现键空间通知监听key失效事件的技术与代码示例
通过上述方法,你可以有效地在PHP中使用Redis来监听键空间通知,特别是针对键失效事件。这可以帮助你更好地管理缓存策略,及时响应键的变化。
49 3
|
2天前
|
存储 NoSQL Redis
10)Redis 的管道技术
10)Redis 的管道技术
10 0
|
28天前
|
NoSQL 安全 容灾
阿里云DTS踩坑经验分享系列|Redis迁移、同步
阿里云数据传输服务DTS在帮助用户迁移Redis数据、同步数据时,在某些复杂场景下会出现报错,或者源库与目标库数据不一致的问题,给用户带来困扰。本文介绍了DTS Redis到Redis迁移、同步过程中的典型问题,以帮助用户更好地使用DTS。
79 2
|
2月前
|
运维 监控 NoSQL
【Redis】哨兵(Sentinel)原理与实战全解~炒鸡简单啊
Redis 的哨兵模式(Sentinel)是一种用于实现高可用性的机制。它通过监控主节点和从节点,并在主节点故障时自动进行切换,确保集群持续提供服务。哨兵模式包括主节点、从节点和哨兵实例,具备监控、通知、自动故障转移等功能,能显著提高系统的稳定性和可靠性。本文详细介绍了哨兵模式的组成、功能、工作机制以及其优势和局限性,并提供了单实例的安装和配置步骤,包括系统优化、安装、配置、启停管理和性能监控等。此外,还介绍了如何配置主从复制和哨兵,确保在故障时能够自动切换并恢复服务。
|
23天前
|
消息中间件 NoSQL Go
PHP转Go系列 | ThinkPHP与Gin框架之Redis延时消息队列技术实践
【9月更文挑战第7天】在从 PHP 的 ThinkPHP 框架迁移到 Go 的 Gin 框架时,涉及 Redis 延时消息队列的技术实践主要包括:理解延时消息队列概念,其能在特定时间处理消息,适用于定时任务等场景;在 ThinkPHP 中使用 Redis 实现延时队列;在 Gin 中结合 Go 的 Redis 客户端库实现类似功能;Go 具有更高性能和简洁性,适合处理大量消息。迁移过程中需考虑业务需求及系统稳定性。
|
2月前
|
缓存 NoSQL Java
惊!Spring Boot遇上Redis,竟开启了一场缓存实战的革命!
【8月更文挑战第29天】在互联网时代,数据的高速读写至关重要。Spring Boot凭借简洁高效的特点广受开发者喜爱,而Redis作为高性能内存数据库,在缓存和消息队列领域表现出色。本文通过电商平台商品推荐系统的实战案例,详细介绍如何在Spring Boot项目中整合Redis,提升系统响应速度和用户体验。
52 0