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

相关推荐
X566138 分钟前
如何在 Laravel 中正确保存嵌套动态表单数据(主服务与子服务)
jvm·数据库·python
虹科网络安全2 小时前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库
2301_771717212 小时前
解决mysql报错:1406, Data too long for column
android·数据库·mysql
小江的记录本2 小时前
【Kafka核心】架构模型:Producer、Broker、Consumer、Consumer Group、Topic、Partition、Replica
java·数据库·分布式·后端·搜索引擎·架构·kafka
dvjr cloi3 小时前
MySQL Workbench菜单汉化为中文
android·数据库·mysql
dFObBIMmai3 小时前
MySQL主从同步中大事务导致的延迟_如何拆分大事务优化同步
jvm·数据库·python
szccyw03 小时前
mysql如何限制特定存储过程执行权限_MySQL存储过程安全访问
jvm·数据库·python
czlczl200209253 小时前
利用“延迟关联”优化 MySQL 巨量数据的深分页查询
数据库·mysql
ACP广源盛139246256734 小时前
IX8024与科学大模型的碰撞@ACP#筑牢科研 AI 算力高速枢纽分享
运维·服务器·网络·数据库·人工智能·嵌入式硬件·电脑
Elastic 中国社区官方博客4 小时前
ES|QL METRICS_INFO 和 TS_INFO:为你的时间序列数据建立目录
大数据·数据库·elasticsearch·搜索引擎·信息可视化·全文检索