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

2023-01-09 14:17:34 来源:51CTO博客

数据迁移方式

对于大多数场景下的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:6379192.168.0.2:6379192.168.0.3:6379192.168.0.4:6379密码:123456
集群实例2
地址:192.168.1.1:6379192.168.1.2:6379192.168.1.3:6379192.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:6379192.168.0.2:6379192.168.0.3:6379192.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 节点地址。

标签: 数据迁移 手把手教你 配置文件

上一篇:【技术分享】Windows平台低延迟RTMP、RTSP播放器接口设计探讨
下一篇:最新消息:扫雷程序:基础版