SLO 与错误预算 · 云与可靠性
一个服务应该有多可靠?又怎么知道它不够可靠?
课程目录为什么需要它
「永不宕机」做不到,追求它只会让团队寸步难行。站点可靠性工程(SRE)用一个大家都认可的数字——SLO——来代替它,再把它与 100% 之间的差距变成错误预算:留给发布和试验的空间。预算消耗太快,你就会被叫起来处理;预算充足,你就放心发布。
直觉理解
- SLI(指标):你测量的东西,等于 好的事件 ÷ 全部事件。比如:300 毫秒内成功响应的请求 ÷ 全部请求。
- SLO(目标):SLI 在一个时间窗口内要达到的目标。比如:30 天内 99.9%。
- 错误预算:
1 − SLO。30 天 99.9% 允许 0.1% 是坏的:30 × 24 × 60 × 0.001 = 43.2 分钟的完全宕机,或者同样比例的失败请求。
消耗速率(burn rate)表示你花预算的速度:错误率 ÷ (1 − SLO)。速率为 1 时,整个窗口正好把预算花完;速率为 10 时,十分之一的时间就花完了。
Google 的《SRE 工作手册》建议:30 天预算的 2% 在一小时内烧掉时就呼叫值班的人,对应的消耗速率是 0.02 × 720 小时 ÷ 1 小时 = 14.4。烧得慢一些的,就变成工作时间处理的工单。
每多一个 9,预算就小十倍:99.99% 一个月只剩大约 4.3 分钟。
定义
SLI 服务水平指标
Service level indicator: the share of good events, such as successful fast requests ÷ all requests.服务水平指标:好事件所占的比例,比如成功且快速的请求 ÷ 全部请求。
SLO 服务水平目标
Service level objective: the target for an SLI over a time window, like 99.9% over 30 days.服务水平目标:SLI 在一段时间窗口内的目标,比如 30 天内 99.9%。
错误预算
1 − SLO: how much failure is acceptable in the window.1 − SLO:窗口内可以接受多少失败。
消耗速率
Error rate ÷ (1 − SLO). Above 1, the budget runs out before the window ends.错误率 ÷ (1 − SLO)。大于 1 时,预算会在窗口结束前耗尽。
示例
以分钟计的预算
动手试试每种 SLO 在 30 天里允许多少宕机时间。
minutes = 30 * 24 * 60
for slo in [0.99, 0.999, 0.9999]:
budget = (1 - slo) * minutes
print(f"{slo:.2%}: {budget:.1f} minutes")99.00%: 432.0 minutes 99.90%: 43.2 minutes 99.99%: 4.3 minutes
- L130 天有 43,200 分钟。
- L3预算就是允许失手的那部分。
- L4每多一个 9,预算就缩小十倍。
消耗速率
动手试试把当前的错误率和 SLO 允许的比较。
def burn_rate(errors, requests, slo):
return (errors / requests) / (1 - slo)
print(round(burn_rate(50, 100_000, 0.999), 2))
print(round(burn_rate(1_500, 100_000, 0.999), 2))0.5 15.0
- L2错误率除以允许的错误率。
- L4错误率 0.05%,允许 0.1%:半速,没问题。
0.5 - L5错误率 1.5%:快了 15 倍。超过 14.4:该叫人了。
15.0
常见错误
追求 100%
用户自己的网络都比这更常出问题,而每次改动都有风险。SLO 定得比用户的需要高一点就够了,留出空间去改进产品。
测错了东西
CPU 和内存不是用户感受到的东西。要从用户那一侧测量:成功而且快速的响应。
每个错误都报警
为不威胁 SLO 的事情呼叫值班,会让大家学会无视报警。只对快速的消耗速率报警。
小测验
1. SLO 是 30 天 99.5%。错误预算允许多少完全宕机的时间?
查看答案
答案:A
0.005 × 43,200 分钟 = 216 分钟,三个半小时多一点。
2. 这段代码会输出什么?
slo = 0.999
errors, requests = 300, 100_000
print(round((errors / requests) / (1 - slo), 1))查看答案
答案:A
错误率 0.3% ÷ 允许的 0.1% = 3:预算会在窗口的三分之一时间里花完。
动手练习
3 道练习,分三层:先预测程序的输出,再按新需求改程序,最后从零写一个。代码在浏览器里运行,提交马上判题。
- 预测输出一个月的请求
准确写出它打印的内容。
- 改需求修好预算
budget_minutes(slo, days)应该返回在days天里,SLO 允许多少分钟的完全宕机,保留 1 位小数。它现在返回的数字大得离谱。修好它。 - 从零写要不要叫人?
写一个
alert(errors, requests, slo),返回:- 消耗速率 大于等于 14.4 →
"page" - 大于等于 1(但小于 14.4)→
"ticket" - 其他情况 →
"ok",包括没有任何请求的时候
消耗速率 =
(errors / requests) / (1 - slo)。比较之前把消耗速率四舍五入到 6 位小数,避免浮点数的微小误差。 - 消耗速率 大于等于 14.4 →
本课术语
| 术语 | 中文 | 英文定义 |
|---|---|---|
| SRE | 站点可靠性工程 | Site reliability engineering: running services with software and agreed reliability targets. |
| SLO | 服务水平目标 | The reliability target, such as 99.9% over 30 days. |
| Error budget | 错误预算 | 1 − SLO: the failure you can afford. |
| Burn rate | 消耗速率 | How fast the error budget is being spent. |