同集群内部扩缩容(槽迁移 reshard/rebalance):集群内部新增 / 下线节点,移动哈希槽,原生能力、在线、业务低影响 ✅
跨集群迁移(A 集群 → B 集群):两套独立集群之间迁移,用 RedisShake(全量 + 增量,双写切流量,零停机)
核心原理:Redis Cluster 最小迁移单元是哈希槽(0~16383),不是单条 key;迁移过程会出现
ASK、MOVED重定向,客户端必须支持集群路由(Redisson、redis-cli -c)Redis
一、同集群扩容:添加节点 + reshard(最常用)
场景:3 主 3 从 → 4 主 4 从,新增主节点,把部分槽迁移给新主
步骤
启动新主节点(redis.conf 开启 cluster-enabled yes)
加入集群
# 把新master加入集群
redis-cli --cluster add-node 新IP:6379 集群任意节点IP:6379 -a xxx
查看 node-id
redis-cli -c -h 集群节点 -p 6379 -a xxx CLUSTER NODES
执行 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
自动均衡(推荐,比手动 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 自动把槽均匀分配给所有主节点,适合集群不均衡、新增节点后一键均衡
缩容(下线节点)
先把该主节点上所有槽全部迁移走(reshard 把槽迁回其他主)
槽全部迁移完成,集群 check 正常
删除节点
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]:两边无差异,可准备切换流量华为云
跨集群迁移流程(生产标准)
目标集群提前建好、配置相同(maxmemory、淘汰策略、持久化)
启动 RedisShake,全量 + 增量持续同步
双写校验阶段:业务同时写源 + 目标,对比 key 数量、采样校验
切流量:应用切到目标集群
观察一段时间,确认业务稳定,停止 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保证部分槽迁移不影响其他分片集群迁移只迁移主节点数据,从节点由主节点复制同步,不需要单独迁移从
四、迁移后校验清单
redis-cli --cluster check全部 slot ok,无 unassigned、无 importing/migrating 状态对比源 / 目标
INFO keyspacekey 总数、过期 key 数量抽样随机 key 校验值、TTL
业务侧接口回放、压测验证

五、方案选型对比
六、生产避坑清单
❌ 不要在迁移过程中执行 flushall、keys *
❌ 不要同时并行多个 reshard 任务,容易造成 slot 混乱
❌ 跨集群迁移不要直接用 reshard,完全不生效
❌ 迁移前先备份 RDB,回滚兜底
❌ 网络抖动时迁移,容易出现 slot 卡住、集群 fail
✅ 迁移前先关闭 AOF rewrite(或者 no-appendfsync-on-rewrite yes)避免 IO 叠加
本文原创作者:易君召,详见:https://www.yijunzhao.cn/authors/yijunzhao,转载请注明出处。
原文链接
欢迎访问 小易撩挨踢