1. 课程导入与故障诊断全景

Redis 在生产环境中很少以“单机 + 无持久化 + 无主从”的形态出现。真实系统里,它往往同时承担缓存、分布式锁、计数器、消息队列、排行榜等职责,并运行在主从复制、哨兵或 Cluster 拓扑之上,背后还有持久化文件、客户端连接池、代理层和监控体系。因此,当故障发生时,我们看到的通常不是“Redis 挂了”这么简单,而是一组相互纠缠的现象:延迟毛刺、连接超时、主从切换、内存告警、数据不一致,甚至业务侧出现重复扣款或缓存击穿。本课程要解决的,正是这类复杂故障——单一原因难以解释、多个子系统相互影响、且必须在有限时间内恢复业务并保住数据的场景。

什么是 Redis 复杂故障

可以把 Redis 故障分成三个层次来理解。第一层是单点故障:某个实例进程退出、端口不通、OOM 被杀,这类问题定位直接,重启或切换即可。第二层是链路故障:主从复制中断、哨兵误判、Cluster 槽位迁移卡住、客户端连接池耗尽,问题出在组件之间的协作上。第三层才是复杂故障:它通常由“资源压力 + 配置缺陷 + 拓扑变化 + 业务流量”共同触发,表现为一个症状背后有多条因果链。例如,一次主从切换后出现大量超时,可能同时涉及:从节点复制积压导致切换后数据回滚、客户端未及时刷新拓扑仍连旧主、以及切换瞬间连接风暴打满新主连接数。只修其中一处,故障会反复出现。

因此,本课程对复杂故障的定义是:由两个及以上相互作用的因素引发,症状与根因之间存在跨组件、跨时间的因果链,且恢复过程需要在数据安全、服务可用性和业务一致性之间做权衡的 Redis 故障。

故障分类:按“故障域”建立排查坐标系

面对复杂故障,最忌讳的是凭直觉乱试命令。更有效的做法是先建立分类坐标系,把现象归入某个故障域,再沿该域的因果链向下追。课程中我们统一使用以下五个故障域:

  • 内存域:内存使用率、碎片率、大 key、过期策略、maxmemory 与淘汰策略配置。典型症状是延迟升高、写入被拒、OOM。
  • 持久化域:RDB fork 阻塞、AOF 重写、磁盘 IO 饱和、fsync 策略。典型症状是周期性卡顿、写命令超时。
  • 复制与拓扑域:主从断连、复制积压缓冲区溢出、全量同步风暴、哨兵/Cluster 选主与槽位迁移。典型症状是数据不一致、切换后流量异常。
  • 客户端与连接域:连接数打满、超时参数不合理、连接池泄漏、慢命令阻塞单线程。典型症状是超时集中爆发、吞吐骤降。
  • 数据与业务域:缓存穿透/击穿/雪崩、热 key、分布式锁失效、数据被误删或回滚。典型症状是业务错误率上升,而 Redis 自身指标看似正常。

这五个域不是孤立的。内存压力会触发淘汰,淘汰会引发缓存击穿,击穿又推高数据库负载并反过来加剧 Redis 连接压力。诊断的价值就在于识别当前故障主链在哪,避免在支链上浪费恢复时间。

诊断原则:先止血、再定位、后复盘

复杂故障的处置必须遵循明确的优先级,否则容易在排查中扩大影响面。课程贯穿以下四条原则:

  1. 业务优先于根因:先恢复可用性(切流、限流、降级、重启从节点等),再从容定位根因。不要在业务全挂时执着于抓现场。
  2. 先保数据,再保性能:任何可能造成数据丢失的操作(如强制主从切换、清空积压、直接 flush)都必须先评估数据可恢复性。
  3. 用指标说话,不靠猜测:延迟、QPS、连接数、内存、复制偏移量、慢日志,这些是可观测的客观依据。判断必须能对应到具体指标的变化。
  4. 变更即记录:故障期间的每一次操作都要记录时间点和动作,否则复盘时无法还原因果链,也无法判断是修复生效还是故障自愈。
诊断顺序建议:先看监控大盘确认影响面 → 再看 Redis 自身指标(INFO、SLOWLOG、LATENCY)→ 再看拓扑与复制状态 → 最后结合业务日志确认数据影响。这个顺序能保证你始终知道“现在最该看什么”。

恢复目标:RTO 与 RPO 的权衡

恢复不是“让 Redis 能连上”就结束了。课程要求每个故障场景都明确两个目标:RTO(恢复时间目标),即业务可接受的中断时长;RPO(恢复点目标),即业务可接受的数据丢失量。二者往往冲突:追求 RPO=0 需要等待从节点数据追平,会拉长 RTO;追求极短 RTO 直接切换,可能丢失最后一段写入。诊断时必须先和业务方确认这两个值,再决定恢复动作的激进程度。例如,支付类业务通常要求 RPO 接近 0,宁可多等几十秒;而纯缓存场景可以接受 RPO 较大,优先快速切流。

课程实战路线图

本课程共 30 章,整体按“认知 → 观测 → 定位 → 恢复 → 复盘”的能力递进组织。前段建立故障分类与诊断方法论,中段深入内存、持久化、复制、Cluster、客户端等各故障域的具体排查手段与命令,后段通过综合案例演练多因素叠加故障的处置全过程,并沉淀可复用的检查清单与恢复预案。每一章都会给出可操作的命令、参数和判断依据,而不是停留在概念层面。

Redis 复杂故障诊断全景图 症状 → 故障域 → 因果链 → 恢复动作 → 目标校验 ① 症状层(业务与监控可见) 延迟毛刺 / 超时 连接数打满 主从切换 / 数据不一致 内存告警 / 写入被拒 业务错误率上升 归类 ② 故障域(排查坐标系) 内存域 碎片率 / 大key 淘汰策略 / OOM 持久化域 fork 阻塞 / AOF 磁盘 IO / fsync 复制与拓扑域 断连 / 积压溢出 选主 / 槽位迁移 客户端与连接域 连接池 / 超时 慢命令阻塞 数据与业务域 穿透/击穿 锁失效 / 误删 追链 ③ 因果链(多因素叠加,示例) 内存压力升高 触发 key 淘汰 热 key 被淘汰 缓存击穿 数据库压力骤增 回源请求暴涨 Redis 连接与 QPS 上升 延迟进一步恶化 止血 ④ 恢复动作(先止血) 限流 / 降级 切流 / 主从切换 扩容 / 重启从节点 记录变更时间点 ⑤ 目标校验 RTO 是否达标 RPO 是否可接受

这张全景图给出了本课程后续所有章节共用的分析框架:从业务可见的症状出发,先归入故障域,再沿因果链找到主链,执行止血动作,最后用 RTO 与 RPO 校验恢复是否真正达成。后续每一章都会在这个框架下展开具体的命令、参数与判断标准,帮助你在真实故障现场快速缩小范围、做出正确决策。