写点什么

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

作者:洛神灬殇
  • 2023-01-09
    江苏
  • 本文字数:1654 字

    阅读完需:约 5 分钟

【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 文件进行配置和执行迁移操作,如下图所示。


实例信息

单机实例 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_helperpip3 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_helperpython3 cluster_helper.py ../redis-shake ../scan.toml
复制代码


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

  • 参数 2 是配置文件路径


Redis 哨兵模式

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


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

  • target 的 address 些目的端的 master 节点地址。

发布于: 刚刚阅读数: 4
用户头像

洛神灬殇

关注

🏆 InfoQ写作平台-签约作者 🏆 2020-03-25 加入

【个人简介】酷爱计算机科学、醉心编程技术、喜爱健身运动、热衷悬疑推理的“极客达人” 【技术格言】任何足够先进的技术都与魔法无异 【技术范畴】Java领域、Spring生态、MySQL专项、微服务/分布式体系和算法设计等

评论

发布
暂无评论
【Redis 技术探索】「数据迁移实战」手把手教你如何实现在线 + 离线模式进行迁移 Redis 数据实战指南(scan模式迁移)_redis_洛神灬殇_InfoQ写作社区