易君召
易君召
发布于 2026-11-13 / 5 阅读
0

Redis Cluster 数据迁移两大类场景

  1. 同集群内部扩缩容(槽迁移 reshard/rebalance):集群内部新增 / 下线节点,移动哈希槽,原生能力、在线、业务低影响 ✅

  2. 跨集群迁移(A 集群 → B 集群):两套独立集群之间迁移,用 RedisShake(全量 + 增量,双写切流量,零停机)

核心原理:Redis Cluster 最小迁移单元是哈希槽(0~16383),不是单条 key;迁移过程会出现 ASK、MOVED 重定向,客户端必须支持集群路由(Redisson、redis-cli -c)Redis

一、同集群扩容:添加节点 + reshard(最常用)

场景:3 主 3 从 → 4 主 4 从,新增主节点,把部分槽迁移给新主

步骤

  1. 启动新主节点(redis.conf 开启 cluster-enabled yes)

  2. 加入集群

# 把新master加入集群
redis-cli --cluster add-node 新IP:6379 集群任意节点IP:6379 -a xxx
  1. 查看 node-id

redis-cli -c -h 集群节点 -p 6379 -a xxx CLUSTER NODES
  1. 执行 reshard 迁移槽(交互式)

redis-cli --cluster reshard 集群任意节点IP:6379 -a xxx

交互提问:

  • How many slots do you want to move? → 要迁移多少槽(16384 / 主节点数)

  • What is the receiving node ID? → 填入新 master 的 node-id

  • Source node #1: all → 从所有旧主均匀拿槽

非交互脚本版本(生产自动化)

redis-cli --cluster reshard 10.0.0.1:6379 \
--cluster-from 源nodeid \
--cluster-to 目标nodeid \
--cluster-slots 4096 \
--cluster-yes \
-a xxx
  1. 自动均衡(推荐,比手动 reshard 更好)

# --cluster-simulate 先模拟,不真正迁移,先看效果
redis-cli --cluster rebalance 10.0.0.1:6379 -a xxx --cluster-simulate
# 确认没问题去掉simulate执行
redis-cli --cluster rebalance 10.0.0.1:6379 -a xxx --cluster-use-empty-masters

rebalance 自动把槽均匀分配给所有主节点,适合集群不均衡、新增节点后一键均衡

缩容(下线节点)

  1. 先把该主节点上所有槽全部迁移走(reshard 把槽迁回其他主)

  2. 槽全部迁移完成,集群 check 正常

  3. 删除节点

redis-cli --cluster del-node 集群节点:6379 待下线node-id -a xxx

底层手动命令(了解即可,不建议生产裸用)

# 目标节点:标记slot为导入
CLUSTER SETSLOT 100 IMPORTING 源nodeid
# 源节点:标记slot为迁出
CLUSTER SETSLOT 100 MIGRATING 目标nodeid
# 循环获取key、MIGRATE迁移key
CLUSTER GETKEYSINSLOT 100 10
MIGRATE 目标IP 6379 key 0 5000
# 迁移完成,广播槽归属
CLUSTER SETSLOT 100 NODE 目标nodeid

二、跨集群迁移(A 集群 → B 集群,不同集群、不同机房 / 云厂商)

原生 reshard 不能跨集群! 必须用同步工具:RedisShake(Tair 开源),标准方案:全量同步 → 持续增量同步 → 校验数据 → 切流量 → 停同步(蓝绿切换,几乎无停机)华为云

RedisShake 核心配置 shake.toml(Cluster to Cluster)

[sync_reader]
address = "10.0.0.1:6379" #源集群任意节点
password = "Redis@2026"
tls = false
cluster = true #源是cluster

[redis_writer]
address = "10.0.1.1:6379" #目标集群任意节点
password = "Redis@2026"
cluster = true #目标是cluster

启动:

./redis-shake shake.toml

日志识别:

  • sync rdb done:全量 RDB 同步完成,进入 AOF 增量实时同步

  • write_ops=[0.00]:两边无差异,可准备切换流量华为云

跨集群迁移流程(生产标准)

  1. 目标集群提前建好、配置相同(maxmemory、淘汰策略、持久化)

  2. 启动 RedisShake,全量 + 增量持续同步

  3. 双写校验阶段:业务同时写源 + 目标,对比 key 数量、采样校验

  4. 切流量:应用切到目标集群

  5. 观察一段时间,确认业务稳定,停止 RedisShake

备选:RDB 离线迁移(适合可以停机、数据量不大) 每个主节点单独 bgSave,把 RDB 文件放到目标对应节点,启动加载;缺点:只能停机,无增量

三、迁移期间风险与优化(重点)

1. 性能影响

  • reshard 是逐个 key 迁移,大 key 会卡住迁移、拉高源节点 CPU;迁移前清理大 key

  • 不要在业务高峰做 reshard/rebalance;限速:RedisShake 支持 rps 限速

  • Redis 8.4+ 新增 ASM 原子槽迁移,速度提升几十倍、MOVED 重定向大幅减少,如果版本允许优先升级Redis

2. 客户端坑

  • 客户端必须支持集群路由,JedisCluster 容易踩坑,优先 Redisson

  • 迁移中遇到 ASK:临时导向目标;MOVED:槽永久归属变更,客户端更新 slot 映射表

  • 禁止 pipeline 跨迁移中的 slot,会报错

3. 监控指标(迁移时盯)

# 检查集群状态、槽是否ok
redis-cli --cluster check x.x.x.x:6379 -a xxx
# 看key数量对比
INFO keyspace
# 看迁移中的slot状态、主从延迟
CLUSTER INFO
INFO replication

告警:cluster_state:fail、unassigned_slots、主从延迟飙升

4. 迁移约束

  • HashTag {xxx} 的 key 都在同一个 slot,迁移时会整体搬走,符合预期

  • 迁移过程集群可读可写,但有短暂重定向开销;cluster-require-full-coverage no 保证部分槽迁移不影响其他分片

  • 集群迁移只迁移主节点数据,从节点由主节点复制同步,不需要单独迁移从

四、迁移后校验清单

  1. redis-cli --cluster check 全部 slot ok,无 unassigned、无 importing/migrating 状态

  2. 对比源 / 目标 INFO keyspace key 总数、过期 key 数量

  3. 抽样随机 key 校验值、TTL

  4. 业务侧接口回放、压测验证

五、方案选型对比

方案

适用场景

优点

缺点

redis-cli reshard/rebalance

同集群扩缩容、节点上下线

原生、无需额外组件、在线

只能同集群;大 key 迁移慢

RedisShake

跨集群、跨机房、云厂商迁移

全量 + 增量、零停机、支持过滤 key

需要额外部署工具,网络连通

RDB 离线导入

小数据、允许停机

简单稳定

停机、无法持续增量

六、生产避坑清单

  1. ❌ 不要在迁移过程中执行 flushall、keys *

  2. ❌ 不要同时并行多个 reshard 任务,容易造成 slot 混乱

  3. ❌ 跨集群迁移不要直接用 reshard,完全不生效

  4. ❌ 迁移前先备份 RDB,回滚兜底

  5. ❌ 网络抖动时迁移,容易出现 slot 卡住、集群 fail

  6. ✅ 迁移前先关闭 AOF rewrite(或者 no-appendfsync-on-rewrite yes)避免 IO 叠加


本文原创作者:易君召,详见:https://www.yijunzhao.cn/authors/yijunzhao,转载请注明出处。

原文链接 https://www.yijunzhao.cn/archives/redis-cluster-data-migration-two-major-scenarios

欢迎访问 小易撩挨踢

https://www.yijunzhao.cn/