首页 > 项目 > 当前页面

Redis 集群模式如何实现渐进式扩容?

2026-06-14 NEW个对象

📌 Redis 集群模式如何实现渐进式扩容?

1️⃣ 问题背景

随着业务规模增长,Redis 单机或者固定规模的 Redis Cluster 往往会面临存储容量不足、CPU 压力增大以及网络带宽瓶颈等问题。

例如一个电商系统最初部署了 3 主 3 从集群,能够支撑 5000 万用户数据。当业务增长到数亿级用户后,单个节点的内存逐渐接近上限,此时就需要扩容。

如果采用传统数据库的扩容方式,通常需要停机迁移数据,而 Redis Cluster 设计之初就考虑到了在线扩容问题,因此支持渐进式扩容(Online Resharding)

Redis 集群最大的特点是:

Redis Cluster 扩容时不需要停机,也不需要一次性迁移全部数据,而是通过 Slot 槽位迁移实现平滑扩容。

2️⃣ 核心原理

Redis Cluster 并不是简单地按照 Key 进行分片,而是引入了 Hash Slot 的概念。

整个 Redis Cluster 固定划分为:

16384 个 Hash Slot

所有 Key 通过 CRC16 算法计算后映射到 16384 个槽位中的某一个。

计算公式:

slot = CRC16(key) % 16384

例如:

  • 用户A → Slot 5000
  • 用户B → Slot 12000
  • 订单A → Slot 3000

Redis 集群扩容时,并不是迁移整个节点的数据,而是迁移部分 Slot。

因此:

新增节点后,只需要把部分 Slot 从旧节点迁移到新节点即可完成扩容。

3️⃣ 数据结构分析

Redis Cluster 的核心数据结构是 Slot 映射表。

节点 负责槽位
Master1 0 ~ 5460
Master2 5461 ~ 10922
Master3 10923 ~ 16383

扩容前:

16384 Slot Master1 → 5461 Master2 → 5462 Master3 → 5461

新增 Master4 后:

Master1 → 4096 Master2 → 4096 Master3 → 4096 Master4 → 4096

本质就是重新分配 Slot。

4️⃣ 算法分析

Redis 集群扩容采用 Slot 迁移算法。

迁移步骤如下:

  1. 新增 Redis 节点
  2. 节点加入 Cluster
  3. 重新计算 Slot 分布
  4. 迁移部分 Slot
  5. 同步迁移对应 Key
  6. 更新 Slot 路由表

假设新增一个节点:

Master1 Master2 Master3 ↓ Master1 Master2 Master3 Master4

Redis 会将部分 Slot 从旧节点迁移到新节点。

迁移过程中采用:

  • MIGRATING 状态
  • IMPORTING 状态
  • ASK 重定向机制

保证业务不中断。

5️⃣ 执行流程

扩容流程图

新增节点

cluster meet 加入集群

分配 Slot

源节点进入 MIGRATING 状态

目标节点进入 IMPORTING 状态

迁移 Key 数据

更新 Slot 所属关系

迁移完成

整个过程业务仍然正常运行。

客户端访问过程中如果访问到迁移中的 Slot:

ASK slot target-node

客户端收到 ASK 指令后会自动重定向到新的节点。

6️⃣ 实际案例

假设电商系统部署:

节点 内存 使用率
Master1 32G 90%
Master2 32G 88%
Master3 32G 92%

此时新增一台 32G Redis:

redis-server redis.conf cluster meet

加入集群后执行:

redis-cli --cluster reshard

迁移约 4096 个 Slot 到新节点。

最终四个节点平均承担数据压力。

7️⃣ 优缺点分析

✅ 优点

  • 无需停机
  • 支持在线扩容
  • 数据迁移粒度小
  • 业务无感知
  • 支持水平扩展
  • 容量近乎无限增长

❌ 缺点

  • 迁移期间存在网络开销
  • 大量 Slot 迁移耗时较长
  • 迁移过程中性能略有下降
  • 客户端必须支持 ASK/MOVED 重定向

8️⃣ 面试常见问题

Redis Cluster 为什么能在线扩容?

因为 Redis 将数据划分为 16384 个 Slot,扩容时迁移 Slot 即可,不需要整体迁移节点数据。

Redis 扩容迁移的是数据还是 Slot?

本质迁移的是 Slot,Slot 对应的数据会跟随迁移。

迁移期间客户端访问怎么办?

Redis 通过 ASK 重定向机制自动引导客户端访问新的节点。

为什么是 16384 个槽位?

16384 = 214,在内存占用和寻址效率之间取得平衡,同时能够通过 Bitmap 高效表示 Slot 分布。

扩容时会影响业务吗?

理论上不会中断业务,但迁移期间会消耗部分网络和 CPU 资源,因此通常选择业务低峰期进行扩容。

Redis Cluster 为什么不用一致性 Hash?

一致性 Hash 在节点变更时需要重新计算大量映射关系,而 Slot 模型只需要迁移部分 Slot,管理更加简单。

9️⃣ 总结

Redis Cluster 渐进式扩容的核心思想是:固定 16384 个 Hash Slot,通过 Slot 迁移实现在线扩容。

扩容流程:

新增节点 → 加入集群 → 重新分配 Slot → 迁移 Key → 更新路由 → 扩容完成。

本质上迁移的不是整个节点的数据,而是 Slot 所有权。

正因为有了 Hash Slot、MIGRATING、IMPORTING、ASK/MOVED 重定向机制,Redis Cluster 才能够做到不停机扩容和渐进式数据迁移,这是 Redis 支撑亿级数据规模的重要基础能力之一。

相关文章

NEW个对象 NEW个对象
JAVA是世界上最好的语言