云服务故障并不只有“全球宕机”这一种形态,也可能只影响某个区域、可用区、项目、工作负载,甚至某一条依赖链。真正拉开恢复速度差距的,通常不是某个神奇命令,而是团队是否有一套经过演练的流程:准备 → 验证 → 调查 → 报告 → 缓解与恢复 → 复盘。
这套方法尤其适合运行在 Google Cloud 上的生产系统,但其中的职责划分、证据收集和故障演练同样适用于多云或混合云环境。
事故发生前:把“临场发挥”变成工程能力
可靠性建设至少要覆盖四个方面:设计、数据、剧本和训练。
1. 设计可失败的系统
不要假设某个区域、实例或服务永远可用。对关键应用,应提前设计并自动化以下动作:
- 负载均衡器将流量从慢实例或无响应实例上移走;
- 在健康检查失败时摘除后端;
- 跨可用区或跨区域部署关键工作负载;
- 为数据库、对象存储和消息系统准备恢复或切换方案;
- 将可以自动执行的处置步骤写入流水线或自动化脚本。
故障转移并不是“配置了备用区域”就算完成。备用栈还需要有容量、数据、权限、依赖和可验证的健康状态。否则切换只是把故障从 A 区域复制到 B 区域。
2. 让观测数据在故障时仍然可用
Cloud Monitoring、Cloud Logging、Cloud Trace 或第三方观测平台应能回答几个基本问题:
- 什么时候开始异常?
- 哪些区域、服务和用户受到影响?
- 错误率、延迟和流量如何变化?
- 最近是否发生了发布、配置或权限变更?
- 当前看到的是基础设施故障,还是应用自身的问题?
观测数据最好复制到与被观测系统不同位置的冗余栈中,并统一时间戳和时区。事故处理中,无法对齐日志、指标和变更记录,会让团队把大量时间浪费在“到底哪个时间是真的”上。
3. 写清楚事故剧本
一份可用的 playbook 不应只写“通知相关人员并排查”。它应该明确:
- 谁担任事故指挥官,谁负责技术缓解;
- 谁负责客户和内部沟通;
- 哪些情况需要通知管理层、供应商或值班团队;
- 使用哪些仪表盘、日志和支持渠道;
- 如何升级 P1/P2 支持请求;
- 长时间事故如何交接给下一班次;
- 什么条件代表服务恢复,什么条件代表事故可以关闭。
职责不清会让多人同时做同一件事,也会让真正关键的动作无人负责。
4. 定期训练,而不是只保存文档
服务中断可能几个月都不发生一次,因此只把流程写在文档里远远不够。建议每年多次组织跨团队演练,模拟区域不可用、发布回滚、配额耗尽或第三方依赖失败等场景。
演练结束后,记录哪些步骤耗时最长、哪些权限或数据无法获得、哪些联系人已经失效,并直接修改 playbook。演练的价值不在于“顺利完成”,而在于暴露真实的摩擦点。
验证:先判断是不是云平台故障
收到告警后,不要立刻认定“Google Cloud 挂了”。第一步是确认影响范围和责任边界。
建议按下面顺序检查:
- 查看 Personalized Service Health:它面向具体项目和区域,可能显示公共状态页没有展示的有限范围事件。关注事件是否处于调查中的 Emerging 状态,或已经确认影响客户的 Confirmed 状态。
- 查看 Cloud Service Health Dashboard:它适合确认影响广泛客户的重大事件。如果个性化服务健康页面不可用,公共状态页可以作为独立渠道。
- 查看 Known Issues 和支持案例:如果问题与已知事件匹配,可以将支持案例关联到该事件并接收后续更新。
- 比较多云环境:如果同一功能在多个云供应商上同时异常,问题更可能位于自身系统、互联网链路或第三方依赖,而不是某一家云平台。
即使 Google 已经宣布事件,也要评估是否能通过备用区域或备用栈更快恢复。平台正在修复,并不代表等待平台修复一定是最短路径。
调查:用证据缩小爆炸半径
如果状态页没有对应事件,应优先排除自身环境的问题。可以从四条线索开始:
- 指标:查看 5xx 错误率、延迟、请求量、实例健康度和区域分布;
- 日志:搜索
DEADLINE_EXCEEDED、SERVICE_UNAVAILABLE、配额或权限相关错误; - 配额:检查 CPU、API 请求速率、IP、实例或其他项目级配额是否达到上限;
- 变更:对照发布记录、配置变更、IAM 修改和平台维护时间线。
时间上的接近不是因果关系,但如果异常紧跟一次发布或配置变更出现,回滚到最后一个已知正常版本通常是值得尝试的快速缓解动作。回滚前仍应保留证据,并确认问题不是流量突增、DDoS 或外部依赖异常造成的。
一个可直接改造的快速取证脚本
下面的 Bash 示例假设你已经安装并登录 gcloud CLI,并拥有读取项目日志的权限。运行前修改项目、区域和健康检查地址;它不会自动修改生产资源,只负责收集基础证据。
#!/usr/bin/env bash
set -euo pipefail
PROJECT_ID="your-project-id"
REGION="us-central1"
HEALTH_URL="https://api.example.com/healthz"
SINCE="30m"
printf '\n== Service health ==\n'
curl --fail --silent --show-error --max-time 10 "$HEALTH_URL"
printf '\n\n== Recent error logs ==\n'
gcloud logging read \
'severity>=ERROR OR textPayload:(DEADLINE_EXCEEDED OR SERVICE_UNAVAILABLE)' \
--project="$PROJECT_ID" \
--freshness="$SINCE" \
--limit=50 \
--format='table(timestamp,resource.type,severity,textPayload)'
printf '\n== Regional quota snapshot ==\n'
gcloud compute regions describe "$REGION" \
--project="$PROJECT_ID" \
--format='yaml(quotas)'
printf '\n== Active gcloud configuration ==\n'
gcloud config list --format='yaml(core.project,compute.region,compute.zone)'
这段脚本只能帮助收集线索,不能替代监控、分布式追踪或供应商状态信息。生产环境中应进一步把项目 ID、区域、时间窗口和日志查询条件接入事故工具,并避免在输出中泄露凭据或用户数据。
报告:让支持团队能快速复现问题
当状态页显示正常,但自己的指标明确表明服务失败时,应及时创建支持案例。优先级必须和可量化的业务影响匹配:
- P1 Critical:生产服务不可用或严重受损,且没有可行的临时方案;
- P2 High:存在明显影响或性能下降,但可能有临时方案。
案例中至少包含以下信息:
- 项目 ID,以及受影响的区域或可用区;
- 开始时间、当前是否仍在持续,并明确标注时区;
- 具体错误消息、请求 ID 和少量代表性日志;
- 影响范围:全部用户、某个租户、某个地区,还是特定工作负载;
- 已经尝试过的操作及其结果;
- 可量化的业务影响,例如失败率、受影响请求数或无法完成的关键流程。
如果拥有 Enhanced 或 Premium 支持,P1 案例在未获得足够关注时,可以使用控制台中的升级操作。清晰的影响说明比笼统地写“系统挂了”更有助于支持团队判断优先级。
恢复:先稳住业务,再追求彻底修复
等待平台或供应商处理期间,事故团队应并行推进几件事:
对外和对内沟通
尽早通知客户、业务负责人和内部支持团队。沟通内容应包含当前影响、已知范围、临时方案和下一次更新时间。透明沟通可以减少重复报障,也能避免不同团队依据互相矛盾的信息采取动作。
有条件地故障转移
如果系统支持多区域,应先确认异常发生在基础设施层,而不是应用自身或数据层,再将流量转移到健康区域。切换前检查备用栈的容量、依赖、数据新鲜度和写入一致性;切换后继续观察错误率和业务指标。
使用临时绕过方案
平台状态更新或支持案例中可能给出临时 workaround。应用这些方案前,应记录变更、评估副作用,并为恢复正常后的撤销动作建立明确条件。
关注合规和事故报告
某些组织需要在规定时限内报告服务中断。应提前明确谁负责初始报告、后续更新和证据留存。重大云平台事件结束后,还可以结合公开 Incident Report,或在符合支持计划条件时申请针对自身环境的 Incident Summary。
服务恢复后不要立即关闭事故。先验证关键业务、错误率、延迟、队列积压和数据一致性。供应商状态页关闭事件的时间,也可能晚于你自己的服务恢复时间,因为其他客户的缓解工作仍在进行。
复盘:用无责方式找到系统性改进
系统稳定后,尽快召开无责复盘。重点不是寻找“谁做错了”,而是找出系统为什么允许问题扩大,以及团队为什么花了这么久才恢复。
可以围绕这些问题展开:
- 哪些动作奏效了?
- 哪些信息太晚出现或根本无法获得?
- 哪些步骤依赖某个人的记忆?
- 我们在哪些地方只是运气好,哪些地方运气不好?
- 备用区域、数据恢复和权限是否真的经过验证?
- playbook、监控、自动化和培训应该如何修改?
每条改进项都应有负责人、截止日期和验证方式。例如,“完善跨区域切换”不够具体;“在 30 天内完成一次无客户影响的跨区域演练,并验证 RTO、RPO 和回切步骤”才是可执行的行动项。
一份适合落地的检查清单
- [ ] 关键服务明确了区域、可用区和依赖关系;
- [ ] 备用栈拥有真实可用的容量、权限和数据;
- [ ] 日志、指标和追踪数据有冗余保存,并能统一时间线;
- [ ] playbook 写明角色、联系人、升级路径和交接方式;
- [ ] 团队定期演练回滚、故障转移和供应商报障;
- [ ] 事故发生时先检查个性化健康状态,再判断责任边界;
- [ ] 取证信息包含项目、区域、时区、错误和业务影响;
- [ ] 恢复后验证业务指标,而不是只看基础设施变绿;
- [ ] 每次重大事故都产出无责复盘和可验证的改进项。
云可靠性事故无法完全消除,但可以让它更快被发现、更准确地归因、更安全地缓解。把这条“验证—调查—报告—恢复—复盘”的链路练成团队肌肉记忆,往往比在事故当天临时寻找一个神奇的修复命令更有效。