综合 Redis 8.4 原子槽迁移:CLUSTER MIGRATION 与 CLUSTER SLOT-STATS 实操

2026-10-28 21:07:50

Redis 8.4 原子槽迁移:CLUSTER MIGRATION 与 CLUSTER SLOT-STATS 实操

Redis 8.4 于 2025-11-18 GA,构建在 8.2 之上。对集群运维影响最大的两项改动是 CLUSTER MIGRATION 与 CLUSTER SLOT-STATS:前者把槽迁移变成一次原子操作,后者让“哪个槽在消耗资源”变成可以直接查询的指标。

  • What's new in Redis 8.4:https://redis.io/docs/latest/develop/whats-new/8-4/
  • Release 8.4.0:https://github.com/redis/redis/releases/tag/8.4.0

CLUSTER MIGRATION:槽与数据一起搬

旧流程的槽迁移是分批的:源节点把槽标记为 MIGRATING,目标节点标记为 IMPORTING,然后按 key 逐个 MIGRATE,最后用 SETSLOT 收尾。整个过程横跨多条命令,槽在中间态停留的时间取决于 key 的数量和网络速度,客户端在这段时间里会遇到 ASK 重定向,甚至短暂不可用。

CLUSTER MIGRATION 把槽归属与槽上数据合并进一次原子操作:操作完成前后,槽要么完全属于源节点,要么完全属于目标节点,不存在中间态,也就没有那段不可用窗口。

CLUSTER SLOT-STATS:先定位热点槽

CLUSTER SLOT-STATS 按槽返回三项用量:key 数量、CPU 时间、网络 I/O。以前判断热点只能看 INFO 的节点级聚合指标,或者按 key 抽样反推;现在可以直接对齐到槽,迁移顺序也就能按实际负载排布——先迁低负载槽验证流程,再动热点槽。

# 按槽范围拉取用量
CLUSTER SLOT-STATS SLOTSRANGE 0 16383

# 反查某个 key 落在哪个槽,以及该槽的 key 数量
CLUSTER KEYSLOT order:2025-11-18
CLUSTER COUNTKEYSINSLOT 1234

迁移步骤

  1. 确认集群基线。CLUSTER INFO 看 cluster_state:ok,CLUSTER NODES 确认 16384 个槽全部有归属、没有残留的迁移标记。有未收尾的旧式迁移,先处理干净再开始。
  2. 选目标节点。按容量和分片键分布决定,尽量迁移连续的 slot range,减少客户端重定向表碎片。
  3. 排期。原子迁移消除了不可用窗口,但迁移本身仍要占用网络带宽与内存(序列化、传输、目标节点写入)。大批量槽分批迁,避开聚合查询高峰。
  4. 执行迁移,迁移过程中不要手工改槽表。
  5. 校验槽归属。三处对齐:目标节点 CLUSTER COUNTKEYSINSLOT 的 key 数量与源节点迁移前的计数一致;CLUSTER SLOT-STATS 中该槽的 key 数量落到新节点;CLUSTER NODES 显示槽归属已切换。
  6. 确认复制与持久化。如果目标节点带副本,等副本追平再继续下一批;确认 appendonly 状态与落盘完成,避免迁移刚结束就撞上重启。

回滚思路:原子操作失败时,槽保持原归属,不需要像旧流程那样手工 SETSLOT 收尾,也不会留下“数据在 A、槽在 B”的错位。已经成功但需要回退的迁移,按同样流程反向迁回即可;不要在迁移中途手工干预槽表,那会把一次原子操作拆成无法回退的中间态。

迁移期间的查询限制

迁移进行中执行下列命令,可能返回部分结果或重复:

  • FT.SEARCH、FT.AGGREGATE、FT.CURSOR、FT.HYBRID
  • TS.MGET、TS.MRANGE、TS.MREVRANGE、TS.QUERYINDEX

这些命令都是跨分片聚合:原子迁移保证了任一时刻槽只有一个归属,但一次查询在多个分片上并行执行时,不同分片可能分别看到迁移前和迁移后的视图,聚合结果就会偏。单 key 的读写不受影响。

处理方式有两种:把大迁移排在聚合查询低谷;或者接受部分结果,在消费端做去重与合并。搜索索引本身支持在原子槽迁移期间更新,不会因为迁移停止建索引。

8.4 的其他改动

  • 命令:DELEX、DIGEST;SET 增加原子 compare-and-set 与 compare-and-delete;MSETEX 一次设置多个 string key 并更新过期时间;XREADGROUP 新增 CLAIM 选项,可同时读取空闲 pending 与新到达的条目。
  • 查询引擎:FT.HYBRID 支持混合检索,用 RRF 与线性组合做融合打分;search-io-threads 配置集群协调的通信线程;search-on-oom 控制 OOM 期间查询行为(ignore / fail / partial results);search-default-scorer 把 BM25STD 设为文本与 tag 的默认打分器。
  • I/O 多线程:4 核缓存场景(10% SET、90% GET)吞吐提升超过 30%。
  • AOF:启动时自动修复损坏的 AOF 尾部,新增 aof-load-corrupt-tail-max-size 控制修复上限。
  • 性能细节:BITCOUNT 使用 AVX2/AVX512 popcount 与 Arm Neon;HyperLogLog 无分支比较与 Neon;VADD/VSIM 点积走 AVX2/AVX512;命令处理引入 lookahead 预取,默认值 16。
  • JSON:同构数组内存最多下降 92%。
  • 组件统一:RedisTimeSeries、RedisBloom、RediSearch 并入主线。

已知限制

  • 迁移进行中,上述 FT/TS 命令可能返回部分结果或重复(见上一节)。
  • FT.PROFILE、FT.EXPLAIN、FT.EXPLAINCLI 不包含 FT.HYBRID 选项。
  • FT.HYBRID 的指标不出现在 FT.INFO 与 INFO 中。
  • FT.HYBRID 暂不支持 EXPLAINSCORE、SHARD_K_RATIO、YIELD_DISTANCE_AS、WITHCURSOR。
  • COMBINE 之后用 FILTER 做后置过滤不受支持。
  • FT.HYBRID 的默认响应格式只包含 key_id 与 score。
复制全文 生成海报 Redis 集群 运维 槽迁移

推荐文章

程序员茄子在线接单