首页 > Redis > 当前页面

Redis集群扩容时如何进行数据迁移?读写请求如何保证不丢失?

2026-06-09 NEW个对象

🚀 Redis集群扩容时如何进行数据迁移?读写请求如何保证不丢失?

📌 核心结论:
Redis Cluster扩容的本质是Slot迁移。当新机器加入集群时,需要将部分Hash Slot从旧节点迁移到新节点。在迁移过程中必须保证数据不丢失、服务不中断、读写请求正常执行。因此需要设计迁移状态管理、请求重定向机制、双写保护机制以及最终一致性校验机制。

1️⃣ 问题背景

在互联网系统发展过程中,Redis集群容量并不是一次性规划完成的。

随着业务增长:

  • 缓存数据越来越大
  • 访问流量越来越高
  • 热点Key越来越多
  • 单节点CPU持续升高
  • 内存接近瓶颈

此时必须对Redis集群进行扩容。

例如:

Node1
Node2
Node3

每个节点负责部分Slot。

当增加Node4时:

Node1
Node2
Node3
Node4

此时必须将部分数据迁移到Node4。

⚠️ Redis扩容最大的挑战并不是数据复制,而是在迁移过程中如何保证业务请求不中断。

2️⃣ 核心原理

Redis Cluster采用16384个Hash Slot实现数据分片。

每个Key都会映射到某个Slot:

CRC16(Key)
%
16384

例如:

user:1001 → Slot1000
user:1002 → Slot2000
user:1003 → Slot3000

假设:

Node1 → Slot0~5000
Node2 → Slot5001~10000
Node3 → Slot10001~16383

新增Node4后:

Node1 → Slot0~4000
Node2 → Slot4001~8000
Node3 → Slot8001~12000
Node4 → Slot12001~16383

因此Redis扩容实际上是Slot迁移。

✅ Redis迁移的是Slot而不是整个节点数据。

3️⃣ 数据结构分析

Redis Cluster元数据

NodeId
IP
Port
Master节点
Slave节点
Slot范围

Slot状态

迁移过程中Slot存在三种状态:

状态 说明
NORMAL 正常状态
MIGRATING 迁出状态
IMPORTING 迁入状态

迁移期间Redis通过状态控制读写请求路由。

Slot映射表

slot 1000 → Node1
slot 1001 → Node1
slot 1002 → Node1

迁移完成后:

slot 1000 → Node4
slot 1001 → Node4
slot 1002 → Node4

4️⃣ 算法分析

Slot迁移算法

Redis采用渐进式迁移。

而不是:

停止服务 → 整体复制 → 启动服务

因为这种方式业务不可接受。

Redis实际执行:

选中Slot

扫描Key

批量迁移Key

更新Slot归属

继续迁移下一批

MIGRATE命令

MIGRATE
目标IP
目标PORT
KEY
TIMEOUT

Redis内部会完成:

  • 序列化Key
  • 发送网络数据
  • 目标节点反序列化
  • 删除原节点数据

时间复杂度

O(N)

N表示迁移Key数量。

因此大规模迁移必须采用分批执行策略。

5️⃣ 执行流程

Redis官方迁移流程

新增Node4

建立Cluster连接

选择迁移Slot

Node1标记MIGRATING

Node4标记IMPORTING

迁移Slot内Key

更新Slot归属

广播Cluster节点

迁移完成

读请求处理

迁移过程中:

客户端访问旧节点:

GET user:1001

如果数据已经迁移:

ASK 127.0.0.1:7004

客户端自动重试新节点。

因此用户无感知。

写请求处理

写请求更加复杂。

客户端写入

旧节点判断Slot状态

ASK重定向

客户端写入新节点

返回成功

Redis通过ASK机制保证迁移期间写请求正确路由。

6️⃣ 实际案例

如果让我设计扩容方案

官方方案可以工作。

但在超大规模场景下仍有优化空间。

第一阶段:双写模式

写Node1

同步写Node4

所有新数据同时写入两套节点。

保证迁移过程中数据不丢失。

第二阶段:后台迁移历史数据

历史数据扫描

批量复制

校验数据完整性

第三阶段:灰度切流

1%流量

10%流量

30%流量

50%流量

100%流量

逐步验证系统稳定性。

第四阶段:停止双写

校验成功

切换Slot归属

关闭双写

实现平滑扩容。

7️⃣ 优缺点分析

方案 优点 缺点
Redis官方迁移 简单稳定 迁移耗时
双写迁移 数据安全 实现复杂
停机迁移 实现简单 不可用
灰度迁移 风险最低 周期较长

8️⃣ 面试常见问题

Redis Cluster为什么采用16384个Slot?

16384能够兼顾内存占用与数据均衡,同时降低集群元数据同步成本。

迁移期间请求会失败吗?

不会。

Redis通过ASK与MOVED重定向机制自动路由请求。

MOVED和ASK有什么区别?

MOVED → 永久迁移
ASK → 临时迁移

如何避免迁移过程中数据丢失?

  • 双写机制
  • 增量同步
  • 灰度切换
  • 数据校验
  • 最终一致性检查

如果你设计Redis扩容系统怎么做?

面试最佳答案:

先通过一致性Hash或Slot重新规划数据分布,然后采用双写加增量同步方式完成历史数据迁移,迁移期间通过灰度流量切换逐步验证新节点稳定性,最后更新路由表并关闭双写机制,从而实现业务无感知扩容。

9️⃣ 总结

✅ Redis Cluster扩容本质是Hash Slot迁移。

✅ 官方通过MIGRATING、IMPORTING、ASK、MOVED机制实现在线迁移。

✅ 迁移过程中读请求通过重定向访问新节点。

✅ 写请求通过ASK机制路由到正确节点。

✅ 大型互联网公司通常会增加双写、灰度发布、增量同步、数据校验等机制提升扩容安全性。

✅ 面试中如果讨论架构设计,最佳方案通常是:

新增节点

双写保护

历史数据迁移

增量同步

灰度切流

数据校验

关闭双写

扩容完成

这也是大型互联网平台实现Redis无损扩容和在线迁移最常见的架构设计思路。

相关文章

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