Redis数据迁移神器RedisShake实操指南:覆盖单实例/集群全场景

在日常Redis运维中,你是否遇到过这些需求?

• 自建Redis迁移到云平台,担心数据丢失、迁移中断;

• 需搭建异地灾备,实现主从同步或双向同步;

• Redis版本升级,想平滑迁移数据不影响业务;

• 备份RDB文件、解析RDB内容,快速排查数据问题。

今天给大家推荐一款阿里云开源的Redis工具------RedisShake,一款集数据迁移、同步、备份、解析于一体的"全能工具",支持单机、主从、哨兵、集群等多种部署模式,轻松搞定不同环境下的Redis数据处理需求。

一、RedisShake 核心介绍

RedisShake 是阿里云 Tair 开源团队推出的轻量级Redis数据处理工具,无需复杂依赖,部署简单、操作便捷,能适配自建Redis、云Redis等多种环境,解决Redis全生命周期的数据管理难题。

1.1 四大核心功能

RedisShake 的核心能力集中在4个模块,覆盖数据从备份、迁移到解析的全流程:

  • 同步(sync):支持全量数据迁移+增量数据实时同步,确保源Redis和目标Redis数据完全一致,适用于迁移、灾备等场景;

  • 恢复(restore):将本地RDB文件快速恢复到目标Redis实例,无需手动执行复杂命令;

  • 备份(dump):将源Redis的全量数据备份为RDB文件,便于离线存储、数据回溯;

  • 解析(decode):解析RDB文件内容,并以JSON格式输出,方便查看数据结构、排查数据异常。

1.2 典型应用场景

结合实际运维场景,RedisShake 主要用于以下5种场景,几乎覆盖Redis运维的核心需求:

  1. 数据迁移:自建Redis迁移到云Redis、不同云服务商之间的Redis数据迁移;

  2. 灾备同步:搭建异地容灾架构,实现主从同步、双向同步,保障数据高可用;

  3. 缓存更新:结合数据库订阅机制,实现数据库变更后自动刷新Redis缓存,避免缓存不一致;

  4. 版本升级:Redis版本迭代时,平滑迁移数据,不中断业务访问;

  5. 数据备份与恢复:定期备份Redis数据为RDB文件,数据异常时快速恢复,降低数据丢失风险。

二、RedisShake 快速安装

RedisShake 无需编译,直接下载压缩包解压即可使用,以下是Linux(amd64)环境的安装步骤(其他系统可前往GitHub下载对应版本):

bash 复制代码
# 1. 创建安装目录(统一管理,便于后续操作)
mkdir -p /data/redisshake
cd /data/redisshake

# 2. 下载对应版本压缩包(此处以v4.3.2为例,可替换为最新版本)
wget https://github.com/tair-opensource/RedisShake/releases/download/v4.3.2/redis-shake-v4.3.2-linux-amd64.tar.gz

# 3. 解压压缩包
tar zxvf redis-shake-v4.3.2-linux-amd64.tar.gz

解压完成后,进入解压目录,可看到默认配置文件 shake.toml 和可执行文件 redis-shake,安装完成。

三、核心实操场景(附详细步骤)

以下是日常运维中最常用的4种场景,每一步都附详细命令和注意事项,新手也能轻松上手。所有场景均基于Redis 6.2.14版本测试,其他版本可参考操作(注意版本兼容性)。

场景1:单实例 → 单实例 数据同步

适用场景:将一台单机Redis的数据,迁移到另一台单机Redis(如测试环境迁移到生产环境、单机扩容迁移)。

1. 准备环境

提前准备两台单机Redis,具体信息如下(可根据自身环境修改IP、端口、密码):

主机IP 端口 组件角色 版本 说明
192.168.220.10 7001 单机Redis 6.2.14 源节点(制造测试数据)
192.168.220.10 7002 单机Redis 6.2.14 目标节点(接收迁移数据)

2. 准备测试数据 & 清空目标端

先在源节点制造测试数据,同时清空目标端数据,避免旧数据干扰迁移结果:

bash 复制代码
# 1. 源节点(7001)制造测试数据
redis-cli -p 7001 -a 123456 flushall  # 清空源节点原有数据(可选,根据实际需求)
redis-cli -p 7001 -a 123456 set port.7001.01 1
redis-cli -p 7001 -a 123456 set port.7001.02 1

# 2. 清空目标节点(7002)数据
redis-cli -p 7002 -a 123456 flushall

3. 修改RedisShake配置文件

基于默认配置文件复制一份新的配置,专门用于本次单实例同步,避免修改默认配置影响其他操作:

bash 复制代码
# 进入RedisShake安装目录
cd /data/redisshake

# 备份并复制配置文件(命名规范:源端口_to_目标端口.toml,便于区分)
cp shake.toml 7001to7002.toml

# 编辑配置文件(vim或nano均可)
vim 7001to7002.toml

修改以下核心配置(其他配置保持默认即可):

toml 复制代码
[sync_reader]
cluster = false           # 源节点是否为集群,单机设为false
address = "127.0.0.1:7001"  # 源节点地址(本机可写127.0.0.1,跨机写实际IP)
username = ""              # Redis用户名(无则留空)
password = "123456"        # 源节点密码(无则留空)

[redis_writer]
cluster = false           # 目标节点是否为集群,单机设为false
address = "127.0.0.1:7002"  # 目标节点地址
username = ""              # 目标节点用户名(无则留空)
password = "123456"        # 目标节点密码(无则留空)

4. 执行迁移操作

配置完成后,执行以下命令启动迁移,RedisShake会先同步全量数据,再实时同步增量数据:

bash 复制代码
cd /data/redisshake/
./redis-shake 7001to7002.toml

注意 :当终端持续打印相同的日志(如"sync rdb done"),说明全量数据已同步完成,此时正在同步增量数据;若只需全量迁移,按 ctrl+c 退出即可。

5. 验证迁移结果

登录目标节点,查看数据是否迁移成功:

bash 复制代码
# 登录目标节点(7002)
redis-cli -p 7002 -a 123456

# 查看所有key,确认测试数据已迁移
keys *

若输出 port.7001.01port.7001.02,说明迁移成功。

场景2:单实例 → Redis集群 数据同步

适用场景:将单机Redis的数据,迁移到Redis集群(如单机扩容为集群、测试数据导入集群)。

1. 准备环境

主机IP 端口 组件角色 版本 说明
192.168.220.10 6001 单机Redis 6.2.14 源节点(制造测试数据)
192.168.220.10 7001/7002 Redis节点 6.2.14 集群节点(7001为主,7002为从)
192.168.220.11 7001/7002 Redis节点 6.2.14 集群节点(7001为主,7002为从)
192.168.220.12 7001/7002 Redis节点 6.2.14 集群节点(7001为主,7002为从)

2. 准备测试数据 & 清空目标集群

bash 复制代码
# 1. 源节点(6001)制造测试数据
redis-cli -p 6001 -a 123456 flushall
redis-cli -p 6001 -a 123456 set port.6001.01 1
redis-cli -p 6001 -a 123456 set port.6001.02 1

# 2. 检查集群状态(确认集群正常运行)
redis-cli --cluster check 192.168.220.10:7001 -a 123456

# 3. 清空目标集群所有节点数据(集群模式需加 -c 参数)
redis-cli -h 192.168.220.10 -p 7001 -a 123456 -c flushall
redis-cli -h 192.168.220.11 -p 7001 -a 123456 -c flushall
redis-cli -h 192.168.220.12 -p 7001 -a 123456 -c flushall

3. 修改配置文件

bash 复制代码
cd /data/redisshake
# 复制配置文件,命名区分场景
cp shake.toml 6001_to_cluster.toml
# 编辑配置文件
vim 6001_to_cluster.toml

核心配置修改(重点修改目标端为集群模式):

toml 复制代码
[sync_reader]
cluster = false           # 源节点是单机,设为false
address = "192.168.220.10:6001"  # 源节点实际IP+端口
username = ""
password = "123456"

[redis_writer]
cluster = true            # 目标节点是集群,设为true
address = "192.168.220.10:7001,192.168.220.11:7001,192.168.220.12:7001"  # 集群所有主节点地址,用逗号分隔
username = ""
password = "123456"

4. 执行迁移 & 验证结果

bash 复制代码
# 执行迁移
cd /data/redisshake
./redis-shake 6001_to_cluster.toml

# 全量同步完成后,ctrl+c退出(增量同步可选)

# 验证数据(登录任意集群主节点)
redis-cli -h 192.168.220.12 -p 7001 -a 123456
keys *

场景3:Redis集群 → 单实例 数据同步

适用场景:将Redis集群的数据,迁移到单机Redis(如集群缩容、数据备份到单机、问题排查时导出集群数据)。

1. 准备环境

源节点为Redis集群(制造测试数据),目标节点为单机Redis,环境信息参考场景2(仅角色互换)。

2. 准备测试数据 & 清空目标端

bash 复制代码
# 1. 集群节点制造测试数据(登录任意主节点)
redis-cli -h 192.168.220.10 -p 7001 -a 123456 -c flushall
redis-cli -h 192.168.220.10 -p 7001 -a 123456 -c set c1 1
redis-cli -h 192.168.220.10 -p 7001 -a 123456 -c set c2 2
redis-cli -h 192.168.220.10 -p 7001 -a 123456 -c set c3 3

# 2. 清空目标单机(6001)数据
redis-cli -h 192.168.220.10 -p 6001 -a 123456 flushall

3. 修改配置文件

bash 复制代码
cd /data/redisshake
cp shake.toml cluster_to_6001.toml
vim cluster_to_6001.toml

核心配置修改(源节点为集群,目标为单机):

toml 复制代码
[sync_reader]
cluster = true            # 源节点是集群,设为true
address = "192.168.220.10:7001,192.168.220.11:7001,192.168.220.12:7001"  # 集群所有主节点地址
username = ""
password = "123456"

[redis_writer]
cluster = false           # 目标节点是单机,设为false
address = "192.168.220.10:6001"  # 目标单机地址
username = ""
password = "123456"

4. 执行迁移 & 验证结果

bash 复制代码
cd /data/redisshake
./redis-shake cluster_to_6001.toml

# 全量同步完成后ctrl+c退出
# 验证数据
redis-cli -h 192.168.220.10 -p 6001 -a 123456
keys *

场景4:单实例RDB文件 → Redis集群 导入

适用场景:源Redis与目标集群网络不通,无法直接同步,可先将源Redis数据备份为RDB文件,再将RDB文件导入集群。

1. 准备环境

同场景2(源为单机Redis,目标为Redis集群)。

2. 生成RDB文件 & 清空目标集群

bash 复制代码
# 1. 源单机(6001)制造测试数据并生成RDB文件
redis-cli -p 6001 -a 123456 flushall
redis-cli -p 6001 -a 123456 set port.6001.01 1
redis-cli -p 6001 -a 123456 set port.6001.02 1
redis-cli -p 6001 -a 123456 bgsave  # 后台生成RDB文件(不阻塞业务)

# 2. 查看RDB文件路径(Redis配置文件中dir参数指定,默认路径如下)
# 此处假设RDB文件路径为 /usr/local/redis6/data/6001/dump_6001.rdb

# 3. 清空目标集群数据(同场景2)
redis-cli --cluster check 192.168.220.10:7001 -a 123456
redis-cli -h 192.168.220.10 -p 7001 -a 123456 -c flushall
redis-cli -h 192.168.220.11 -p 7001 -a 123456 -c flushall
redis-cli -h 192.168.220.12 -p 7001 -a 123456 -c flushall

3. 拷贝RDB文件到RedisShake目录

bash 复制代码
# 将RDB文件拷贝到RedisShake安装目录(便于配置文件引用)
cp /usr/local/redis6/data/6001/dump_6001.rdb /data/redisshake/

4. 修改配置文件(重点配置RDB读取)

bash 复制代码
cd /data/redisshake
cp shake.toml rdb_to_cluster.toml
vim rdb_to_cluster.toml

核心配置修改(使用RDB文件作为数据源):

toml 复制代码
# 注释sync_reader相关配置,启用rdb_reader
# [sync_reader]
# cluster = false
# address = "xxx"
# ...

[rdb_reader]
rdb_file = "/data/redisshake/dump_6001.rdb"  # RDB文件路径(绝对路径)

[redis_writer]
cluster = true            # 目标是集群
address = "192.168.220.10:7001,192.168.220.11:7001,192.168.220.12:7001"
username = ""
password = "123456"

5. 执行导入 & 验证结果

bash 复制代码
cd /data/redisshake
./redis-shake rdb_to_cluster.toml

# 导入完成后ctrl+c退出
# 验证数据
redis-cli -h 192.168.220.12 -p 7001 -a 123456
keys *

四、常见问题注意事项

  • 版本兼容性:RedisShake v4.x 支持Redis 4.0+,建议源和目标Redis版本一致,避免数据结构不兼容;

  • 密码与权限:若Redis开启密码认证,配置文件中必须填写正确密码;若Redis有用户名认证(Redis 6.0+),需填写username参数;

  • 集群配置:集群同步时,address参数需填写所有主节点地址(用逗号分隔),无需填写从节点;

  • 增量同步:若需长期增量同步(如灾备),无需ctrl+c退出,RedisShake会持续同步增量数据;

  • RDB文件路径:导入RDB文件时,需填写绝对路径,避免路径错误导致无法读取文件。

五、总结

RedisShake 作为一款开源的Redis数据处理工具,凭借其轻量、高效、多功能的特点,完美解决了Redis数据迁移、同步、备份、解析的核心需求。本文覆盖了最常用的4种实操场景,从安装到验证,每一步都详细可落地,无论是新手还是资深运维,都能快速上手。

如果你的日常工作中需要处理Redis数据相关操作,不妨试试RedisShake,能极大提升运维效率,避免手动操作带来的风险。

最后,附上RedisShake GitHub地址:https://github.com/tair-opensource/RedisShake,可获取最新版本和更多详细文档。