Redis 高可用实战源码解析(Sentinel + Cluster 整合应用)

1. 前言
Redis 高可用体系主要包括两个部分:
- Redis Sentinel:哨兵机制,监控、自动故障转移。
- Redis Cluster:分布式集群,数据分片与自动路由。
在生产环境中,Redis 高可用方案通常结合 复制、持久化、内存优化,保证系统稳定运行。
2. Sentinel 哨兵机制
2.1 哨兵职责
- 监控:定期向 Master/Slave 发送 PING,检查存活状态
- 通知:Master 故障时通知其他 Sentinel 和客户端
- 故障转移:选举新的 Master 并让 Slave 复制到新 Master
- 配置提供者:客户端可通过 Sentinel 获取 Master 地址
2.2 哨兵源码核心
sentinel.c
:核心循环,事件驱动,类似 Redis 主线程sentinel_monitor.c
:管理被监控的 Redis 实例sentinel_failover.c
:故障转移逻辑
核心事件循环
c
while (!sentinelShutdown) {
aeProcessEvents(sentinelEventLoop);
sentinelCheckConfig();
sentinelCheckFailoverState();
}
故障判定流程
- Sentinel 检测 Master 不可达
- Sentinel 进入 subjectively down (SDOWN) 状态
- 多个 Sentinel 交互判断 Master objectively down (ODOWN)
- 触发 故障转移
故障转移流程
c
void sentinelFailoverStateWaitStart() {
electSlaveAsMaster();
promoteSlaveToMaster();
reconfigureOtherSlaves();
updateClients();
}
3. Redis Cluster 集群机制
3.1 集群特点
- 数据分片:使用 16384 个 hash slot 分布到节点
- 自动路由:客户端根据 key hash 自动路由到对应节点
- 高可用:每个节点有从节点备份
3.2 源码核心
cluster.c
:集群状态机、节点管理cluster.c
中关键结构:
c
typedef struct clusterNode {
char name[40];
int flags;
int slots[16384/8]; // hash slot bitmap
int numslots;
struct clusterNode *slaveof;
} clusterNode;
typedef struct clusterState {
clusterNode *myself;
clusterNode **nodes;
int state; // ok / fail / handshake
} clusterState;
3.3 节点状态切换
- FAIL:节点不可用
- PFAIL:节点疑似不可用
- HANDSHAKE:节点加入时的握手状态
4. 高可用整合应用
4.1 数据复制 + 持久化
- Master 节点通过 RDB/AOF 持久化数据
- Slave 节点通过 PSYNC 完成复制
- Sentinel 监控 Master 状态,并在 Master 故障时触发 Slave 升级
4.2 内存优化支撑
- Jemalloc + LRU/LFU 避免主节点内存溢出
- 惰性删除和后台释放保证故障转移期间不阻塞主线程
4.3 整个高可用链路
text
客户端写命令
↓
Master 写入内存 + AOF
↓
Slave 异步复制
↓
Sentinel 监控节点状态
↓
Master 故障 → Sentinel 选举新 Master
↓
Slave 升级为 Master,更新集群信息
↓
客户端通过 Sentinel 获取新 Master 地址
5. 实战案例
假设 Redis 集群如下:
节点 | 角色 | 状态 |
---|---|---|
redis-01 | Master | 正常 |
redis-02 | Slave | 正常 |
redis-03 | Slave | 正常 |
sentinel-01 | Sentinel | 正常 |
sentinel-02 | Sentinel | 正常 |
sentinel-03 | Sentinel | 正常 |
5.1 Master 故障
- redis-01 宕机
- Sentinel-01、02、03 检测 Master 下线
- 多数 Sentinel 达成共识 → redis-02 被选为新 Master
- redis-03 更新复制目标到新 Master
5.2 客户端重连
- 客户端向 Sentinel 查询 Master 地址
- 自动路由到 redis-02
- 数据依旧可用,系统实现 零宕机切换
5.3 集群扩展
- 新节点加入 Cluster
- cluster.c 完成 hash slot rebalancing
- 客户端自动感知新节点并路由请求
6. 源码调用链梳理
text
Redis Master 故障 → Sentinel 事件循环(sentinel.c)
↓
sentinelCheckFailoverState() → sentinelFailoverStateWaitStart()
↓
选举新 Master → promoteSlaveToMaster()
↓
reconfigureOtherSlaves() 更新复制关系
↓
更新客户端配置 → 客户端通过 Sentinel 获取新 Master
7. 小结
本文通过源码和实战案例解析了 Redis 高可用整合应用:
- Sentinel:监控、故障判定、故障转移
- Cluster:数据分片、节点路由、状态管理
- 复制 + 持久化:保证数据可靠性
- 内存优化机制:支撑高并发和稳定性
- 整合应用:客户端请求透明切换到新 Master,实现高可用
📌 至此,Redis 从 内存优化、对象系统、事件驱动、数据结构、命令执行、持久化、复制 到 高可用 的完整内部机制与应用链路,已经讲解完整。