Tavio's blog Tavio's blog
首页
  • JVM底层原理
  • 邪恶多线程
  • MyBatis底层原理
  • Spring底层原理
  • MySQL的优化之路
  • ClickHouse的高性能
  • Redis的快速查询
  • RabbitMQ的生产
  • Kafka的高吞吐量
  • ES的入门到入坑
  • MySQL自增ID主键空洞
  • 前端实现长整型排序
  • MySQL无感换表
  • Redis延时双删
  • 高并发秒杀优惠卷
  • AOP无侵入式告警
  • 长短链接跳转
  • 订单超时取消
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Tavio Zhang

努力学习的小码喽
首页
  • JVM底层原理
  • 邪恶多线程
  • MyBatis底层原理
  • Spring底层原理
  • MySQL的优化之路
  • ClickHouse的高性能
  • Redis的快速查询
  • RabbitMQ的生产
  • Kafka的高吞吐量
  • ES的入门到入坑
  • MySQL自增ID主键空洞
  • 前端实现长整型排序
  • MySQL无感换表
  • Redis延时双删
  • 高并发秒杀优惠卷
  • AOP无侵入式告警
  • 长短链接跳转
  • 订单超时取消
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Redis核心数据结构
  • Redis持久化机制
  • Redis高可用架构
    • 一、Redis高可用架构演进逻辑
    • 二、主从复制:高可用的基石
      • 1. 核心价值:解决三大痛点
      • 2. 核心原理:全量同步与增量同步
      • (1)首次连接:全量同步
      • (2)正常运行:增量同步
      • 3. 数据一致性保障机制
      • 4. 优劣势分析
    • 三、哨兵模式:自动化故障切换
      • 1. 核心功能
      • 2. 核心原理:故障转移全流程
      • 3. 脑裂问题与解决方案
      • 4. 优劣势分析
    • 四、Redis Cluster:分片与高可用的终极方案
      • 1. 核心价值:解决大规模场景痛点
      • 2. 核心设计:哈希槽与节点通信
      • (1)哈希槽:数据分片的核心
      • (2)节点角色与通信
      • 3. 核心机制:故障检测与恢复
      • 4. 优劣势分析
    • 五、方案选型建议
  • Redis分布式锁
  • Redis缓存设计
  • Redis大Key与热Key
  • Redis限流
  • Redis IO多路复用
  • Redis过期删除策略
  • Redis Bitmap
  • 《Redis》笔记
Tavio
2023-03-29
目录

Redis高可用架构

在分布式系统中,Redis的高可用是保障服务稳定性的核心诉求。本文将系统梳理Redis高可用的三大核心方案——主从复制、哨兵模式、Redis Cluster,从原理、流程到优劣势对比。

# 一、Redis高可用架构演进逻辑

Redis的高可用方案遵循"从简单到复杂、从单点到分布式"的演进路径,核心目标始终是数据不丢失、服务不间断:

  • 主从复制:解决数据单点问题,提供基础的数据副本和读扩展能力。
  • 哨兵模式:在主从架构上增加自动化故障切换,解决人工运维痛点。
  • Redis Cluster:通过分片技术突破写单点限制,支撑大规模分布式场景。

# 二、主从复制:高可用的基石

主从复制是Redis最基础的高可用方案,本质是数据副本机制——主节点负责写操作,从节点同步主节点数据并承担读请求。

# 1. 核心价值:解决三大痛点

痛点场景 主从复制的解决方案
数据单点丢失风险 从节点保存主节点数据副本,主节点宕机可手动切换
读请求集中导致性能瓶颈 读请求分摊到多个从节点,主节点专注写操作
备份操作阻塞主线程 从节点执行BGSAVE生成RDB,不影响主节点运行

# 2. 核心原理:全量同步与增量同步

主从节点的数据一致性通过"初始化全量同步+运行时增量同步"实现:

# (1)首次连接:全量同步

  1. 从节点执行SLAVEOF master_ip master_port,向主节点发送PSYNC ? -1请求全量同步;
  2. 主节点执行BGSAVE生成RDB文件,同时将生成RDB期间的写命令存入复制积压缓冲区;
  3. 主节点发送RDB文件给从节点,从节点清空本地数据并加载RDB;
  4. 主节点将复制积压缓冲区的增量命令发送给从节点,从节点执行后完成数据对齐。

# (2)正常运行:增量同步

  1. 主节点执行写命令后,同步写入复制积压缓冲区;
  2. 从节点每秒通过心跳包(PING)向主节点发送自身的复制偏移量;
  3. 主节点对比自身偏移量与从节点偏移量,将差值对应的命令从缓冲区发送给从节点;
  4. 从节点执行命令后更新自身偏移量,保持与主节点数据一致。

# 3. 数据一致性保障机制

机制 作用说明
复制偏移量 主从节点各自记录已同步的字节数,用于判断数据是否一致
复制积压缓冲区 主节点保存近期写命令,解决从节点断连后无需全量同步的问题
主从心跳 从节点每秒发送PING,主节点回复PONG,检测节点存活状态
过期key同步 主节点删除过期key后,主动向从节点发送DEL命令,保证数据一致

# 4. 优劣势分析

优势:

  • 实现数据副本,避免单点数据丢失;
  • 读请求分流,提升整体读性能;
  • 配置简单,运维成本低。

不足:

  • 无自动故障切换:主节点宕机后需人工干预,服务中断;
  • 写操作仍单点:所有写请求集中在主节点,无法水平扩展;
  • 存在复制延迟:从节点数据落后于主节点,可能读取旧数据;
  • 脑裂风险:主节点网络闪断后,从节点被升级为主节点,原主恢复后出现双主导致数据不一致。

# 三、哨兵模式:自动化故障切换

哨兵(Sentinel)是Redis官方提供的主从架构增强方案,本质是分布式监控+决策+执行集群,核心解决主从复制的"人工故障切换"痛点。

# 1. 核心功能

核心功能 具体作用
节点监控 持续检测主从节点健康状态,判断节点是否存活
故障通知 节点异常时通过脚本(如邮件、短信)触发告警
自动故障转移 主节点宕机后,自动选举最优从节点升级为主节点,其余从节点切换同步目标
配置提供者 客户端通过哨兵获取当前主节点地址,无需硬编码主节点信息

# 2. 核心原理:故障转移全流程

哨兵集群需至少部署3个节点(避免脑裂),故障转移流程如下:

  1. 主观下线(SDOWN):单个哨兵检测到主节点无响应(超过down-after-milliseconds配置),标记为主观下线;
  2. 客观下线(ODOWN):该哨兵向其他哨兵发送"主节点下线确认请求",若收到≥quorum(配置的确认数)个同意,标记主节点为客观下线;
  3. 选举哨兵领导者:所有哨兵通过Raft协议投票,选举1个领导者负责执行故障转移(避免多哨兵并发操作);
  4. 筛选最优从节点:
    • 排除离线、网络延迟高的从节点;
    • 优先选择复制偏移量高的从节点(数据最新);
    • 其次选择replica-priority配置值低的从节点(默认100,0表示不参与选举);
  5. 升级主节点:领导者向最优从节点发送replicaof no one命令,将其升级为主节点;
  6. 切换其余从节点:向剩余从节点发送replicaof 新主节点IP 端口,使其同步新主节点;
  7. 更新配置与通知:哨兵集群更新主节点信息,客户端通过哨兵获取新主节点地址,恢复写服务;
  8. 旧主节点恢复:原主节点重启后,被哨兵标记为从节点,自动同步新主节点数据。

# 3. 脑裂问题与解决方案

脑裂场景:网络分区导致集群分裂为多个分区,每个分区独立选举主节点,出现"双主"写入冲突。

例如:1主2从+3哨兵集群分裂为:

  • 分区A:原主节点+1个哨兵(哨兵认为主节点存活);
  • 分区B:2个从节点+2个哨兵(哨兵无法连接原主节点,判断主节点下线,选举其中1个从节点为新主节点)。

此时两边主节点都可能接收写请求,网络恢复后其中一个主节点会被降级,该节点上的新写数据会被覆盖,导致新写数据丢失。

解决方案:min-replicas-to-write配置
该配置定义主节点接受写操作的"最小可用从节点数"(需同时满足同步延迟≤min-replicas-max-lag)。

  • 分区A的原主节点:可用从节点数=0,若min-replicas-to-write≥1,则拒绝写操作;
  • 分区B的新主节点:若min-replicas-to-write=2,因仅有1个从节点,也拒绝写操作。
    最终避免双主写入冲突,直到集群恢复正常。

# 4. 优劣势分析

优势:

  • 自动故障切换,无需人工介入;
  • 实时监控节点状态,支持告警通知;
  • 兼容主从复制,可平滑升级;
  • 客户端自动发现主节点,降低配置维护成本。

不足:

  • 写操作仍单点:所有写请求集中在单个主节点,无法突破单机性能上限;
  • 脑裂风险仍存在:需依赖配置规避,而非彻底解决;
  • 不支持自动分片:数据量超过单机内存时,需手动迁移数据。

# 四、Redis Cluster:分片与高可用的终极方案

Redis Cluster是Redis 3.0+推出的分布式集群方案,通过哈希槽分片+主从副本,同时解决写单点和水平扩展问题,支撑大规模部署。

# 1. 核心价值:解决大规模场景痛点

痛点场景 Redis Cluster的解决方案
写操作单点瓶颈 哈希槽分片,多个主节点分摊写请求,支持水平扩展
手动分片复杂度高 自动分片+在线槽位迁移,支持动态扩缩容
单机内存容量限制 数据分散到多个节点,突破单机内存上限
高可用依赖外部组件 内置主从副本+自动故障转移,无需哨兵

# 2. 核心设计:哈希槽与节点通信

# (1)哈希槽:数据分片的核心

Redis Cluster将所有数据映射到16384个哈希槽(0~16383),分片规则如下:

  1. 计算键的哈希值:CRC16(key) % 16384 → 槽位;
  2. 每个主节点负责一部分槽位(如节点A负责0~5460,节点B负责5461~10922);
  3. 从节点同步对应主节点的槽位数据,作为副本;
  4. 槽位是分片的最小单位,支持在线迁移(reshard)。

特殊规则:若key包含{},仅计算{}内字符串的哈希(如user:{1001}:name仅哈希1001),保证同一用户数据落在同一槽位(避免跨槽操作)。

# (2)节点角色与通信

  • 主节点:负责槽位的读写操作,每个主节点可配置1~N个从节点;
  • 从节点:同步主节点数据,主节点宕机后自动升级为主节点;
  • 集群通信:节点间通过16379端口采用Gossip协议(PING/PONG)同步状态(槽位分配、故障信息等)。

# 3. 核心机制:故障检测与恢复

  1. 主观下线(PFAIL):节点检测到另一节点无响应(超过node-timeout,默认15秒),标记为PFAIL;
  2. 客观下线(FAIL):节点通过Gossip协议传播PFAIL状态,若≥半数主节点确认,标记为FAIL;
  3. 从节点选举升级:故障主节点的从节点发起选举,集群内主节点投票,获得>半数选票的从节点升级为主节点;
  4. 槽位迁移:新主节点接管原主节点的所有槽位,集群恢复正常服务。

# 4. 优劣势分析

优势:

  • 写操作水平扩展:多个主节点分摊写请求,突破单机性能上限;
  • 自动分片+在线迁移:支持动态扩缩容,运维成本低;
  • 内置高可用:无需哨兵,自动完成故障转移;
  • 支持大规模部署:可扩展至数十个节点,存储TB级数据。

不足:

  • 架构复杂度高:部署、监控、排障难度高于主从+哨兵;
  • 命令限制:不支持跨槽多键命令(如MGET key1 key2,若key1/key2不在同一槽位);
  • 事务/管道限制:跨槽事务不支持,管道需保证所有命令落在同一节点;
  • 运维成本高:需监控槽位分配、节点状态、迁移进度等指标。

# 五、方案选型建议

场景需求 推荐方案
小规模应用,需基础高可用 主从复制+哨兵
读多写少,需自动故障切换 主从复制+哨兵
写请求量大,需水平扩展 Redis Cluster
数据量超单机内存上限 Redis Cluster
追求简单运维,容忍手动切换 主从复制

通过以上三种方案的演进,Redis从单点到分布式、从手动到自动化,逐步实现了高可用的核心目标。实际应用中需根据业务规模、性能需求和运维成本,选择最适合的架构方案。

编辑 (opens new window)
#Redis集群
上次更新: 2026/01/21, 19:29:14
Redis持久化机制
Redis分布式锁

← Redis持久化机制 Redis分布式锁→

最近更新
01
订单超时取消
01-21
02
双 Token 登录
01-21
03
长短链接跳转
01-21
更多文章>
Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式