Redis集群扩容时如何进行数据迁移?读写请求如何保证不丢失?
🚀 Redis集群扩容时如何进行数据迁移?读写请求如何保证不丢失?
Redis Cluster扩容的本质是Slot迁移。当新机器加入集群时,需要将部分Hash Slot从旧节点迁移到新节点。在迁移过程中必须保证数据不丢失、服务不中断、读写请求正常执行。因此需要设计迁移状态管理、请求重定向机制、双写保护机制以及最终一致性校验机制。
1️⃣ 问题背景
在互联网系统发展过程中,Redis集群容量并不是一次性规划完成的。
随着业务增长:
- 缓存数据越来越大
- 访问流量越来越高
- 热点Key越来越多
- 单节点CPU持续升高
- 内存接近瓶颈
此时必须对Redis集群进行扩容。
例如:
Node2
Node3
每个节点负责部分Slot。
当增加Node4时:
Node2
Node3
Node4
此时必须将部分数据迁移到Node4。
2️⃣ 核心原理
Redis Cluster采用16384个Hash Slot实现数据分片。
每个Key都会映射到某个Slot:
%
16384
例如:
user:1002 → Slot2000
user:1003 → Slot3000
假设:
Node2 → Slot5001~10000
Node3 → Slot10001~16383
新增Node4后:
Node2 → Slot4001~8000
Node3 → Slot8001~12000
Node4 → Slot12001~16383
因此Redis扩容实际上是Slot迁移。
3️⃣ 数据结构分析
Redis Cluster元数据
IP
Port
Master节点
Slave节点
Slot范围
Slot状态
迁移过程中Slot存在三种状态:
| 状态 | 说明 |
|---|---|
| NORMAL | 正常状态 |
| MIGRATING | 迁出状态 |
| IMPORTING | 迁入状态 |
迁移期间Redis通过状态控制读写请求路由。
Slot映射表
slot 1001 → Node1
slot 1002 → Node1
迁移完成后:
slot 1001 → Node4
slot 1002 → Node4
4️⃣ 算法分析
Slot迁移算法
Redis采用渐进式迁移。
而不是:
因为这种方式业务不可接受。
Redis实际执行:
↓
扫描Key
↓
批量迁移Key
↓
更新Slot归属
↓
继续迁移下一批
MIGRATE命令
目标IP
目标PORT
KEY
TIMEOUT
Redis内部会完成:
- 序列化Key
- 发送网络数据
- 目标节点反序列化
- 删除原节点数据
时间复杂度
N表示迁移Key数量。
因此大规模迁移必须采用分批执行策略。
5️⃣ 执行流程
Redis官方迁移流程
↓
建立Cluster连接
↓
选择迁移Slot
↓
Node1标记MIGRATING
↓
Node4标记IMPORTING
↓
迁移Slot内Key
↓
更新Slot归属
↓
广播Cluster节点
↓
迁移完成
读请求处理
迁移过程中:
客户端访问旧节点:
如果数据已经迁移:
客户端自动重试新节点。
因此用户无感知。
写请求处理
写请求更加复杂。
↓
旧节点判断Slot状态
↓
ASK重定向
↓
客户端写入新节点
↓
返回成功
Redis通过ASK机制保证迁移期间写请求正确路由。
6️⃣ 实际案例
如果让我设计扩容方案
官方方案可以工作。
但在超大规模场景下仍有优化空间。
第一阶段:双写模式
↓
同步写Node4
所有新数据同时写入两套节点。
保证迁移过程中数据不丢失。
第二阶段:后台迁移历史数据
↓
批量复制
↓
校验数据完整性
第三阶段:灰度切流
↓
10%流量
↓
30%流量
↓
50%流量
↓
100%流量
逐步验证系统稳定性。
第四阶段:停止双写
↓
切换Slot归属
↓
关闭双写
实现平滑扩容。
7️⃣ 优缺点分析
| 方案 | 优点 | 缺点 |
|---|---|---|
| Redis官方迁移 | 简单稳定 | 迁移耗时 |
| 双写迁移 | 数据安全 | 实现复杂 |
| 停机迁移 | 实现简单 | 不可用 |
| 灰度迁移 | 风险最低 | 周期较长 |
8️⃣ 面试常见问题
Redis Cluster为什么采用16384个Slot?
16384能够兼顾内存占用与数据均衡,同时降低集群元数据同步成本。
迁移期间请求会失败吗?
不会。
Redis通过ASK与MOVED重定向机制自动路由请求。
MOVED和ASK有什么区别?
ASK → 临时迁移
如何避免迁移过程中数据丢失?
- 双写机制
- 增量同步
- 灰度切换
- 数据校验
- 最终一致性检查
如果你设计Redis扩容系统怎么做?
面试最佳答案:
9️⃣ 总结
✅ Redis Cluster扩容本质是Hash Slot迁移。
✅ 官方通过MIGRATING、IMPORTING、ASK、MOVED机制实现在线迁移。
✅ 迁移过程中读请求通过重定向访问新节点。
✅ 写请求通过ASK机制路由到正确节点。
✅ 大型互联网公司通常会增加双写、灰度发布、增量同步、数据校验等机制提升扩容安全性。
✅ 面试中如果讨论架构设计,最佳方案通常是:
↓
双写保护
↓
历史数据迁移
↓
增量同步
↓
灰度切流
↓
数据校验
↓
关闭双写
↓
扩容完成
这也是大型互联网平台实现Redis无损扩容和在线迁移最常见的架构设计思路。
相关文章
-
Redis大Key危害以及解决方案?
Redis大Key危害以及解决方案?
NEW个对象 2025-02-11
-
Redis删除过期key的策略
Redis删除过期key的策略有三种
NEW个对象 2024-10-22
-
Redis Slot迁移时需要写多少个迁移命令?底层原理全解析
Redis Cluster Slot迁移并不是“一条命令迁移一个Slot”,而是“以Key为粒度进行迁移”。因此迁移命令数量本质上等于Slot内Key的数量(通常按批次拆分执行)。Slot只是逻辑映射单位,真正搬迁的是Key。
NEW个对象 2026-06-09