专业书籍精读 · SRE · 合辑 02
Site Reliability Engineering · Part IV · Ch 28–32 · Google · 2016
前面那些章讲机器:怎么监控、怎么发布、怎么救火。这五章讲人——那一小撮「出事就得找他们」的工程师,怎么带出来、怎么护住、怎么派出去,以及那个更狠的问题:怎么让需要他们的地方越来越少。
一支队伍被活儿压垮了,加两个人进去——更慢了。反倒是只派进去一个人,而且这人明说「我不帮你们干活」:他旁听会议、翻旧记录,不停问「这条警报响的时候,你们其实做了什么?」两个月后队伍自己缓过来了。加手的没用,加问题的有用。
三个老毛病。新人来了没人教,被扔去回工单——一年后他很会回工单,仍然不懂系统怎么转,遇到没见过的故障就傻眼。老人被打断打死:一天被叫走七八次,正事一行推不动。最难搞的服务全靠一小撮人的记性撑着,而这小撮人不会变多——招人比服务变多慢得多。
① 带人要像师门带徒弟,不是像流水线冲料。按顺序学、每步垫在上一步上面;先跟着老师傅看,同时偷偷写「我会怎么做」、事后对答案;再反过来让他看你上手;最后过一张清单才出师。要练的不是背命令,是拆东西的能力。
② 设一个门神,别全员半开着门。一个班里只让一个人接所有打断,其余人彻底不被打扰。原因很实在:爬回专注很贵,两人各被切碎一半,加起来不如一个人整整一天。
③ 队伍已经陷在泥里了,派教练不派壮丁。借进来的人不替你回工单:他先搞明白上下文,示范一次「好的复盘长什么样」,然后用问题把队伍拽出来——「这条警报如果不响,用户会发现吗?」问到他们自己受不了,就会动手删。
④ 最根本的一步:别再一个个服务地救。与其等服务盖好了再派人审一遍、挑出五十条要改的,不如把好做法做成地基和预制件——新服务盖在上面,天生自带监控、限流、可回滚。审查那步就省了。
顺序有讲究:着火时先做 ②,不挡住打断什么都推不动;然后 ③;喘上气再做 ①;等三五个服务重复同样的苦,才轮到 ④——太早做地基,你不知道该预制哪几件。代价也说清楚:这四件事全靠人的判断和信任,任何一条一旦写成必须签字的硬表格,都会退化成橡皮图章。
救一支被运维压垮的队伍,顺序是:先挡住打断,再请个只问问题的教练,然后认真带人,最后把好做法做成地基。衡量成功的不是「我们接了多少服务」,而是「有多少服务已经不需要我们了」。
想看五章各自的机制、判据、具体数字和示意图? → 切到精读版
你以为 Part IV 是可以跳的「管理章」,其实它回答全书最要命的问题:SRE 这种人力永远不够,怎么办?五章是同一条答案的五段——Ch28 把新人从零带到能值班,而不是当工单海绵;Ch29 承认注意力是会被打断毁掉的资源,于是把中断集中到一个人身上;Ch30 给陷进运维过载的团队派一个「只问问题、不替你干活」的嵌入式 SRE;Ch31 让跨站团队共享同一份现实;Ch32 给出终局:接洽模型从「事后审一个服务」到「早期介入设计」,再到「把生产就绪做进平台,让审查本身消失」。
五章都在《SRE》Part IV「管理」(Ch28–33)里;Ch33 本仓已单独成篇,Ch34 是结语。上承 Part III「实践」的值班、事故与复盘——那些讲「怎么做」,这五章讲「谁来做、怎么让他做得下去」。合成一篇的理由:它们是同一条供给侧链条:造人(28)→ 护人(29)→ 救人(30)→ 共享现实(31)→ 减少对人的需求(32)。任何一环断掉,前面几章的技术手段都会因为「没人有时间做」而停在纸上。
把场景钉死:一个 6 人 SRE 团队接了 3 个服务,每周进来约 40 张工单(每张平均 30 分钟,合 20 小时 ≈ 半个人)、每个 12 小时班次被呼叫 5 次(书里的健康上限是 2 次)。算下来运维类工作已占 70% 左右工时,远破 50% 上限。这时团队会做三件看似合理、实际都在加深困境的事:把新人扔去回工单;每人都半开着门接一点中断;向上要人。
三件都不管用。工单里学到的是反应式碎片知识,一年后仍不能独立处置没见过的故障;全员半接中断等于全员被切碎,项目进度是零;而招一个人到能独立值班要按季度算,远慢于服务增长。
不解决会怎样:团队退化成工单机器,可靠性原地踏步;资深工程师因为「每天都在忙、什么都没推进」而离职,带走唯一那份运行知识;服务最终被退回开发团队——而开发也接不住。SRE 的瓶颈从来不是技术,是人力供给。
本章该被钉在墙上的一句是:别把新人当工单海绵。「先做半年工单熟悉环境」听起来温和,实际在系统性地教坏他——工单流随机、反应式、互不叠加,他学到一堆「遇到 X 就点 Y」,而不是这套系统怎么转。本章把学习路径摆成两条对照轨迹:混乱的(随机、一次性、只记琐碎知识)与有序的(顺序、累积、指向系统本身),要后者。
两条设计原则。教系统和服务,不教琐碎知识(systems and services, not trivia):值得占用新人时间的是「请求从用户到磁盘走过哪几跳」,不是「哪个命令带哪个参数」。给有针对性的项目,不给杂活。
要培养的能力点名三样,恰好都是手册教不了、工单练不出的:逆向工程(拿到没文档的系统能摸出它怎么转)、统计与比较式思考(面对几条可疑路径,用数据而非直觉决定先查哪条)、从第一原理即兴解决(史无前例的故障,能从「它凭什么能工作」推起)。
四件具体做法:灾难角色扮演(Google 内部叫 Wheel of Misfortune,每周一局,一人当「系统」出题、其余人当值班人推演);在受控环境里真弄坏、再真修好;把文档当学徒作业;以及最关键的影子值班:新人与主班并行收呼叫,独立写出「我会怎么处置」再对答案;反过来还有反向影子——新人主处置、老手旁观不出声。
可带走的判据:问一句「新人上岗靠一张清单还是靠时间到了?」答不出清单,就是在用工单量冒充培训。
本章先把运维负荷拆成三类,因为对策完全不同:呼叫(紧急、必须立刻响应)、工单(人发起、可排队)、持续性的运维活动(没有请求人的例行事务,如手工推配置)。混在一起谈「我们很忙」,就不知道该砍哪块。
核心洞察关于人:认知的流态(cognitive flow state)——进入专注要爬坡,被打断一次就滑回坡底,真正的成本不是那十分钟而是重新爬坡。由此得出最反直觉也最该照做的一条:极化时间(polarizing time)——一个人在一段时间里要么 100% 接中断、要么 100% 不被打扰,绝不半开着门。两人各被切碎一半,产出严格小于「一人整天不被打扰 + 一人整天当门神」。
配套做法:设一个明确的中断接收者(interrupt catcher / 门神),全队唯一被允许做杂活的人;中断量要被测量,用「每周工单数 × 每张平均耗时」换算成人力时长,据此决定这角色是半个人还是两个人。减少中断还有两条:重复的工单类别自动化或做成自助;把工单退回源头——根因是产品缺陷就提 bug(手工修得越顺,这缺陷越不会被修)。最后一条纪律:交接中断要连上下文一起交,否则接手人从零重建,这次中断被付两遍。
可带走的判据:如果没人能说出「这周谁是门神」,答案就是「所有人都是,所以没人在做项目」。
本章处理最难的局面:一个团队已掉进运维过载,运维占比破了 50%,而且——这是关键——它已经不相信这件事能被改好。典型症状是告警变成了待办清单:每条都被当成「要处理的一项」,于是没人再问「它凭什么该响」。
解法是派进一名外部 SRE,并明确声明:他不是额外人手,他的产出是这个团队判断力的改变。三个阶段:
① 拿上下文。读复盘、旁听会议、逐条审告警,问三件事:这条是可操作的吗?紧急吗?真的需要人做吗?同时找出最大压力源——往往不是技术难题,而是「把所有告警一视同仁地当紧急」这个习惯。
② 共享上下文。亲手写一份像样的复盘给团队看(示范胜过说教);把「火」分类——是容量不够,还是抽象层漏了、让同一个问题反复换面目出现?分不清,就会一直灭同一把火的不同火苗。
③ 推动改变。先补基本功——这个服务有 SLO 吗?有在拿它量吗?没有 SLO,「该修什么」永远是口味问题。然后清一段场(临时冻结、借人)让团队腾出手。最要紧的是两条方法论:解释你的推理,说清为什么,团队下次才能自己判断;问引导性的问题——别递答案,而是问「这条告警如果根本不响,用户会发现吗?」让团队自己得出结论。自己得出的才守得住。
反面的自我约束同样重要:嵌入的 SRE 绝不能变成这个团队的杂活桶。一旦他替队伍回工单,队伍立刻把他当临时增援,改变就停了——他一走,一切复原。
可带走的判据:嵌入结束时问团队「上个月你们自己删掉了几条告警」。删过,判断力真换了;一条没删、只是积压清了,那就是请了两个月临时工。
SRE 团队天生分布式——跨时区轮值,一天里「谁在班」换两三次。于是有个纯组织问题:怎么让所有人对「这服务现在什么状况」保持同一份认知。
核心制度是生产会议(production meeting):定期(通常每周)开,议程固定——即将到来的生产变更、关键指标、故障、呼叫事件、未呼叫的事件、上次的待办项。最容易被误解的是:这是关于服务的会,不是关于团队的会,不汇报进度、不谈人事。「未呼叫的事件」那栏尤其值得抄:它专收没惊动任何人却挺蹊跷的现象,这常是大故障唯一的早期信号。
团队内部点明三个协作角色:技术负责人(TL)管技术方向,管理者管人与优先级,项目经理管跨团队推进——三件事混在一个人身上,最先被牺牲的总是工程。
跨团队协作的教训来自书里一个真实案例:多个 SRE 团队各造了一套监控面板,于是有人发起统一框架(Viceroy)。第一次尝试失败,原因很不技术:靠各团队匀出的零散工时(「20% 时间」)撑不起平台项目,也没有清晰归属;第二次成功的关键是有了专职的人,加上定义清楚的插件边界——各团队能接自己的数据进来。还有更硬的一条:争取自愿采纳,而不是靠命令推广,强推的平台会被绕开,绕法通常是再造一个私有面板。
可带走的判据:如果跨团队平台项目上没有任何人的主职是它,它的失败已经写好了,只是还没发生。
这是 Part IV 分量最重的一章,也是整条链条的收口。前提是一句冷酷的事实:SRE 人力稀缺,所以「接哪个服务、以什么条件接」必须是显式决定,不能靠谁嗓门大。
第一代工具是 PRR(生产就绪评审),六阶段:接洽(定范围)→ 分析(审设计、监控、故障模式,产出一张必须改的清单)→ 改进与重构 → 培训(SRE 学这个服务、补文档)→ 上线接管(SRE 开始值班,所有权转移)→ 持续改进。
PRR 有两个结构性缺陷。一是太晚:服务已建完甚至已上线,SRE 只能建议改造,而此时改架构最贵——评审里那五十条,一半会因为「要重写太多」被永久搁置。二是不可扩展:一次 PRR 很重,而 SRE 远少于服务,队列只会越排越长。
于是第二代:早期介入(early engagement)——在设计与实现阶段就把 SRE 拉进来,此时改架构便宜一个数量级,SRE 能真正影响设计而不是事后打补丁。代价是能力要求变了:他得能做设计评审、跟设计者争论。
第三代是本章真正的结论,也最容易被跳过:把生产就绪做进框架与平台。与其一个个服务地审,不如提供一套生产就绪的框架——标准的监控与控制面、标准埋点、标准配置与部署形态,把 SRE 经验编码进去。好处是复利式的:运维开销整体下降(所有服务形状一样,一套工具通吃)、最佳实践自动扩散(框架升一版全体受益),而最关键的是接洽本身变轻甚至消失。
可带走的判据:数数过去一年做了几次同样的生产就绪检查。大于三,就该把那张清单变成代码,而不是继续人工重跑。
表 1 · 新 SRE 的四种带法(顺序即用法:项目 → 角色扮演 → 影子值班)
| 做法 | 练出什么 | 代价 / 失效方式 |
|---|---|---|
| 扔去回工单 | 工具链熟、反应快 | 学不到系统怎么转,没见过的故障就停摆——基本别用 |
| 有针对性的小项目 | 端到端理解一条真实路径 | 占用老手评审时间;挑错了会变成杂活 |
| 灾难角色扮演 | 压力下的推理与升级习惯 | 虚构场景,练不到真实系统的脏细节 |
| 影子值班 / 反向影子 | 真实呼叫下的处置判断,能对答案 | 多占一个老手的注意力;轮值太稀凑不够样本 |
表 2 · 三代接洽模型:什么时候该用哪一代
| PRR 事后审 | 早期介入 | 框架与平台 | |
|---|---|---|---|
| 介入时刻 | 建完 / 已上线 | 设计与实现中 | 写第一行代码之前 |
| 改动成本 | 最高(常被搁置) | 低一个数量级 | 近乎为零(默认就对) |
| 投入随服务数 | 线性增长 | 线性增长 | 一次投入、全体复用 |
| 对 SRE 的要求 | 会运维、会体检 | 要能做设计评审并争论 | 要能做产品化的平台工程 |
| 适用时机 | 接手遗留服务、只有一两个 | 有新服务正在设计 | 已有三五个服务在重复同样的苦 |
| 失效方式 | 队列排不完、清单被搁置 | SRE 变成设计评审的橡皮章 | 没专职人手 → 半成品被绕开 |
这五章是今天「平台工程」与「SRE 转型」两套话术的共同源头。Ch32 的第三代几乎逐字预言了内部开发者平台(IDP)、Kubernetes + 服务网格这类路线,也预言了它最常见的死法——没有专职团队的平台会被绕开;Ch29 的门神成了几乎所有基础设施团队的默认排班形态。面试里被问「你们 SRE 怎么和开发分工」,答得出「我们在哪一代接洽模型上、下一步往哪代走」,比答「我们有个 SRE 团队」强一个层级。
50% 上限。即 Ch29 极化时间那条被公开确认一直在用。E. Harvieux「Identifying and tracking toil using SRE principles」, Google Cloud Blog, 2020-02 ↗① Part IV 回答的是 SRE 能否规模化:造人(28)→ 护人(29)→ 救人(30)→ 共享现实(31)→ 减少对人的需求(32)。
② 新人培养要有序累积而非工单冲刷:教系统与服务、不教琐碎知识;给有针对性的项目、不给杂活。出师的判据是一张上岗清单,路径是影子值班 → 反向影子,外加每周一局灾难角色扮演。
③ 要练的三样能力:逆向工程、统计与比较式思考、从第一原理即兴解决——手册教不了,工单练不出。
④ 运维负荷分三类:呼叫 / 工单 / 持续性运维活动;混在一起谈「忙」,就永远不知道该砍哪块。
⑤ 极化时间:一个人要么 100% 接中断、要么 100% 不被打扰,全员半开门的产出严格更差;减少中断则要退回源头——重复类别自动化或自助化,产品缺陷提成 bug。
⑥ 救运维过载派的是教练不是壮丁:拿上下文 → 共享上下文 → 推动改变;手法是解释推理 + 问引导性问题,且绝不当团队的杂活桶。
⑦ 生产会议是关于服务、不是关于团队的会;「未呼叫的事件」那栏常是大故障唯一的早期信号。
⑧ 接洽模型三代:PRR 事后审(太晚、不可扩展)→ 早期介入(改动便宜一个数量级)→ 框架与平台(一次投入、全体复用,评审本身消失)。
⑨ 跨团队平台项目的死因几乎总是同一个:只有零散工时、没有专职的人;且要争取自愿采纳,强推必被绕开。