Redis Cluster实战复盘:分片倾斜、槽位迁移失败、热点副本、集群雪崩彻底解决
Redis Cluster实战复盘:分片倾斜、槽位迁移失败、热点副本、集群雪崩彻底解决
前言
随着业务规模增长,单个 Redis 实例往往无法满足高并发、大容量和高可用需求。
Redis Cluster 常被用于解决:
- 数据分片
- 水平扩展
- 故障转移
- 读写分离
- 高可用部署
- 大容量缓存
- 跨节点数据分布
但 Redis Cluster 并不是简单地把多个 Redis 节点拼起来。
如果分片设计、槽位迁移、副本配置或热点处理不合理,也会出现严重线上故障:
- 16384 个槽位分布不均
- 某个节点承担过多 Key
- 主节点内存持续上涨
- 从节点复制延迟
- 槽位迁移失败
- 热点 Key 集中在少数分片
- 故障转移后雪崩扩散
本文基于真实 Redis Cluster 集群故障,完整分析分片倾斜、槽位迁移失败、热点副本和集群雪崩问题。

一、真实线上故障场景还原
1.1 业务背景
某电商平台使用 Redis Cluster 承载商品缓存、活动配置、库存扣减、用户会话等核心数据。
集群规模:
- 6 个主节点
- 每个主节点 1 个从节点
- 共 12 个 Redis 实例
- 负责多个业务缓存 Key
上线初期运行稳定,但随着活动数据增加,集群开始出现异常。
1.2 故障现象
某天大促活动开始后,Redis Cluster 出现以下问题:
- 某个主节点内存持续升高
- 该节点 CPU 升高
- 部分接口响应变慢
- 缓存查询超时增加
- 数据库查询压力上升
- 集群槽位分布不均匀
- 手动迁移槽位失败
高峰期出现服务雪崩
1.3 初步排查
排查发现:
- 某个主节点占用内存远高于其他节点
- 大量商品缓存 Key 集中在该节点
- 活动配置 Key 数量快速增长
- 该节点从节点复制延迟增加
- 槽位迁移命令执行失败
客户端报错 MOVED 或 ASK
二、Redis Cluster 分片倾斜为什么会导致雪崩
2.1 16384 个槽位分布不均
Redis Cluster 使用 16384 个哈希槽。
Key 通过 CRC16 计算后映射到某个槽位:
text
HASH_SLOT = CRC16(key) % 16384
如果集群中某个主节点负责的槽位或 Key 数量明显过多,就会出现分片倾斜。
2.2 单个节点内存被打爆
分片倾斜后,某个主节点可能存储大量 Key。
例如:
text
主节点 A:负责 8000 个槽位
主节点 B:负责 4000 个槽位
主节点 C:负责 4384 个槽位
实际业务中,如果大量 Key 集中到同一个节点,该节点会出现:
- 内存持续增长
- RDB 文件变大
- 持久化变慢
- 主从复制延迟
- 重启恢复时间变长
快照生成占用资源
2.3 单节点 CPU 压力集中
即使内存没有完全打爆,如果大量读写请求集中到少数节点,也会导致:
- 该节点 CPU 升高
- 查询延迟增加
- 命令排队
- 超时重试增加
- 服务层线程等待
数据库压力上升
2.4 槽位迁移失败影响扩容
当发现分片倾斜后,通常会尝试迁移槽位。
但迁移过程中可能遇到:
- 槽位中 Key 数量过多
- 迁移时间过长
- 客户端重定向异常
- 源节点压力升高
- 目标节点接收失败
- 迁移中途中断
集群状态不一致
2.5 热点副本风险
如果某个主节点故障,从节点会升级为主节点。
但如果该从节点本身复制延迟高、内存压力大、Key 数量多,故障转移后可能继续成为瓶颈。
三、Redis Cluster 常见故障场景
3.1 分片不均衡
现象:
text
节点 A:8000 个槽位
节点 B:4000 个槽位
节点 C:4384 个槽位
原因:
- 初始分配不合理
- 扩容时没有重新分布槽位
- 大量 Key 集中到固定标签
Key 哈希分布异常
3.2 大 Key 集中
现象:
text
product:detail:10001
activity:config:20250602
stock:seckill:10001
某个大 Key 或热点 Key 占用大量内存和 CPU。
3.3 槽位迁移失败
现象:
text
CLUSTER FAILOVER
CLUSTER ADDSLOTS
CLUSTER DELSLOTS
CLUSTER SETSLOT
执行失败或卡住。
原因:
- 槽位中 Key 数量太多
- 源节点压力过高
- 目标节点资源不足
- 集群状态异常
客户端持续请求影响迁移
3.4 主从复制延迟
现象:
text
replicaof
master_link_down_since_seconds
从节点复制延迟增加。
原因:
- 主节点写入压力大
- 网络带宽不足
- 从节点资源不足
- RDB 生成时间长
磁盘 IO 慢
3.5 故障转移后雪崩
现象:
- 主节点故障
- 从节点升级
- 升级后仍然压力大
- 新主节点继续延迟
集群整体性能下降
四、Redis Cluster 核心排查命令
4.1 查看集群节点
bash
redis-cli cluster nodes
4.2 查看集群信息
bash
redis-cli cluster info
4.3 查看槽位分布
bash
redis-cli cluster slots
4.4 查看 Key 数量
bash
redis-cli dbsize
4.5 查看内存信息
bash
redis-cli info memory
4.6 查看复制信息
bash
redis-cli info replication
4.7 查看统计信息
bash
redis-cli info stats
4.8 查看慢日志
bash
redis-cli slowlog get 10
4.9 扫描大 Key
bash
redis-cli --bigkeys
4.10 扫描热点 Key
bash
redis-cli --hotkeys
五、分片倾斜解决方案
方案一:均衡分配槽位
在创建集群时,尽量让每个主节点负责的槽位数量接近。
例如:
text
3 主节点:每个节点约 5461 个槽位
6 主节点:每个节点约 2730 个槽位
避免出现某个节点负责过多槽位。
方案二:合理选择分片键
业务 Key 设计会直接影响分布。
不推荐:
text
product:detail:10001
如果某些商品热度极高,仍然可能集中。
可考虑增加业务前缀或哈希后缀:
text
product:detail:{10001}:{tag}
product:detail:{10001}:{shard}
但需要根据业务复杂度权衡。
方案三:拆分大 Key
如果某个 Key 特别大,应考虑拆分。
例如:
text
activity:config:20250602
拆成:
text
activity:config:20250602:banner
activity:config:20250602:rule
activity:config:20250602:stock
方案四:热点 Key 副本
对于热点 Key,可以设置多个副本 Key。
例如:
text
product:detail:10001:0
product:detail:10001:1
product:detail:10001:2
product:detail:10001:3
读取时随机选择一个副本 Key。
方案五:本地缓存保护
对于超高热点数据,服务层使用本地缓存。
例如:
text
Caffeine Cache
Guava Cache
Ehcache
减少 Redis Cluster 访问压力。
方案六:分批迁移槽位
如果槽位分布不均,不要一次性迁移大量槽位。
应分批迁移:
text
先迁移 100 个槽位
观察节点压力
再迁移 200 个槽位
观察延迟
继续迁移剩余槽位
方案七:扩容后重新平衡
当集群容量不足时,应及时扩容。
扩容后需要重新平衡槽位分布。
六、生产级 Redis Cluster 配置建议
6.1 主从节点比例
建议:
text
每个主节点配置 1 个从节点
如果对读扩展要求高,可以配置多个从节点。
但从节点过多也会增加复制压力。
6.2 节点规格统一
尽量保证:
- CPU 规格接近
- 内存规格接近
- 磁盘规格接近
- 网络带宽接近
- 部署环境接近
避免出现“弱节点”拖垮整个集群。
6.3 分片键设计
推荐:
- 稳定分片键
- 分布均匀
- 避免固定热点
- 便于扩容
便于迁移
6.4 过期时间分散
避免大量 Key 同时过期。
不推荐:
text
所有商品缓存统一 30 分钟后过期
推荐增加随机偏移:
text
30分钟 ± 5分钟
6.5 大 Key 治理
对大 Key 进行:
- 识别
- 拆分
- 压缩
- 本地缓存
- 副本分散
定期清理
6.6 热点 Key 治理
对热点 Key 进行:
- 热点识别
- 副本分散
- 本地缓存
- 限流保护
异步刷新
七、企业级 Redis Cluster 故障排查流程
7.1 第一步:确认集群状态
bash
redis-cli cluster info
redis-cli cluster nodes
7.2 第二步:查看槽位分布
bash
redis-cli cluster slots
7.3 第三步:查看内存和 Key 数量
bash
redis-cli info memory
redis-cli dbsize
7.4 第四步:识别大 Key
bash
redis-cli --bigkeys
7.5 第五步:识别热点 Key
bash
redis-cli --hotkeys
7.6 第六步:查看复制状态
bash
redis-cli info replication
7.7 第七步:查看慢日志
bash
redis-cli slowlog get 10
7.8 第八步:评估迁移风险
- 节点当前 CPU
- 节点当前内存
- 槽位 Key 数量
- 客户端请求压力
迁移时间窗口
7.9 第九步:分批迁移槽位
不要在高峰期执行大规格迁移。
7.10 第十步:观察恢复情况
迁移后继续观察:
- 内存分布
- CPU 分布
- 复制延迟
- 慢日志
- 接口响应
错误日志
八、总结
Redis Cluster 不是简单的多节点 Redis,它的风险主要来自:
- 分片倾斜
- 大 Key 集中
- 热点 Key 集中
- 槽位迁移失败
- 主从复制延迟
- 故障转移后雪崩
生产环境核心准则:
- 槽位必须均衡
- 大 Key 必须治理
- 热点 Key 必须保护
- 扩容必须重新平衡
- 迁移必须分批进行
- 故障转移必须提前演练
核心口诀:集群不是越多越稳,分片均衡、热点治理、故障隔离才是稳定的基础。
版权与友链信息
版权归属:凡尘
友情链接:凡尘博客 fanchenblog.com、wz.fanchenblog.com、雨落凡尘博客 b.fanchenblog.com、t.fanchenblog.com、凡尘乡音 y.fanchenblog.com、凡尘影院 a.fanchenblog.com