SRE 故障预案与演练:从纸上谈兵到肌肉记忆的工程实践

概述 凌晨两点,你被电话吵醒。监控大屏一片红,核心交易链路 P99 延迟飙到 8 秒,上游服务开始超时熔断,客服群里用户截图已经刷屏了。你一边远程连 VPN,一边脑子里飞速转——这场景上次演练时见过吗?预案里有没有覆盖?切换步骤还记得吗? 如果你这时候还在翻 wiki 找文档,那说明一件事:你的预案只是写了,没练过。 故障预案不是写完就完事的文档。它是一套需要反复演练、不断修正的应急肌肉记忆。就像消防队不会只在纸上画逃生路线——他们会点真火,拉真警报,让人在浓烟里跑。SRE 的故障演练也是同一个道理:不逼团队在接近真实的故障场景里做决策,到了真正出事的时候,你永远不知道谁会卡壳。 这篇文聊聊怎么把故障预案从"写给别人看的文档"变成"团队真正能执行的作战手册",以及怎么设计演练体系让团队保持手感。 故障预案的本质:不是文档,是决策树 预案要解决什么问题 很多人把故障预案理解成一份操作手册——“如果 A 挂了,执行步骤 1-2-3”。这没错,但太浅了。真正有用的预案是一棵决策树,帮值班人员在高压环境下快速做对三件事: 判断故障等级——这事值不值得半夜叫人?叫到哪一级? 选择止损路径——先切流量、先回滚、还是先扩容? 确定沟通节奏——谁对外发声、多久同步一次、什么时候升级 我见过太多预案写得像产品说明书,事无巨细地列了 50 个步骤,值班同学在故障现场根本来不及看。好的预案应该短、狠、准——能在 30 秒内定位到对应的处置方案,3 分钟内开始执行止损。 预案体系的三层结构 层级 内容 目标读者 更新频率 L1 应急卡片 单服务故障的快速处置步骤(≤10 步) 值班 On-Call 每次演练后 L2 灾备预案 跨服务故障的切换方案与回滚流程 SRE 团队 每季度 L3 业务连续性预案 机房级故障的全面接管方案 SRE + 业务方 每半年 L1 应急卡片是日常用得最多的。它不是 wiki 上的长文,而是一张可以打印出来贴在工位上的卡片。格式很简单: # [服务名] 应急卡片 ## 故障特征 - 核心指标:P99 延迟 > 500ms 或 错误率 > 1% - 典型告警:service_latency_p99_critical / service_error_rate_high ## 快速止血(按优先级) 1....

July 16, 2026 · 7 分钟 · 1472 字 · 徐保金

SRE 可靠性工程:从理论到落地

可靠性工程:不只是"不出故障" 可靠性工程的目标不是追求零故障——那既不现实也不经济。真正的目标是:在故障不可避免的前提下,让系统具备快速发现、自动恢复、持续学习的能力。 Google SRE 提出的核心公式: MTTR << MTBF / (MTBF + MTTR) × (1 - SLO) 这个公式揭示了一个关键事实:当故障间隔(MTBF)远大于修复时间(MTTR)时,系统的可用性自然趋近于 SLO 目标。因此,可靠性工程的发力方向是双重的——延长无故障时间(提升 MTBF)和缩短故障恢复时间(降低 MTTR)。 可靠性层级模型 参考 CMMI 能力成熟度模型的思想,可靠性工程同样存在层级递进关系。从低到高分为五个层级: 层级 特征 典型表现 L1 被动响应 故障发生后人工处理 告警轰炸 → 人工排查 → 手动恢复 L2 监控覆盖 关键指标可观测 仪表盘完备,告警有阈值,但恢复仍靠人 L3 自动化恢复 常见故障自动处理 健康检查自动重启、HPA 自动扩容 L4 主动预防 提前发现风险 压测、容量规划、混沌工程主动注入故障 L5 自愈系统 闭环自适应 故障自动感知 → 诊断 → 恢复 → 学习 大部分团队的真实水平在 L2 到 L3 之间。从 L3 到 L4 的跨越是最关键的——它意味着从"等故障来"转变为"主动找故障"。L5 自愈是理想态,也是持续演进的方向。 层级跃迁的关键 L1 → L2:建设可观测性体系(指标、日志、链路追踪)。 L2 → L3:引入自动化恢复机制(Kubernetes 健康检查、HPA、自动故障转移)。 L3 → L4:引入混沌工程,主动验证系统的弹性。 L4 → L5:建设自愈闭环,将人工经验沉淀为自动化策略。 每一层级的跨越都需要对应的技术投入和组织能力建设,不能跳级。...

January 9, 2025 · 5 分钟 · 1060 字 · 徐保金

混沌工程:主动发现系统弱点

概述 传统的可靠性保障思路是"尽量不出故障"——加监控、加告警、加冗余。但这种被动防御有一个根本缺陷:你不知道系统在故障发生时的真实表现,直到故障真正发生。 混沌工程反其道而行之:主动、可控地注入故障,在故障变成事故之前发现系统的弱点。 它不是搞破坏,而是一种科学的实验方法——提出假设(“系统应该能承受某节点故障”),设计实验(杀掉一个节点),验证假设(服务是否仍然正常),发现弱点(如果服务异常了)。 Netflix 的 Chaos Monkey 开创了这一领域,如今混沌工程已经成为 SRE 体系的重要组成部分。从原理、实验设计、爆炸半径控制、Kubernetes 实战到常态化实践,详细梳理如何把混沌工程从"概念"落地为"日常实践"。 关于混沌工程的原则,可参考 Principles of Chaos Engineering 和 Chaos Engineering Book。 一、混沌工程的原理 核心思想 混沌工程的核心思想是: 在正常流量期间,通过有意注入故障来验证系统的弹性,从而在故障变成事故之前发现并修复弱点。 这与传统的测试有本质区别: 维度 传统测试 混沌工程 目标 验证"代码是否正确" 验证"系统是否能承受故障" 环境 测试环境 生产环境(或接近生产的预发环境) 故障来源 预定义的测试用例 真实模拟的故障场景 发现时机 开发阶段 运行阶段 关注点 功能正确性 系统弹性 为什么要在生产环境做 混沌工程最反直觉的一点是"在生产环境注入故障"。为什么不 在测试环境做? 测试环境无法复制生产的复杂性:生产环境的流量模式、数据量、网络拓扑、依赖关系与测试环境完全不同 测试环境的故障不会造成真实影响:没有压力,就不会暴露在压力下才出现的问题 只有在生产环境才能验证完整的恢复链路:告警是否触发?On-Call 是否响应?自动恢复是否生效? 当然,直接在生产环境做混沌实验需要严格的控制——这正是"爆炸半径控制"要解决的问题。 混沌工程的四条原则 根据 Principles of Chaos Engineering,混沌工程遵循以下原则: 围绕稳态行为定义"正常":先定义系统的正常状态(SLI/SLO),再注入故障看是否偏离 假设稳态在对照组和实验组中都保持:一部分流量/节点不注入故障(对照组),一部分注入(实验组),对比差异 在真实环境中实验:生产环境或接近生产的环境 自动化持续运行:不是一次性实验,而是持续自动化运行 混沌工程的收益 chaos_engineering_benefits: direct_benefits: - "提前发现系统弱点和单点故障" - "验证告警和恢复机制是否有效" - "提升团队对故障的响应能力" - "验证架构设计假设是否成立" indirect_benefits: - "建立团队对系统弹性的信心" - "驱动架构改进(从'看起来能扛'到'验证过能扛')" - "减少真实故障的 MTTR(因为已经演练过类似场景)" - "培养'故障不可避免'的工程文化" 二、从 Chaos Monkey 说起 Netflix 的混沌工程演进 Netflix 是混沌工程的开创者,其演进路径值得参考:...

December 17, 2024 · 8 分钟 · 1689 字 · 徐保金