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

相关推荐
l1t6 小时前
利用DeepSeek实现服务器客户端模式的DuckDB原型
服务器·c语言·数据库·人工智能·postgresql·协议·duckdb
MarkHard12310 小时前
如何利用redis使用一个滑动窗口限流
数据库·redis·缓存
island131411 小时前
【Redis#10】渐进式遍历 | 数据库管理 | redis_cli | RES
数据库·redis·bootstrap
心想事成的幸运大王11 小时前
Redis的过期策略
数据库·redis·缓存
倔强的石头_11 小时前
CentOS 上安装KingbaseES(ISO包)详细教程
数据库
2401_8979300612 小时前
使用Docker轻松部署Neo4j图数据库
数据库·docker·neo4j
诗句藏于尽头12 小时前
Django模型与数据库表映射的两种方式
数据库·python·django
寻星探路13 小时前
数据库造神计划第六天---增删改查(CRUD)(2)
java·大数据·数据库
盖世英雄酱5813614 小时前
Read timed out问题 排查
java·数据库·后端