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
迁移步骤
- 确认集群基线。
CLUSTER INFO看cluster_state:ok,CLUSTER NODES确认 16384 个槽全部有归属、没有残留的迁移标记。有未收尾的旧式迁移,先处理干净再开始。 - 选目标节点。按容量和分片键分布决定,尽量迁移连续的 slot range,减少客户端重定向表碎片。
- 排期。原子迁移消除了不可用窗口,但迁移本身仍要占用网络带宽与内存(序列化、传输、目标节点写入)。大批量槽分批迁,避开聚合查询高峰。
- 执行迁移,迁移过程中不要手工改槽表。
- 校验槽归属。三处对齐:目标节点
CLUSTER COUNTKEYSINSLOT的 key 数量与源节点迁移前的计数一致;CLUSTER SLOT-STATS中该槽的 key 数量落到新节点;CLUSTER NODES显示槽归属已切换。 - 确认复制与持久化。如果目标节点带副本,等副本追平再继续下一批;确认
appendonly状态与落盘完成,避免迁移刚结束就撞上重启。
回滚思路:原子操作失败时,槽保持原归属,不需要像旧流程那样手工 SETSLOT 收尾,也不会留下“数据在 A、槽在 B”的错位。已经成功但需要回退的迁移,按同样流程反向迁回即可;不要在迁移中途手工干预槽表,那会把一次原子操作拆成无法回退的中间态。
迁移期间的查询限制
迁移进行中执行下列命令,可能返回部分结果或重复:
FT.SEARCH、FT.AGGREGATE、FT.CURSOR、FT.HYBRIDTS.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。