专业书籍精读 · SRE · 第 34 章
Site Reliability Engineering · Ch 34 · Google · 2016
你每天刷的那些 App 背后,都有一群人专门负责一件事:别挂。这一章是一本七百页厚书的最后两页,作者要干的事只有一件——把前面三十三章拧成一句话说完。
这群人给自己定的目标,不是「永远不出故障」,而是「今年准许挂掉大约半小时」。更怪的是:如果到年底这半小时还没用完,他们会被提醒——你太保守了,去多冒点险。
听起来像在偷懒。其实这是全书最硬的一招:把「别出事」这件没法讨论的事,换成了一件能算账的事。
老办法里,写功能的人和守稳定的人被摆成了对立面:一个想快点上线,一个想少变动。两边都真心觉得自己对,而且谁手上都没有数——于是「这个版本能不能发」就变成了一场比嗓门、比资历、比谁能拖的会。
更麻烦的是,出事之后的第一件事往往是找人。而你想知道故障到底怎么发生的,唯一的信息来源就是当事人的嘴;一开始罚,嘴就闭上了。
三步,一步比一步反直觉。
第一步,把「好不好」变成一个能读的刻度。不再问「系统稳不稳」,改问「一百个人来用,有几个人用得顺」。这个数能读出来,就能被写进纸面:我们这个服务,做到多顺算合格。
第二步,把刻度剩下的那一截,变成一笔能花的钱。合格线定在「一百个人里失败不超过一个」,那「那一个」就是你的额度。它像家庭预算:有余额就敢花——多发版、多上新功能;花光了就停。
第三步,花光了自动踩刹车。注意「自动」两个字:刹车条件是出事之前大家一起写下来的,所以真到那天不用开会吵——规则替你说了。这是全书的枢轴:吵架变成了对账。
剩下两条是配套的:重复的活尽量交给机器,否则人会被日常杂事活埋,永远腾不出手做真正减少故障的事;出事只追「什么条件让这事成为可能」,不追谁干的,因为你要的是真相,而真相只能从人嘴里来。
结果是可靠性从一场嗓门比赛,变成了一次算账:多稳算够、还剩多少额度、这次发版值不值得花——三句话就能问完,而且谁都能对着数字回答。
代价只有一句,但很致命:这套东西成立的前提,是「额度花光了真的能把发布停下来」这件事被老板认过;没有这一条,额度就只是一张挂在墙上的装饰画。
可靠性不是靠更小心、更多人、更长的评审换来的,而是可以被定义、被测量、被预算、被自动执行的:先把「好不好」变成一个读数,再把读数剩下的那一截变成一笔能花的额度,花光就自动停。它要的不是英雄,是一把刻度尺和一条事先写好的规则。
想看 SLI/SLO/错误预算的具体机制、可用性档位的对照表和示意图? → 切到精读版
你以为这本书教的是「怎么别出事」,其实它教的是怎么给出事定价。本章是全书最短的一章,由 SRE 这个词的提出者 Benjamin Treynor Sloss 执笔,任务是把三十三章收束成一条主张:可靠性不是靠更小心、更多人手、更长的评审换来的美德,而是一个可定义、可测量、可预算、可自动执行的工程量。分水岭从来不在工具,而在两件事——把运维问题当软件问题做,以及把「多可靠才够」从价值观争论降级成一道算术题。也正因为靠的是这两条而不是 Google 的机房,它才可能被搬走。
1 − SLO 那一截允许失败的额度。有余额就继续发版,烧光就冻结发布、改投可靠性工作(Ch3)。50%(Ch5)。99.9% 叫三个九,99.99% 叫四个九;每多一个九,允许的不可用时间少一个数量级。本章是 SRE 全书 Part V「结语」的第二章,也是末章:上承 Ch33(从其他行业学到的教训),把 Part I(介绍)、Part II(原则)、Part III(实践)、Part IV(管理)四百多页的东西收进一页。它不引入任何新机制,作用是立论——读法也因此不同:别找新知识,找它在替全书主张什么、以及这个主张的成立条件。对应现实里 SRE 这个岗位在 2016 年之后的扩散,以及 2018 年那本专门补「怎么落地」的续作《The Site Reliability Workbook》。
它要挡的是读者读到最后一页时最可能冒出来的那句话:「有意思,但我不是 Google。」
这句话为什么危险:它把全书结论错误地绑在了 Google 的规模上。真正起作用的那几件东西——一条写下来的合格线、一笔能花的额度、一条事先约定的刹车规则、一场不追人的复盘——没有一件需要几十万台机器才成立;需要规模的是 Borg、Maglev 那层实现,而那层恰恰可以替换。
旧世界的痛在于没有度量,所以只能靠人的品格:开发想快、运维想稳,双方手上都没有数,「这版能不能发」于是变成一场比资历、比嗓门、比谁能拖的会——而组织能想到的唯一补救是加流程。
不解决会怎样?给个量级:99.9% 的服务一年可以合法地不可用约 8.8 小时,99.99% 的只剩 53 分钟,两档的工程成本通常差一个数量级。没人写下来选哪一档,团队就会默认「越高越好」,然后用评审、冻结和人力去堆,最后同时拿到两个坏结果:交付更慢了,可用性并没有更高——拖慢变更不消除故障,只是把故障攒成更大的一批一起上。
本章收束的是全书的四条主张。下面每条都标了它在原书的出处章节,方便回查。
是什么:把「系统稳不稳」这个形容词,换成一个能读出来的数。SLI 是那个数本身(如「返回 200 的请求占比」「P99 延迟」),SLO 是给它划的合格线(如「成功率 ≥ 99.9%,按 28 天滚动窗口算」),SLA 是把线写进对外合同、违约要赔钱的那个版本。
直觉:SLO 是体温计上的刻度,SLA 是保险单。刻度给你自己看,保险单给客户看——所以 SLA 的线一定比 SLO 松(比如 SLO 定 99.9%、SLA 只承诺 99.5%),留出你先发现、先修好的余量。
为什么这样设计:三个概念分开,是为了让「多可靠才够」变成一次可谈判的取舍,而不是一句谁都反驳不了的「越稳越好」。由此得到全书最反直觉的一条结论:100% 是错误的目标——用户手上的 Wi-Fi 和运营商网络本来就只有 99% 量级,你从四个九做到五个九,那点差别被他自己的网络吃掉了;而每多一个九成本上一个台阶,这笔钱本可以拿去做功能。
是什么:1 − SLO 那一截就是你的额度。SLO 是 99.9%,那这个月的额度就是 0.1% 的请求可以失败——换算成时间大约 43 分钟。发版、做实验、改配置都在花这笔钱;余额充足就敢花,烧光就停。
机制(白话):一个闭环控制——测量、比对、分叉、回到测量。关键在那个分叉的条件是出事之前写下来的,所以触发那天不需要开会。
为什么这样设计 / 权衡在哪:它给开发与运维那场结构性对立换了一个共同的度量——两边不再争「该不该发」,而是一起看余额。妙处是两个方向都被约束:烧光就得停;长期花不完则说明线定得太低、过度保守,该去多冒点险。代价也明确:这条规则只有在「冻结」真能执行时才有牙,需要产品与工程的共同上级事先签字认下它。
是什么:琐务(toil)指手工、重复、可自动化、且随规模线性增长的活——扩容、改配置、处理告警工单。书里的判据是:SRE 花在琐务上的时间不应超过 50%,另一半必须用来写能减少未来琐务的软件(Ch5)。
为什么这样设计:这条上限不是福利,是防止团队被自己的成功压死。运维工作量若随规模线性增长,服务涨十倍就得招十倍的人,而人手一涨再没人有空做自动化——一条自我锁死的路。把一半时间从锅炉房里抢出来,规模与人手才能脱钩。
权衡:50% 这个数字是管理杠杆,不是科学结论。它真正的作用是给团队一句能对上级说的话——「这个月琐务已经 70% 了,得把一部分退回给开发团队」;书里明确允许这种退回(把值班责任交还开发),而不是要 SRE 扛下一切。
是什么:无指责复盘只问「什么条件让这个错误成为可能」,不问「谁干的」。配套的是把值班的人也当系统组件来设计:限制单人单次值班的事件数、事后有补休、每条告警都配可执行的操作手册(Ch11–16)。
直觉:这不是宽容,是算计。故障的真实经过只存在于当事人的记忆里,你没办法强制取出来;一旦开始罚说真话的人,换来的是更漂亮的报告和更贫瘠的信息。
权衡:无指责不等于无责任。不追人指的是不用惩罚去换真相,不是不改流程、不收权限、不认损失。把它理解成「谁都不用负责」,复盘就退化成走过场——这是这套做法在真实组织里最常见的死法。
这一章留给读者的第一个决定不是「要不要做 SRE」,而是那条线定在哪。每多一个九,代价不是线性的。
| SLO | 每年允许不可用 | 每月约 | 这一档通常需要 | 代价 |
|---|---|---|---|---|
| 99% | 约 3.7 天 | 约 7.2 小时 | 单区域、人工恢复即可 | 够用的场景比想象多:内部工具、后台批处理 |
| 99.9% | 约 8.8 小时 | 约 43 分钟 | 有值班、有监控告警、能在小时级恢复 | 要有人被叫醒;一次长故障就吃掉全年额度 |
| 99.95% | 约 4.4 小时 | 约 22 分钟 | 多可用区、自动化回滚、灰度发布 | 发布流程变重,变更速率下降 |
| 99.99% | 约 53 分钟 | 约 4.3 分钟 | 多区域、自动故障转移、定期演练 | 人已经来不及反应:恢复必须自动化,成本上一个台阶 |
| 99.999% | 约 5.3 分钟 | 约 26 秒 | 冗余到每一层,且依赖链上每一环都更高 | 常常无法兑现:用户自己的网络可靠性还不到这个量级 |
判据很朴素:先看依赖链上最弱的那一环,你的目标不可能显著高于它;再拿故障的实际代价(一小时不可用损失多少钱、掉多少用户)去和「多花一个数量级的钱」比。99.99% 是一道门槛:从被叫醒到恢复只剩几分钟,人的反应时间已经不够,恢复必须由机器完成。
第二个决定是用哪种组织模式去承载这件事。
| 模式 | 谁背可靠性 | 谁能停发布 | 适合 | 失效模式 |
|---|---|---|---|---|
| 传统 Ops (开发 / 运维分离) | 运维部门,但没有代码权 | 靠评审会与冻结期,人治 | 变更少、系统稳定的存量业务 | 两边目标相反且都没有数据;补救只剩加流程,交付越来越慢而故障未减 |
| DevOps (谁写谁运维) | 开发团队自己 | 团队自己,无外部刹车 | 小团队、服务边界清楚、故障代价可控 | 缺独立度量时容易「自己给自己打合格」;值班压力直接压在特性交付上 |
| SRE (本书) | 共背:SLO 是双方的共同契约 | 规则:额度烧光自动冻结 | 规模或故障代价大到值得设一支带工程产出的团队 | 高层不认「冻结」就只是装饰;把 SRE 当背锅的运维外包则退化回传统 Ops |
三行里真正的分界线是第三列:刹车由人治还是由规则——SRE 的全部制度设计,都是为了把那个决定从事故现场搬到事故之前。
这一章能兑现成一份按顺序照做的最小清单:① 给最重要的那个服务挑一个 SLI(先选「请求成功率」);② 定一条你真愿意兑现的 SLO;③ 写下额度烧光时的动作,并让能拍板的人签字;④ 量一量团队的琐务占比;⑤ 下次故障做一场不追人的复盘。五步都不需要 Google 的机房,只需要有人愿意先写下那条线。
落到面试与架构评审上,它是三个问题:这个服务的 SLI 是什么?SLO 定在哪、凭什么?额度烧光了谁有权停发布?答不出第三个,前两个就只是 PPT。
① 核心命题:可靠性不是美德,是可定义、可测量、可预算、可自动执行的工程量;SRE 的分水岭在于把运维问题当软件问题做。
② 三层刻度:SLI 是读数、SLO 是自己划的合格线、SLA 是会赔钱的对外承诺;SLA 必须比 SLO 松。而 100% 是错误的目标——用户自己的网络只有 99% 量级,多出来的九他看不到。
③ 错误预算 = 1 − SLO 那一截,是一个负反馈回路:烧光自动冻结发布,长期花不完说明你太保守,两个方向都被约束。
④ 档位是有门槛的:99.9% 一年可以挂 8.8 小时,99.99% 只剩 53 分钟——过了四个九,人的反应时间就不够了,恢复必须自动化。
⑤ 琐务上限 50% 的真实作用是让规模与人手脱钩;它依赖一个前提——SRE 有权把活退回给开发团队。
⑥ 无指责复盘是算计不是宽容:真相只存在于当事人嘴里;但不追人 ≠ 不追责,否认这一点复盘就成了走过场。
⑦ 全书的枢轴是把「该不该发」的决定从事故现场搬到事故之前;而最该记住的怀疑是——如果你们的额度从没导致任何一次发布被推迟,你们就没有在用它,因为它真正的前置条件是「有人有权拒绝上线」。