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:端口>

此时新节点未分配任何槽位。

  1. 启动重新分片交互工具
redis-cli --cluster reshard <集群中任一节点IP:端口> -a <密码>

系统会依次询问:

  • 要移动多少个槽? 例如输入 4096
  • 目标节点 ID 是? 输入新节点的 ID(可从 cluster nodes 获取)。
  • 从哪些节点获取槽? 输入源节点 ID,可输入多个,用空格分隔,输入 all 表示从所有现有节点均匀取出。
  • 是否开始迁移? 确认后执行。
  1. 观察迁移进度 迁移过程中会打印移动的槽和键数量,完成后自动更新集群拓扑。

移除节点

如果节点已无槽位(或先通过 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 重定向带来的瞬时影响。

迁移后的验证清单

  1. 槽位验证
    redis-cli --cluster check <集群节点IP:端口>