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

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

1. 前言

Redis 高可用体系主要包括两个部分:

  1. Redis Sentinel:哨兵机制,监控、自动故障转移。
  2. 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();
}
故障判定流程
  1. Sentinel 检测 Master 不可达
  2. Sentinel 进入 subjectively down (SDOWN) 状态
  3. 多个 Sentinel 交互判断 Master objectively down (ODOWN)
  4. 触发 故障转移
故障转移流程
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 高可用整合应用:

  1. Sentinel:监控、故障判定、故障转移
  2. Cluster:数据分片、节点路由、状态管理
  3. 复制 + 持久化:保证数据可靠性
  4. 内存优化机制:支撑高并发和稳定性
  5. 整合应用:客户端请求透明切换到新 Master,实现高可用

📌 至此,Redis 从 内存优化、对象系统、事件驱动、数据结构、命令执行、持久化、复制 到 高可用 的完整内部机制与应用链路,已经讲解完整。

相关推荐
龙亘川几秒前
城市公共安全治理如何从“人海战术“走向“数据驱动“?
大数据·数据库·人工智能·安全·microsoft·智慧城市·数据可视化
betazhou5 分钟前
Apache Seatunnel 抽取SQL server实时同步到Oracle-多表同步(五)
数据库·oracle·sqlserver·apache·seatunnel
神也畏惧菠萝7 分钟前
Coze 工作流数据库 Day06:架构与高级循环控制的深度技术分析
数据库·架构·llm·coze·coze数据库·数据库流程结构
麦壳饼10 分钟前
SonnetDB:空间函数别名的参数与兼容边界
数据库·sonnetdb
han688932 分钟前
jmeter操作数据库
数据库·jmeter
星马梦缘43 分钟前
人工智能学院游戏设计大赛决赛 · 执行提纲
数据库·人工智能·游戏
eleven_4u1 小时前
MySQL引擎层是如何工作的
数据库·mysql
adinnet20262 小时前
企业级 NL2SQL 的重要基础:数据库 Schema 自动理解与元数据管理
数据库
IvorySQL2 小时前
PostgreSQL 日报| OpenCode 遭黑客入侵 API 密钥失窃(10 月 20 日)
数据库·postgresql·区块链
Elastic 中国社区官方博客2 小时前
控制告警如何触发、恢复和发送通知:Elastic 可观测性中的 Kibana 通用告警
大数据·数据库·安全·elasticsearch·搜索引擎·全文检索·es