TT Lab
博客 开始
学习 学习路径 课程

故障指挥与复盘

角色与宣布

在 TT Lab 中继续学习

一句话总结

重大事故中最先崩溃的不是服务器,而是“现在谁在做什么”。划分角色、尽早宣布、 为每个决定确定负责人,这些才能守住秩序。

为什么需要它

假设凌晨响起了支付错误告警。频道里进来了五个人,个个能干,个个都在做正确的事。一个人 开始回滚,另一个人在同一时刻重启同一台服务器,第三个人问要不要清缓存,却没有人回答。 客服中心不知道发生了什么,只能反复说“正在确认中”。Google SRE 一书第 14 章(Managing Incidents)展示的第一个场景正是这种 “未受管理的事故”——让事故扩大的不是个人能力,而是协调的缺失。

推迟宣布也出自同一根源。人们会因为“说不定没什么事,怕小题大做”而推迟。可宣布的代价只是一个频道和 三个角色,而宣布太晚的代价,是在此期间无人通告、无人指挥的全部时间。

它如何工作

基本角色有三个(规模变大时,再加上计划和记录负责人)。

角色 做的事 不做的事
IC(指挥) 优先级、决定、角色分配、掌握局势 亲自动手修——手一忙,指挥就空了
Ops(运维) 实际改动系统的那双手 独自判断、扩大范围
Comms(通告) 按固定间隔向外部通告情况 发布推测的数字

有几条规则支撑着这张表。角色要明确地交接——必须连同“IC 交给你了”一起留下记录,下一个人才会知道。 决定要有负责人——没有负责人的决定,要么两个人同时做,要么没人做。动手之前先告知“我现在正在做这件事”, 重叠的工作就会消失。许多团队用聊天机器人命令(/declare、/role、/own 之类)把这些记录下来。

宣布标准要事先定好:能看到用户受影响、没有把握独自在 30 分钟内解决、需要两个以上的团队——只要满足 其中之一就宣布。还要计时:首次告警 → 首次响应(ack)→ 宣布 → 缓解 → 结束。这些间隔就是下一次改进的出发点。

情况通告是有格式的:什么受到了多大(数字)影响、从何时开始、谁在指挥、下一次通告在何时。 数字必须是从数据中数出来的值,而不是“很多”;下一次通告时间要遵守按严重程度规定的间隔。遵守间隔 有时比数字更重要——“尚不清楚原因,30 分钟后再通告”也是通告,而沉默不是通告。

频道记录就是这样留下来的。有了机器人命令,事后就能机械地重新统计谁在何时负责了什么。

13:04:47 jun     결제 오류 경보 받았습니다. 보는 중이에요
13:17:12 jun     /declare sev2 결제 실패 증가        ← 첫 경보에서 13분
13:17:54 alex    /role ic @alex
13:18:56 alex    /role comms @blake
13:27:05 alex    /decide D1 결제 v2 기능 플래그 끄기  ← 주인(/own)이 없다
13:28:05 casey   /doing D1
13:29:04 drew    /doing D1                         ← 앞사람이 끝내기 전 — 겹쳤다
13:35:52 alex    /role ic @erin                    ← IC 를 넘겼다. 이 뒤의 alex 는 손이다

最后是呼叫。指挥要从呼叫触达人开始。呼叫服务用路由规则把告警名称接到团队,按该团队的 升级策略逐级推进,每一级都找出那个时刻的值班人(轮换表优先于值班表),用那个人的联系方式 呼叫他。这条链上只要断了一环,第一级就会悄无声息地失败,而下一级(通常是团队负责人)要 15 或 20 分钟后才会响。 升级是安全网,不是首次响应。

现场遇到的情形

最常见的失败是 IC 亲自动手。最懂回滚的人担任了 IC,又亲自做回滚,于是 30 分钟里没有人 通告,其他决定也停滞了。所以,交出 IC 之后再动手是可以的,但以 IC 身份动手,必须在记录中 显现出来。第二常见的是呼叫根本没有触达。新来的人联系方式为空、休假替班 指向离职者、告警名称改了与路由规则不符,指挥就连开始都做不到。指挥从呼叫触达的那一刻开始。

这类缺陷要出了事故才会暴露,所以成熟的团队会在事故之间检查。把一周的值班表放进模拟器,预先跑一跑 “在任意时刻响起会由谁接”,并每个季度统计宣布所需时间和 IC 动手的次数。有了数字,才能说下个 季度是否有了进步。

接下来的实验要做什么

展开支付事故的频道记录(聊天、呼叫、订单),用数据找出宣布所需的时间、角色交接的流程、IC 动手的决定、没有负责人的决定以及 重叠的工作,并用算出的数字按固定格式撰写情况通告。最后,从呼叫配置中找出三个团队的呼叫为什么 20 分钟 都没有触达任何人,并修好。