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 从 内存优化、对象系统、事件驱动、数据结构、命令执行、持久化、复制高可用 的完整内部机制与应用链路,已经讲解完整。

相关推荐
小丁爱养花3 小时前
Redis 内部编码/单线程模型/string
数据库·redis·缓存·1024程序员节
爬山算法3 小时前
Redis(84)如何解决Redis的缓存击穿问题?
java·redis·缓存
l1t3 小时前
利用DuckDB SQL求解集合数学题
数据库·sql·算法·集合·duckdb
筵陌3 小时前
MYSQL表的操作
数据库·mysql·1024程序员节
一 乐3 小时前
汽车销售|汽车推荐|基于SprinBoot+vue的新能源汽车个性化推荐系统(源码+数据库+文档)
java·数据库·vue.js·汽车·毕设·汽车个性化推荐
虾说羊4 小时前
最细Maven教程以及Maven私服搭建
java·数据库·maven
RestCloud4 小时前
Kingbase与ETL:如何实现金融级数据库的安全数据同步
数据库
ajassi20004 小时前
开源 Linux 服务器与中间件(八)数据库--MariaDB
服务器·数据库·开源
华仔啊5 小时前
这20条SQL优化方案,让你的数据库查询速度提升10倍
数据库·后端·mysql