Redis 8.4 Atomic Slot Migration:把 Slot 迁移从「逐 Key 搬迁」改成整槽复制 + 原子交接
Redis Cluster 用 16384 个 hash slot 分配数据,每个节点负责其中若干 slot。扩缩容、热点再均衡,最后都落到迁 slot 上。Redis 8.4 引入的 ASM(Atomic Slot Migration)改的是这一步的执行语义,配套新增 CLUSTER MIGRATION 命令族,把迁槽变成可发起、可查询、可取消的标准运维动作。
旧路径:IMPORTING / MIGRATING + GETKEYSINSLOT + MIGRATE
传统做法是「逐 Key 搬迁、边迁边切」:
- 目标节点把某个 slot 标记为
IMPORTING - 源节点把该 slot 标记为
MIGRATING CLUSTER GETKEYSINSLOT分批取出该 slot 下的 Key- 用
MIGRATE一批批迁到目标节点 - 重复直到搬空
- 最后切换 slot 所有权
问题在于迁移期间同一个 slot 长期处于「部分 Key 已迁、部分 Key 未迁」的中间态,并且这个中间态直接暴露给客户端:
- 客户端要处理迁移重定向(
ASK/TRYAGAIN),请求链路变长、往返增加、延迟不稳定 - 多 Key 操作在迁移期间可能临时不可用
- 迁移失败(目标内存不足、
MIGRATE超时、网络抖动)会留下半完成状态,需要人工排查 - 逐 Key 迁移有大量 per-key overhead
- 大 Key 迁移容易制造尾延迟尖峰
ASM 改了什么
ASM 把执行语义换成「先把整个 Slot 的数据复制到目标节点,再在一个极短的窗口内完成所有权切换」,不再长期暴露中间态。新增的 CLUSTER MIGRATION 命令族,把 slot 迁移抽象成标准化的集群运维动作:可发起、可查询状态、可取消。
七步流程
- 目标节点发起迁移请求
- 目标节点建立迁移任务与专用复制连接
- 源节点开始发送 Slot 快照(对大对象自动切换到类似 AOF chunk 的分段传输)
- 目标节点一边应用快照,一边追平增量写入(先尽量追平,而不是边迁边切)
- 进入极短暂停写窗口,完成 Atomic Handoff 原子交接(停写相关 slot、同步最后增量、通知接管)
- 目标节点正式接管 Slot 所有权
- 源节点后台清理旧数据
CLUSTER MIGRATION 命令族
CLUSTER MIGRATION ... # 发起
(查询迁移状态) # 任务化、可观测
CLUSTER MIGRATION CANCEL # 取消
大 Key 与旧数据清理
大 Key 不整块搬运:第 3 步里源节点对这类对象自动切换到类似 AOF chunk 的分段传输,避免单个大对象造成延迟尖峰。
第 7 步的旧数据清理尽量走异步;但有两种情况会回退到主线程 cron loop 做增量清理:
- 模块不支持 per-slot 数据结构
- 开启了
CLIENT TRACKING
效果
- 迁移速度相比传统方式最高可提升约 30 倍
- 客户端重定向几乎可以忽略
- 更平滑:改善的是尾延迟,不只是平均值
Valkey 9.0 的同类能力
Valkey 9.0(2025-10 GA)也引入了 Atomic Slot Migration:不再是 key-by-key,而是整 slot 一次迁移,用 AOF 格式原子移动;可以发送集合里的单个元素而不是整个 key,从而避免大集合在迁移时造成延迟尖峰。move-then-delete 针对整个 slot,原节点在整 slot 迁移完成前保留所有数据,避免旧版的重定向或重试问题。
Valkey Module 必须显式 opt-in 支持 ASM,否则加载了不支持 ASM 的模块的集群会禁用该特性。
项目信息
- Redis 8.4 Atomic Slot Migration:https://www.itbigtec.com/redis-8-4-atomic-slot-migration-part1/
- Valkey 9.0 发布说明:https://valkey.io/blog/introducing-valkey-9/