Redis 不停机数据迁移实战:基于 redis-shake 的跨实例 / 跨集群同步方案
前言
本文介绍使用阿里云开源的redis-shake工具,实现Redis的不停机数据迁移。该工具支持多种部署架构(单机、主从、集群、Sentinel集群),并能自动同步增量数据,最大程度降低迁移风险。
对比使用主从复制等其他方式来做数据迁移,用redis-shake会方便简单很多。
1. 方案概述
1.1 工具简介
redis-shake是阿里云开源的一款Redis数据同步工具,支持数据迁移、数据同步、数据校验等功能。它通过模拟Redis复制协议,从源实例读取数据并写入目标实例,实现全量+增量同步。
1.2 适用场景
- 新Redis版本 >= 旧Redis版本
- 新旧Redis实例地址不同(跨实例/跨集群迁移)
- 需要不停机迁移,保证业务连续性
- 数据量从中等到大型(GB到TB级别)
- 支持单机、主从、集群、Sentinel集群等多种部署架构
1.3 方案优点
- 自动同步增量数据:全量同步完成后,自动进入增量同步状态,持续监听源实例变更
- 风险最低:迁移过程不影响源实例服务,仅在最终切流时有秒级延迟
- 支持数据校验:可配置数据一致性校验(需额外配置)
- 简单易用:配置清晰,操作步骤少
2. 前置准备
- 环境要求 :确保已准备好源Redis 和目标Redis实例
- 网络互通:确保同步机器可同时访问源和目标实例(默认端口6379,Sentinel为26379)
- 权限准备:确保有访问Redis的权限(密码、ACL等)
- 资源评估:根据数据量评估同步时间,确保目标实例有足够存储空间
3. 迁移步骤详解
3.1 下载并解压redis-shake
在可同时访问源和目标实例的机器上执行:
bash
# 下载redis-shake(版本可根据需要调整)
wget https://github.com/tair-opensource/RedisShake/releases/download/v4.4.2/redis-shake-v4.4.2-linux-amd64.tar.gz
# 解压
tar -zxvf redis-shake-v4.4.2-linux-amd64.tar.gz
3.2 编辑配置文件
配置文件shake.toml包含源和目标实例的连接信息。根据架构不同,配置有所差异。
3.2.1 场景一:迁移Sentinel管理的Redis集群
如果Redis由Sentinel管理,需从Sentinel获取主节点信息。
步骤1:获取Sentinel信息
在源集群和目标集群的任意Sentinel节点执行:
bash
# 查看Sentinel进程
ps aux | grep redis-sentinel
# 连接Sentinel,查看master信息(命令需要看你们自己安装的目录是什么,我这里的仅供参考)
/opt/redis/bin/redis-cli -h <sentinel_ip> -p 26379
SENTINEL masters
name下面的就是名称,我这里是mymaster

记录master_name和Sentinel地址(如172.10.10.207:26379)。
步骤2:编辑配置文件
bash
vi shake.toml
toml
[sync_reader]
cluster = false
address = "" # 源端 Redis 的地址会从 Sentinel 中获取
#username = ""
#password = ""
tls = false
[sync_reader.sentinel]
master_name = "mymaster" # master_name
address = "172.10.10.207:26379" # Sentinel地址
username = ""
password = ""
tls = false
[redis_writer]
cluster = false
address = "" # 目标端 Redis 的地址会从 Sentinel 中获取
#username = ""
#password = ""
tls = false
[redis_writer.sentinel]
master_name = "mymaster" # master_name
address = "172.10.10.128:26379" # Sentinel地址
username = ""
password = ""
tls = false
3.2.2 场景二:迁移单节点/主从节点
直接连接Redis主节点配置(如果配置了主从,则填写的是各自的主节点地址):
bash
vi shake.toml
toml
[sync_reader]
cluster = false
address = "源Redis地址:6379" # 示例:"127.0.0.1:6379"
#username = "admin" # 如启用ACL
#password = "123456" # 认证密码
[redis_writer]
cluster = false
address = "目标Redis地址:6379" # 示例:"172.10.10.128:6379"
#username = "admin"
#password = "123456"
3.3 启动同步任务
配置完成后,启动同步:
bash
./redis-shake shake.toml
说明:
- 该命令在前台运行,输出同步日志
- 先进行全量数据同步 ,完成后自动进入增量同步状态
- 增量阶段会持续同步源实例的写入操作
- 准备切流时,可手动停止进程(Ctrl+C)
3.4 验证迁移结果
3.4.1 连接Redis实例
bash
# 连接Redis(如配置主从,连接主节点)
/opt/redis/bin/redis-cli -h <host> -p <port> -a <password>
# 查看主从信息
info replication
3.4.2 写入测试数据(源实例)
bash
# 生成测试数据
SADD friends "张三" "李四" "王五"
EVAL "for i=1,100 do redis.call('SET', 'key:'..i, 'value'..i) end" 0
EVAL "for i=1,50 do redis.call('HSET', 'product:'..i, 'name', '商品'..i, 'price', i*10, 'stock', 100) end" 0
3.4.3 验证数据同步(目标实例)
bash
# 查看key数量
dbsize
# 抽样检查(避免使用 keys *,大数据量会阻塞)
GET key:1
HGETALL product:1
SMEMBERS friends
# 查看keyspace信息
info keyspace
4. 注意事项与排查建议
4.1 关键注意事项
- 网络与带宽:同步过程会占用网络带宽,建议在业务低峰期进行
- 资源监控:监控源和目标实例的CPU、内存使用率
- 数据一致性:可在业务低峰期进行数据校验
- 版本兼容:确保redis-shake版本与Redis版本兼容(本文使用Redis 7.0.4 + redis-shake v4.4.2)
- 切流流程 :
- 保持增量同步一段时间(如24小时)
- 暂停写入源实例
- 等待增量数据完全同步
- 将业务连接切换到目标实例
4.2 常见问题排查
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| 连接失败 | 网络不通/防火墙限制 | 检查端口连通性,确保6379/26379开放 |
| 认证失败 | 密码错误/ACL配置问题 | 确认用户名密码,检查requirepass配置 |
| 同步缓慢 | 网络带宽不足/数据量大 | 监控网络流量,评估同步时间 |
| 数据不一致 | 同步过程中有大量写入 | 在业务低峰期执行,或启用校验功能 |
5. 总结
通过redis-shake工具,我们可以实现Redis实例之间的不停机数据迁移,支持从单机到集群、跨集群等多种场景。该工具具有以下优势:
- ✅ 简单易用:配置清晰,上手快速
- ✅ 安全可靠:支持增量同步,最小化业务影响
- ✅ 兼容性好:支持多种Redis部署架构
- ✅ 功能完善:支持数据校验,确保一致性