前面五章教你怎麼看見系統。這一章要處理一個它們全部都回答不了的問題:
「p99 是 300 毫秒」——這樣算好還是不好?
沒有基準的時候,這個問題只有兩種答案:工程師覺得「還可以」,或產品覺得「太慢了」。而兩邊都沒有證據,於是它變成一場意見之爭。ch03 那場「SLO 月月達標但客訴不斷」的事故,根源之一就是沒有人能反駁那張綠色的儀表板。
SLO 要做的就是把這件事變成一個雙方都同意的數字,而它真正的產出不是儀表板,是決策:
「這一季的錯誤預算已經燒掉 90%,所以新功能暫停,這兩週全部投入穩定性。」
**能不能講出這句話,就是 SRE 與一般維運的分水嶺。**而且它需要的不只是技術—— 它需要一份事先寫好、管理層簽過名的政策。
這一章要拆的是:
這一章的 SLI 全部建立在 ch01 那條原則上:症狀優先於原因。SLI 必須從使用者的位置量,不能從機器指標推導。
SLI(Service Level Indicator)就是「衡量服務好壞的那個數字」。而它有一個特別好用的標準形式:
SLI = 好事件的數量 / 有效事件的數量 × 100%看起來平淡,但這個形式解決了三個實務問題。
0.3 正好是一個 bucket 邊界(ch03 的建議),它還是精確值而不是插值。sum(rate(http_request_duration_seconds_bucket{le="0.3"}[30d]))
/
sum(rate(http_request_duration_seconds_count[30d]))分母不是「所有請求」,是「應該被算進來的請求」:
因為 SLI 是一個比例,1 - SLO 就直接是「允許失敗的比例」——這是後面整章的基礎。
| 類型 | 問的問題 | 典型定義 |
|---|---|---|
| 可用性 | 能不能用 | 成功回應數 / 有效請求數 |
| 延遲 | 夠不多快 | 在 X 毫秒內完成的請求比例 |
| 品質 | 回的東西完整嗎 | 非降級回應的比例(推薦系統退回熱門清單也算失敗) |
| 新鮮度 | 資料多舊 | 資料延遲小於 X 秒的查詢比例(讀寫分離、快取、報表) |
| 正確性 | 算得對嗎 | 對帳一致的紀錄比例(最難量但常常最重要) |
大部分服務用「可用性 + 延遲」兩個就夠了。而如果你的系統有快取或複本,新鮮度往往是使用者實際抱怨的那一個(ch07 會回到這件事)——「我剛改的資料不見了」就是新鮮度問題。
SLI 最常見的錯誤不是算錯,是選錯量測對象。
❌ CPU 使用率 < 80% 的時間比例
❌ 5xx 錯誤率 < 0.1%
❌ 所有 pod 都健康的時間比例這些全部是白箱指標,而 ch01 已經證明過它們的盲點:請求根本沒進來的時候,這些數字全都很漂亮(TLS 憑證那個案例)。
付款 → 99.95% 成功,99% 在 2 秒內 (壞了直接損失營收)
搜尋 → 99.9% 成功,95% 在 500ms 內 (慢一點使用者會忍)
報表 → 99% 成功,90% 在 10 秒內 (內部使用,可以重試)把所有東西都訂成一樣高,等於沒有優先級。而 SLO 的價值有一半來自它強迫你講清楚「什麼比較重要」。
SLI 定好之後,回頭問一句:「上次那場事故,這個 SLI 有掉下來嗎?」
如果沒有,那它就選錯了——SLI 的唯一價值,是在使用者受影響時它要跟著動。拿過去半年的事故清單來對照,是驗證 SLI 最快的方法。
訂 SLO 時最直覺的想法是「越高越好」,而這個直覺會導致最糟的結果。
| SLO | 每月允許的失敗時間 | 每月允許的失敗請求(100 萬 req/日) |
|---|---|---|
| 99% | 約 7.3 小時 | 30 萬 |
| 99.9% | 約 43 分鐘 | 3 萬 |
| 99.95% | 約 22 分鐘 | 1.5 萬 |
| 99.99% | 約 4.3 分鐘 | 3 千 |
| 99.999% | 約 26 秒 | 300 |
你的服務 依賴 資料庫(99.95%) + 快取(99.9%) + 支付閘道(99.9%)
理論上限 = 0.9995 × 0.999 × 0.999 ≈ 99.75%所以在這個架構下訂 99.99% 是不可能達成的,除非你為每個依賴做降級或容錯(快取失效時能降級、支付失敗能重試——見 高可用防禦)。SLO 不只是一個目標,它同時是對架構的要求。
這是整章、也是整軌最重要的一節。錯誤預算把「可靠性」從一個模糊的價值觀,變成一個可以被分配、被花用、被爭論的資源。
錯誤預算 = 1 - SLO
SLO 99.9%,一個月 3,000 萬次請求
→ 預算 = 0.1% × 3,000 萬 = 30,000 次失敗一份沒有後果的 SLO 是裝飾品。所以必須事先寫下 error budget policy——而且要有人簽字:
預算剩餘 > 50% → 正常發版,可以做風險較高的實驗
預算剩餘 20~50% → 正常發版,但高風險變更需要額外審查
預算剩餘 < 20% → 只發修 bug 與穩定性相關的變更
預算用完 → 凍結功能發版,全隊投入可靠性工作,直到預算回補
連續兩個週期用完 → 重新檢視 SLO 是否訂得不合理,或架構是否需要投資-- 30 天滾動視窗的預算消耗率
1 - (
sum(rate(http_requests_total{status!~"5.."}[30d]))
/
sum(rate(http_requests_total[30d]))
) / (1 - 0.999)
-- 結果 0.85 → 已經燒掉 85% 的預算錯誤預算的儀表板有一個問題:等你看到「預算用完了」,事情已經發生完了。burn rate 告警要解決的就是這個。
burn rate = 目前的錯誤率 / 允許的錯誤率
SLO 99.9%(允許 0.1% 失敗)
目前錯誤率 1% → burn rate = 10
→ 代表以這個速度,30 天的預算 3 天就會燒完單一門檻永遠是錯的:門檻設高只抓得到災難、設低會被小抖動吵醒。解法是同時看快與慢兩種燒法,而且每一種都配一個長視窗與一個短視窗。
| 燃燒率 | 長視窗 | 短視窗 | 多久燒完預算 | 動作 |
|---|---|---|---|---|
| 14.4× | 1 小時 | 5 分鐘 | 約 2 天 | 立刻叫人(page) |
| 6× | 6 小時 | 30 分鐘 | 約 5 天 | 叫人(page) |
| 3× | 1 天 | 2 小時 | 約 10 天 | 開工單(ticket) |
| 1× | 3 天 | 6 小時 | 剛好期末用完 | 開工單 |
-- 快速燃燒告警:長短視窗都要超標
(
slo:error_ratio:rate1h > 14.4 * 0.001
and
slo:error_ratio:rate5m > 14.4 * 0.001
)某團隊在一年前導入 SLO,做得很認真:儀表板漂亮、burn rate 告警都設好了。一年後回頭看:
拆開來看,三件事同時錯了。
資料庫 99.95% × 支付閘道 99.9% × 簡訊供應商 99.5%
≈ 99.35% ← 理論上限就已經低於目標這個 SLO 在架構上就不可能達成,而且沒有人算過這件事。| SLO | SLA | |
|---|---|---|
| 對誰 | 對內部,工程與產品之間的約定 | 對客戶,寫在合約裡 |
| 違反的後果 | 觸發 error budget policy(凍結發版等) | 賠錢、退款、法律責任 |
| 數字關係 | 要比 SLA 嚴格 | 比 SLO 寬鬆——留緩衝給自己 |
SLO 必須比 SLA 嚴格,這樣你會在賠錢之前就先被自己的機制攔下來。兩者訂成一樣是常見的錯誤——那等於沒有任何預警空間。
下一章處理最後一塊:有了 SLO 與 burn rate,什麼時候該把人叫醒?而更重要的是——什麼時候不該。
| 類型 | 問題 | 定義形式 | 什麼時候特別重要 |
|---|---|---|---|
| 可用性 | 能不能用 | 成功回應數 / 有效請求數 | 所有服務的基本盤 |
| 延遲 | 夠不夠快 | 在 X 毫秒內完成的比例(不是 p99) | 面向使用者的互動 |
| 品質 | 回的東西完整嗎 | 非降級回應的比例 | 有降級機制的系統(推薦、搜尋) |
| 新鮮度 | 資料多舊 | 延遲小於 X 秒的查詢比例 | 讀寫分離、快取——「我剛改的資料不見了」 |
| 正確性 | 算得對嗎 | 對帳一致的紀錄比例 | 金流、計費——最難量但常常最重要 |
| SLO | 每月可失敗時間 | 意味著什麼 |
|---|---|---|
| 99% | 約 7.3 小時 | 內部工具、非關鍵服務 |
| 99.9% | 約 43 分鐘 | 多數線上服務的合理起點 |
| 99.95% | 約 22 分鐘 | 關鍵交易路徑;需要良好的部署與回滾機制 |
| 99.99% | 約 4.3 分鐘 | 一次失敗的 failover 就吃掉大半;需要多區容錯 |
| 99.999% | 約 26 秒 | 人類來不及反應,所有恢復必須自動化 |
| 100% | 0 | 物理上不可能,且會扼殺所有變更 |
| 燃燒率 | 長視窗 / 短視窗 | 多久燒完預算 | 動作 |
|---|---|---|---|
| 14.4× | 1 小時 / 5 分鐘 | 約 2 天 | 立刻叫人(page) |
| 6× | 6 小時 / 30 分鐘 | 約 5 天 | 叫人(page) |
| 3× | 1 天 / 2 小時 | 約 10 天 | 開工單(ticket) |
| 1× | 3 天 / 6 小時 | 剛好期末用完 | 開工單 |
| 短視窗的作用 | 確認問題仍在持續 | — | 讓告警在恢復後自動解除,而不是多響 55 分鐘 |
點擊卡片翻面查看答案,共 13 張。