Redis 集群数据迁移
FreeGuideOnline
最新
2026-07-13
bash redis-cli -h <任意节点IP> -p <端口> -a <密码> cluster nodes
确认集群处于 `ok` 状态,所有槽位均已分配。
### 备份数据
无论使用何种迁移方式,都建议先执行 `BGSAVE` 生成 RDB 快照,并定期备份 AOF 文件。
### 评估迁移数据量
通过 `INFO memory` 查看各节点内存使用,预估迁移耗时。
## 方法一:使用 redis-cli 在线重新分片
这是官方推荐的在线迁移方式,适用于同一集群内部的槽位调整。
**适用场景**:集群正常运行期间,添加/移除节点,重新平衡槽位。
**原理**:redis-cli 通过 `MIGRATE` 命令,以原子方式将槽中的所有键逐个从源节点迁移到目标节点,迁移过程中集群对外服务不受影响。
### 添加新节点并迁移槽位
1. **将新节点加入集群**
```bash
redis-cli --cluster add-node <新节点IP:端口> <集群中任一节点IP:端口>
此时新节点未分配任何槽位。
- 启动重新分片交互工具
redis-cli --cluster reshard <集群中任一节点IP:端口> -a <密码>
系统会依次询问:
- 要移动多少个槽? 例如输入
4096。 - 目标节点 ID 是? 输入新节点的 ID(可从
cluster nodes获取)。 - 从哪些节点获取槽? 输入源节点 ID,可输入多个,用空格分隔,输入
all表示从所有现有节点均匀取出。 - 是否开始迁移? 确认后执行。
- 观察迁移进度 迁移过程中会打印移动的槽和键数量,完成后自动更新集群拓扑。
移除节点
如果节点已无槽位(或先通过 reshard 移走槽位),可将其从集群中剔除:
redis-cli --cluster del-node <集群中任一节点IP:端口> <待移除节点ID>
方法二:redis-shake 跨集群数据同步
redis-shake 是阿里云开源的工具,支持全量+增量同步,可实现零停机迁移。
适用场景:不同 Redis 集群之间迁移(如自建到云、版本升级),需要结构不兼容或大规模搬迁。
安装 redis-shake
下载地址:https://github.com/tair-opensource/RedisShake/releases
解压后得到可执行文件和示例配置文件 redis-shake.conf。
配置迁移任务
编辑配置文件(以从集群 A 迁移到集群 B 为例):
# 源端类型为集群
source.type = cluster
source.address = 192.168.1.10:6379;192.168.1.11:6379;192.168.1.12:6379
source.password_raw = 源端密码
# 目标端类型为集群
target.type = cluster
target.address = 10.0.0.10:6379;10.0.0.11:6379;10.0.0.12:6379
target.password_raw = 目标端密码
# 功能选项
rewrite = true # 如果存在冲突,覆盖写入
log.level = info
parallel = 32 # 同步并行度
更多高级选项可参考官方文档。
执行迁移
./redis-shake.linux -conf=redis-shake.conf -type=sync
该命令会先全量拉取 RDB,再通过主从复制协议进行增量追赶,当延迟接近 0 时可切换业务连接。
验证与切换
- 使用
redis-cli --cluster check <目标集群节点>检查槽覆盖与一致性。 - 停写源集群,观察 redis-shake 日志确认无延迟后停止进程,完成切换。
方法三:手动使用 MIGRATE 命令
适用于少量键的定向迁移,或在脚本中精细控制迁移逻辑。
MIGRATE 基本语法
MIGRATE <目标IP> <目标端口> <键名> 0 <超时毫秒> [COPY] [REPLACE] [AUTH <密码>] [KEYS <多个键>]
迁移单个键
redis-cli -h 源IP -p 源端口 -a 密码 MIGRATE 目标IP 目标端口 "" 0 5000 COPY REPLACE KEYS mykey1
""表示目标数据库索引(集群模式下必须为 0)COPY保留源键,REPLACE覆盖目标已存在的键
批量迁移模式下的键
可以在目标节点使用 CLUSTER SETSLOT <槽号> IMPORTING <源节点ID> 和源节点设置 MIGRATING,然后循环迁移槽内键,最后用 CLUSTER SETSLOT NODE 完成槽归属变更。这一流程通常由客户端库或 redis-cli 自动完成,手动操作较为复杂,不推荐初学者使用。
迁移过程中的常见问题与优化
避免阻塞与性能下降
- 迁移速度控制:使用 redis-cli reshard 时可以指定
--interval参数(默认 1000ms)来调整每次移动的键数量,避免大量 Pipeline 操作阻塞源节点。 - 监控延迟:迁移期间密切监控
CLIENTS阻塞数量和latency,可使用 Redis 的LATENCY DOCTOR辅助诊断。 - 关键键迁移:对于大键(bigkey),MIGRATE 会阻塞较长时间,可先对热键做拆分,或使用
UNLINK异步删除后再迁移。
数据一致性保障
- 使用 redis-shake 的增量模式时,可在配置中设置
keep_alive = true保持连接,避免同步中断后需要全量重传。 - 迁移完成后,务必执行
redis-cli --cluster check验证所有节点槽位分配一致。
集群模式下的注意事项
- 迁移键时,Redis 集群要求目的节点必须已经拥有对应槽,否则会返回
MOVED错误。使用 reshard 工具会自动处理槽的分配。 - 多线程写入的场景,建议在业务低峰期进行迁移,以减少 MOVED/ASK 重定向带来的瞬时影响。
迁移后的验证清单
- 槽位验证
redis-cli --cluster check <集群节点IP:端口>