告警与应急响应

用生活化的比喻,让你从"出了问题才知道"到"能在问题影响玩家前发现并处理"

前置知识:第06章 游戏性能监控(告警的数据来源)、第07章 游戏日志系统(日志异常检测)


阅读指南(初学者必看)

为什么你需要学习告警与应急响应?

没有告警 = 等玩家投诉才知道出问题 没有应急 = 出了问题手忙脚乱不知道怎么修

学完本章,你能回答:

  • 告警怎么分级?P0/P1/P2 分别怎么处理?
  • 告警渠道怎么配置?怎么避免告警风暴?
  • 故障处理 SOP 是什么?怎么做到 30 分钟恢复?
  • 降级策略有哪些?游戏怎么优雅降级?
  • 混沌工程是什么?

本文结构

第一部分:告警体系
第二部分:告警降噪
第三部分:应急响应流程
第四部分:降级策略
第五部分:故障复盘与混沌工程

一、告警体系

生活类比:告警就像"火警系统"——烟雾传感器(监控)检测到异常 → 触发警报(告警)→ 消防队出动(应急响应)。

告警分级

级别 定义 响应时间 恢复时间 通知渠道
P0(紧急) 服务不可用,影响所有玩家 5 分钟 30 分钟 电话 + 短信 + 钉钉
P1(严重) 核心功能受影响 15 分钟 1 小时 短信 + 钉钉
P2(一般) 非核心功能受影响 1 小时 4 小时 钉钉
P3(提示) 需要关注但不影响功能 工作时间 下个版本 邮件

典型告警规则

P0 触发条件:
- 服务器宕机(健康检查连续失败 3 次)
- 数据库不可用
- 所有房间服务不可用
- 支付功能完全不可用

P1 触发条件:
- 登录失败率 > 10%
- API P99 延迟 > 2s
- 5xx 错误率 > 5%
- Redis 连接池耗尽

P2 触发条件:
- 排行榜查询延迟 > 1s
- 聊天消息发送失败率 > 5%
- CPU 使用率 > 80% 持续 10 分钟

P3 触发条件:
- GC 时间略长(P99 > 200ms)
- 内存使用率 > 75%
- 磁盘使用率 > 80%

二、告警降噪

生活类比:告警降噪就像"消噪耳机"——过滤掉不重要的声音,只让你听到真正需要关注的。

降噪策略

策略 说明 效果
聚合 相同告警 5 分钟内只发一次 减少 80% 重复告警
抑制 P0 告警时,相关的 P1/P2 不重复发 避免告警风暴
升级 P1 告警 30 分钟未处理 → 升级为 P0 防止告警被忽视
静默 计划内维护期间静默相关告警 避免误报
收敛 同一服务多个告警合并为一条 减少噪音

告警风暴案例

问题:数据库慢 → 所有服务超时 → 100+ 条告警同时发出 → 淹没真正重要的告警

解决:
1. 抑制:数据库 P0 告警发出后,抑制所有服务的 P1/P2 超时告警
2. 根因分析:标注"根因告警"和"衍生告警"
3. 只通知根因告警的负责人

Alertmanager 配置

route:
  group_by: ['alertname', 'severity']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h
  receiver: 'default'
  routes:
    - match:
        severity: p0
      receiver: 'p0-team'
      continue: true
    - match:
        severity: p1
      receiver: 'p1-team'

inhibit_rules:
  - source_match:
      severity: 'p0'
    target_match:
      severity: 'p1'
    equal: ['instance']

三、应急响应流程

生活类比:应急响应就像"消防演习"——平时练习过,真正着火时才不会慌。

故障处理 SOP

1. 发现(0分钟)
   - 监控告警触发
   - 或玩家反馈(客服转告)

2. 确认(5分钟内)
   - 确认故障范围(全量/部分/单服)
   - 确认影响(登录/战斗/支付)
   - 通知相关人员(群内@负责人)

3. 止损(15分钟内)
   - 降级:关闭非核心功能
   - 限流:限制新用户进入
   - 回滚:如果是新版本问题

4. 恢复(30分钟内)
   - 修复问题
   - 验证修复
   - 逐步恢复流量

5. 复盘(24小时内)
   - 根因分析(5 Whys)
   - 改进措施
   - 防止复发

5 Whys 根因分析示例

问题:玩家充值后没收到游戏币

1 Why:为什么没收到游戏币?
  → 充值回调处理失败

2 Why:为什么回调处理失败?
  → 游戏服务调用失败

3 Why:为什么游戏服务调用失败?
  → 服务超时

4 Why:为什么超时?
  → 数据库查询慢

5 Why:为什么数据库查询慢?
  → 缺少索引,全表扫描

根因:缺少数据库索引
改进:加索引 + 慢查询告警

四、降级策略

生活类比:降级就像"飞机遇到气流时降低高度"——牺牲部分性能/功能,保证安全。

降级策略 说明 游戏场景
只读模式 禁止写入,允许读取 数据库主库故障时切从库只读
排队模式 限制同时在线人数 服务器过载时排队进入
功能降级 关闭非核心功能 关闭聊天/排行榜/活动
数据降级 返回缓存数据 排行榜返回昨日缓存
服务降级 停止某些服务 关闭匹配服务,保留已开房间
质量降级 降低画面质量 关闭特效、降低帧率

游戏降级优先级

不可降级(核心):
  ✗ 登录/注册
  ✗ 战斗逻辑
  ✗ 支付/充值
  ✗ 数据持久化

可降级(非核心):
  ✓ 聊天系统
  ✓ 排行榜
  ✓ 成就系统
  ✓ 活动系统
  ✓ 皮肤/装饰
  ✓ 好友列表

五、故障复盘与混沌工程

故障复盘原则

复盘原则:对事不对人。聚焦"系统哪里可以改进"而非"谁犯了错"。每个改进项都要有负责人和截止时间。

混沌工程

混沌工程 = 主动注入故障(随机杀 Pod、增加延迟),验证系统的容错能力。Netflix 的 Chaos Monkey 是代表。

游戏团队可以先从"手动故障演练"开始:

  1. 模拟某台服务器宕机,看服务是否自动恢复
  2. 模拟数据库主库故障,看是否自动切换到从库
  3. 模拟网络分区,看游戏状态是否一致

自问自答

Q1:告警太多怎么办?

先做降噪:聚合 + 抑制 + 收敛。然后审查每条告警规则——3 个月没触发过的规则考虑删除。告警应该"少而精",每条都是需要人工处理的。

Q2:P0 告警半夜触发怎么保证响应?

值班制度:轮值 on-call,P0 电话直呼。确保手机不静音。建议:凌晨 P0 自动触发扩容+降级,白天再人工复盘。

Q3:降级和熔断有什么区别?

降级是"主动关闭功能"(人为决策),熔断是"自动停止调用"(系统决策)。降级粒度更大(整个功能),熔断粒度更小(单个接口)。

Q4:故障复盘怎么避免"甩锅"?

复盘原则:对事不对人。聚焦"系统哪里可以改进"而非"谁犯了错"。每个改进项都要有负责人和截止时间。

Q5:混沌工程是什么?

主动注入故障(随机杀 Pod、增加延迟),验证系统的容错能力。Netflix 的 Chaos Monkey 是代表。游戏团队可以先从"手动故障演练"开始。

Q6:告警通知发到钉钉/企业微信怎么配置? A: Alertmanager 支持 webhook,可以配置钉钉机器人的 webhook URL。或者使用 PrometheusAlert 这类开源工具,内置了国内各种 IM 的集成。


实践任务

  1. 制定告警规则:P0/P1/P2/P3 四级告警,每级 3~5 条规则
  2. 配置告警通知:Prometheus Alertmanager → 钉钉/企业微信
  3. 编写故障 SOP:为"服务器宕机"和"数据库故障"写应急响应文档
  4. 手动故障演练:手动 kill 一个服务,观察告警和恢复
  5. 复盘演练:假设一次线上故障,用 5 Whys 分析根因
  6. 配置告警降噪:聚合 + 抑制 + 静默,减少无效告警

与其他章节的关联

本节内容 关联章节 关联点
监控 第06章 游戏性能监控 告警基于监控数据
日志 第07章 游戏日志系统 日志辅助根因分析
降级 3_1 第14章 游戏实时通信优化 弱网降级策略
灰度发布 第09章 版本管理与灰度发布 回滚是应急手段之一
SRE 5_2 前沿技术 SRE 实践方法论

⬅️ 上一章:游戏日志系统 | ➡️ 下一章:版本管理与灰度发布