Redis 集群架构
Redis 集群由多个主节点(Master)和对应的从节点(Replica)组成,每个节点负责存储部分数据(分片)。采用去中心化的分布式架构,通过分片 (Sharding) 实现数据的分布式存储。
集群架构不需要哨兵节点
特点
| 核心机制 | 技术实现 | 设计目标 |
|---|---|---|
| 分布式数据分片 | 采用 16384 Slot 哈希槽分区,数据按 CRC16(key) mod 16384 分配到不同节点 | 负载均衡 & 水平扩展 |
| 去中心化架构 | 节点间通过 Gossip 协议交换状态(PING/PONG),无单点依赖 | 高可用 & 故障自愈 |
| 主从复制模型 | 每个分片包含 1 主 N 从(建议至少 1 从),主节点故障时从节点自动晋升(Raft 选主) | 数据冗余 & 快速恢复 |
| 客户端重定向 | 客户端直连任意节点,若访问错误分片返回 MOVED 响应并重定向 | 降低代理层开销 |
数据分片
Redis 集群将整个数据空间划分为 16384 个哈希槽(编号 0~16383),每个槽对应一个数据分片。
- 哈希槽
分配算法:slot = CRC16(key) % 16384
定位节点
1. 客户端计算键的哈希槽
2. 查找槽所在节点
3. 直接连接对应节点操作数据
集群维护一个槽到节点的映射表(CLUSTER SLOTS 命令可查看),客户端根据槽号找到对应节点。
动态扩缩容
添加节点:新节点加入时,会从现有节点迁移部分哈希槽(如从 Node A 迁移 1000 个槽到 Node C)。
删除节点:将待删除节点的哈希槽重新分配到其他节点。
集群通信
Redis 集群使用 Gossip 协议传播节点状态信息(如新增节点、故障检测、槽迁移等)
- 每秒随机选择 5 个节点中最久未通信的节点进行 PING
- 携带自身和其他节点的状态信息
- 收到 PING 后回复 PONG 消息
| 消息类型 | 说明 |
|---|---|
| MEET | 手动触发新节点加入集群 |
| PING | 检测节点健康状态,节点定期交换元数据(如槽分配、IP 地址、端口) |
| PONG | 对 PING/MEET 的响应,节点定期交换元数据(如槽分配、IP 地址、端口) |
| FAIL | 广播故障节点信息,通知其他节点某节点已下线,触发故障转移 |
| PUBLISH | 发布订阅消息 |
故障恢复
1、故障检测
主观下线(PFail):节点 A 发现节点 B 超过 cluster-node-timeout 未响应,标记 B 为 PFail。


