【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,改为如下配置:
启动 redis-shake:
源 Redis 单机实例(1)到目标 Redis 集群实例(2)
修改 scan.toml,改为如下配置:
启动 redis-shake:
源 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 依赖:
配置
修改 scan.toml:
运行
参数 1 是 redis-shake 可执行程序的路径
参数 2 是配置文件路径
Redis 哨兵模式
sentinel 节点,将哨兵拓扑当成普通的主从节点即可,参照单机到单机:A->B 配置文件:
source 的 address 写源端的 master 或 slave 节点地址,推荐 slave 节点。
target 的 address 些目的端的 master 节点地址。
版权声明: 本文为 InfoQ 作者【洛神灬殇】的原创文章。
原文链接:【http://xie.infoq.cn/article/2e7de254b30ebd22015449950】。文章转载请联系作者。
评论