# Redis 挂了怎么办?—— 高可用、容灾逃生与稳定性治理全链路

发布时间:2026/6/8 1:13:28

# Redis 挂了怎么办?—— 高可用、容灾逃生与稳定性治理全链路 Redis 挂了怎么办—— 高可用、容灾逃生与稳定性治理全链路日期2026年6月7日分类后端开发 / 缓存架构标签#Redis #高可用 #熔断降级 #持久化 #限流 #缓存容灾一、Redis 挂了两道防线1.1 架构层面 —— 不要让它挂方案原理适用场景主从复制 哨兵一主多从哨兵监控主挂了自动选主切换中小规模读多写少Redis Cluster分片 主从 自动 Failover全部内置大规模、高并发、海量数据1.2 Redis 真的挂了 —— 应用层如何逃生Redis 宕机后接口大量超时线程池被打满整个应用跟着宕机雪崩效应。案例场景秒杀系统Redis 突然不可用。第一层熔断降级不要傻等 Redis 超时 ↓ 熔断器介入快速失败释放线程 ↓ 非核心功能 → 降级返回默认值/兜底数据 核心功能 → 走 MySQL 兜底千万小心 DB 被打爆第二层客户端重试策略慎重Redis 短暂抖动 → 可以用重试 ↓ 必须遵守 1. 指数退避1s → 2s → 4s → 8s 2. 最大重试次数如 3 次 3. 绝对不能所有线程同时重试 → 重试风暴 → 二次事故集群全挂了怎么办先看机房是不是断电了 —— 玩笑背后是真理先排查基础设施别急着改代码。二、高可用提升 —— 多级冗余逃生2.1 核心思想冗余单点故障不可接受必须有多级存储中间件兜底。客户端请求 ↓ ┌─ Redis主← 正常情况 ↓ 挂了 ├─ Redis 容灾集群 ← 第一级逃生 ↓ 也挂了 ├─ 本地缓存Caffeine/Guava← 第二级逃生 ↓ 还不命中 └─ MongoDB / MySQL ← 最终兜底2.2 容灾集群热备独立部署的 Redis 备用集群保持可用状态放真实业务流量跑着别等出事了才切过去发现也是坏的DNS 层一键切换秒级生效定期压测演练验证可用性2.3 引入本地缓存优势风险抗并发能力极强纯内存无网络开销数据不一致各节点本地缓存版本不同不依赖 Redis独立工作Redis 恢复后本地缓存与 Redis 数据如何保持一致使用前提能容忍短暂不一致的业务数据如商品标题、活动配置等。主流实现CaffeineSpring Boot 默认基于 W-TinyLFU 算法近乎最优命中率Guava CacheGoogle经典方案EHCache支持堆外内存适合大缓存2.4 引入 MongoDB 集群同步备库MySQL → Canal监听 Binlog ↓ 实时同步 MongoDB 集群 ↓ Redis 挂了 直接查 MongoDB ← 比 MySQL 扛并发能力强得多三、稳定性治理 —— 平时练好内功3.1 四件套1. 监控告警升级 → 提前发现不要等业务报故障 2. 刷缓存接口 → 手动修复一致性问题 3. 动态降级开关 → 一键切回查库模式 4. 接口限流 → 保护 DB防止被打爆3.2 监控与告警监控指标阈值示例说明Redis 连接超时率 5%可能网络抖动或实例过载Redis 命令执行耗时P99 100ms慢查询或大 KeyRedis 内存使用率 80%接近上限准备扩容Redis 不可用任何时刻立即告警准备切容灾大量超时、调用失败 → 第一时间考虑 Redis 是否挂了3.3 刷 Redis 缓存接口提供一个管理后台或 API允许手动触发缓存刷新用于修复一致性漂移。POST /admin/cache/refresh?keyproduct:10013.4 动态降级开关引入配置中心运行时切换策略框架特点Nacos阿里开源支持服务发现 配置管理Apollo携程开源配置管理功能最强Disconf百度开源轻量级// 伪代码动态降级 if (configCenter.get(redis.degrade, false)) { return db.query(); // 降级查库 } else { return redis.get(key); // 正常查缓存 }3.5 接口限流 —— 保护 DB 的最后一道防线如果限流没做好大量请求穿透到 DB分分钟打爆。限流层级网关层 → Nginx Lua 脚本限流 微服务层 → 网关限流Spring Cloud Gateway / Zuul 应用层 → 服务接口限流Sentinel / Guava RateLimiter三种经典限流算法算法原理优点缺点适用场景固定窗口固定时间窗口计数简单窗口边界突发流量简单控制令牌桶以固定速率生成令牌请求先拿令牌允许突发流量实现稍复杂允许一定突发漏桶请求排队以恒定速率流出流量绝对平整无法处理突发严格限速三种算法都可以用Redis Lua实现保证原子性。常见限流维度用户 ID → 限制单个用户的请求频率 IP 地址 → 防止单 IP 恶意刷接口 商品编码 → 秒杀时限制单个商品的并发量四、Redis 持久化 —— 宕机重启后数据还在吗4.1 RDBRedis DataBase原理定时将内存数据快照Snapshotdump 到磁盘 流程 1. Redis 主进程 fork 一个子进程 2. 子进程将当前内存数据写入临时 RDB 文件 3. 写入完成后替换旧的 RDB 文件 4. fork 期间主进程使用写时复制COW修改的数据页会被复制一份 优点 - 文件紧凑适合备份和灾难恢复 - 恢复大数据集时速度较快直接加载二进制 - 子进程处理主进程不阻塞 I/O 缺点 - 两次快照之间的数据会丢失取决于配置的 save 间隔 - fork 操作在大内存场景下可能短暂阻塞主线程毫秒到秒级配置示例# 900 秒内至少 1 个 key 变化则触发快照save9001save30010save60100004.2 AOFAppend Only File原理将每一条写命令以追加方式记录到日志文件 流程 1. Redis 执行一条写命令 2. 命令追加到 AOF 缓冲区 3. 根据同步策略刷盘到 AOF 文件 4. AOF 文件过大时触发 AOF Rewrite重写压缩 三种同步策略 always → 每条命令同步刷盘 → 数据最安全性能最差 everysec → 每秒同步一次 → 最多丢 1 秒数据推荐 no → 由操作系统决定 → 性能最好丢数据风险最大 优点 - 数据安全性高everysec 策略下最多丢 1 秒数据 - AOF 文件可读可手动修复 - Rewrite 机制自动压缩文件 缺点 - AOF 文件通常比 RDB 大 - everysec 策略下恢复速度略慢于 RDB需要逐条回放命令4.3 Redis 4.0 混合持久化推荐RDB 文件内容 AOF 增量日志 混合持久化文件 恢复流程 1. 先加载 RDB 快照部分快速恢复主体数据 2. 再回放 AOF 增量日志部分补齐快照之后的数据 兼顾了 RDB 的恢复速度和 AOF 的数据安全性4.4 对比总结维度RDBAOF混合持久化数据安全性低可能丢失数分钟数据高最多丢 1 秒高恢复速度快较慢快文件体积小二进制压缩大文本格式中对性能影响fork 瞬间阻塞everysec 几乎无影响几乎无影响适合场景对数据一致性要求不高要求高数据安全推荐生产通用生产环境建议Redis 4.0 同时开启 RDB AOF使用混合持久化。五、总结 —— 全景架构图监控 告警 ↓ ┌──────────────┐ │ 配置中心降级 │ └──────┬───────┘ ↓ 客户端请求 ──→ 网络层限流Nginx──→ 网关层限流 ──→ 接口限流 ↓ ┌────────────────────────────────────┐ │ Redis 集群 │ │ ┌──────┐ ┌──────┐ ┌──────┐ │ │ │ 主节点│ │ 从节点│ │ 从节点│ │ │ └──┬───┘ └──────┘ └──────┘ │ │ ↓ 哨兵监控 / 自动 Failover │ └────────────┬───────────────────────┘ ↓ 挂了 ┌────────────┴───────────────────────┐ │ 逃生链路 │ │ │ │ 第一级Redis 容灾集群DNS 切换 │ │ 第二级本地缓存Caffeine │ │ 第三级MongoDBCanal 同步备库 │ │ 第四级MySQL 兜底限流保护 │ └────────────────────────────────────┘ ↓ RDB AOF 混合持久化 宕机重启不丢数据本文基于个人学习笔记整理如有疏漏欢迎交流指正。

相关新闻