首页 > 项目 > 当前页面

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无损扩容和在线迁移最常见的架构设计思路。

相关文章

  • MySQL 大表治理——三分钟面试标准回答

    小数据量采用分批 DELETE,大数据量采用在线迁移,长期采用分区归档,历史数据采用冷热分离。真正的大表治理不是删除数据,而是构建完整的数据生命周期管理体系。

    NEW个对象 2026-06-28

  • for循环执行流程

    这也是一个笔试题,也是一道即便再复习两年也不会复习到点。

    NEW个对象 2025-01-13

  • 什么是流量削峰?高并发系统中的核心保护机制详解

    在互联网系统中,绝大部分时间系统流量都处于平稳状态,但在某些特殊场景下会突然出现流量激增。例如秒杀活动、双十一购物节、春节红包雨、明星直播带货、热门新闻发布等场景,大量用户会在极短时间内同时访问系统。在互联网系统中,绝大部分时间系统流量都处于平稳状态,但在某些特殊场景下会突然出现流量激增。例如秒杀活动、双十一购物节、春节红包雨、明星直播带货、热门新闻发布等场景,大量用户会在极短时间内同时访问系统。

    NEW个对象 2026-06-12

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