今天,我們將聊聊網站可靠性工程 (Site Reliability Engineering, SRE) 方法論,,將 系統可靠性
從一個模糊的概念轉化為一門可量化的工程學科。
在現代軟體開發的戰場上,一場永無休止的拉鋸戰幾乎在每個組織中上演:
傳統上,這兩股力量的目標看似根本對立,兩者的溝通往往充滿了摩擦、猜疑與主觀的情感辯論。
「你們的新功能搞爆了伺服器!」
「你們的流程限制了創新!」
這樣的爭吵,是許多工程師白日與深夜的夢魘。
這種衝突,源於雙方缺乏一個共同的語言和目標,雖然我們在<跨團隊協作設計:技術文件、OpenAPI、共用契約 : API 文檔化與團隊協作標準建立>中有說到系統邊界的共同默契,但這次的拔河本質上來說更接近 零和競賽 ,想要追求功能快速發布就不能百分百確保功能的完整,反之亦然,要百分百確保功能的完整就有可能賠上進入市場的時機,一個是尋找新的系統生命依據,一個是確保當前的系統生命依據。兩者並沒有對錯,著重在立場而已。
SRE (Site Reliability Engineering)
的誕生,就是為了解決這個衝突,它提出了一個革命性的觀點:
我們 不應該問「是否要踩煞車」 ,而 應該問「我們離前方的懸崖還有多遠?」
SLI, SLO, 和 Error Budget,就是我們用來精確測量「與懸崖之間距離」的工程儀器。
我有幸在撰寫這個系列文章的時候(2025)見證到人類殖民太空的希望,晶片的突破、算力的解放與 AI 的精度提高,複合性的因子正在解放傳統人力的勞動成本。伊隆·馬斯克是一個夢想家,他本可將資產再次投入到舊時代金融遊戲之中成為新一代的華爾街家族,但卻選擇了將資產投入至新時代的太空火箭研發上開拓人類未來的可能性。如果機會,我會主動報名太空冒險與前往殖民 - 地球的重力束縛了我的靈魂,接下來,請包容一下我的任性與浪漫,讓我用太空殖民的「氧氣預算」來做舉例說明。
月球殖民隊的「氧氣預算」—— 生存與探索的平衡
我們是一艘月面探險船的船長,任務是探索一個人類從未到過的月球峽谷。探險船上最主要有兩個團體:
如果沒有 SRE,這將是一場意志力的較量,科學家會不斷施壓、要求「再多待一小時」,而工程師會堅決反對,理由是「安全第一」。
SRE 的導入,就是將「氧氣存量」明確定義為錯誤預算。
現在,所有決策都變得清晰:
船長和所有船員都能在一個巨大的螢幕上看到預算的即時消耗情況。科學家可以自主決定如何「花費」他們的預算來最大化科研成果。一旦預算消耗殆盡,警報會自動響起,系統會鎖定高耗能設備,探險艇必須無條件返航。
SRE 的重要性:它將「風險」這個模糊的概念,轉化為一個可以被量化、被交易、被管理的戰略資源。它讓團隊不再爭論「要不要冒險」,而是共同決策「我們的風險預算應該花在哪個最值得的地方」。
SRE 的核心洞見在於:系統的可靠性不應該是一個模糊不清、無法捉摸的藝術,而是一門可以被 精確定義
、 量化
、並透過 工程方法
來系統性提升的科學。
SRE 的第一個顛覆性思維是: 100% 的可靠性是一個謊言,更是一個陷阱。
追求絕對的完美,不僅成本高昂到不切實際,更會扼殺所有創新的可能性,況且,使用者其實 並不在乎我們的系統是否達到 100% 可用 ,他們 在乎的是系統在他們需要時「足夠可靠」。
因此,SRE 的核心不是「消除」錯誤,而是將「錯誤」或「不可靠」視為一種有限的、可管理的資源,這就引出了我們今天的三個主角: SLI (Service Level Indicators)、SLO (Service Level Objectives) 、Error Budget (錯誤預算)
100% 可靠性的神話與陷阱
追求「五個九」(99.999%) 甚至更高的可靠性,不僅在技術上幾乎不可能(我們無法控制骨幹網路、硬體故障,甚至太陽閃焰),在商業上更是一個災難。可靠性的成本並非線性增長,而是指數級的。
最關鍵的是,這鉅額的投入,使用者真的在乎嗎?為了避免一年中額外的 5 分鐘停機,而放棄開發使用者真正期盼的新功能,這筆交易真的划算嗎?SRE 強迫我們問這個問題。
SRE 提出了一個顛覆性的觀點:系統的可靠性,不由我們的伺服器決定,而由我們的使用者定義。
如果我們的系統在凌晨三點,當所有使用者都在睡覺時,當機了一小時,那麼從使用者的角度來看,我們的可用性是 100%。反之,如果我們的網站伺服器全部正常運行,但因為後端資料庫的查詢緩慢,導致每個頁面都需要 30 秒才能載入,那麼從使用者的角度來看,我們的服務就是 「不可用」 的。
這就是為何我們在前一堂課強調 SLI 必須反映使用者體驗。我們守護的不是機器的運行燈號,而是使用者的滿意度。
「適度可靠」(Appropriately Reliable) 中的「適度」二字,是 SRE 的精髓。它承認可靠性是產品的一個功能 (feature),它有成本,也帶來價值。因此,可靠性的等級應該是一個有意識的、數據驅動的商業決策,而非一個無限追求的技術指標。
一個醫院的心律調節器監控系統,和一個線上梗圖產生器,它們所需要的「適度」可靠性,顯然天差地遠。SRE 的任務,就是與產品和業務方合作,精確定義出符合該產品定位的 SLO,不多不少,恰到好處
系統應該「足夠可靠」,而不是「完美可靠」
這個「足夠」的標準,就是通過 SLI 和 SLO 來科學定義的。
SLI (Service Level Indicators) → 「如何量化」
SLO (Service Level Objectives) → 「目標是什麼」
Error Budget (錯誤預算) → 「如何決策」
如果說「適度可靠」是 SRE 的指導思想,那麼以下三大支柱,就是將思想轉化為日常實踐的行動框架:
支柱一:以數據定義目標 (Defining Goals with Data)
支柱二:致力消除瑣務 (Engineering against Toil)
支柱三:擁抱風險與管理失敗 (Embracing Risk & Managing Failure)
在建立了 SRE 的宏觀思維框架,現在是時候深入其最關鍵的實踐基礎——服務等級指標 (SLI)。
SLI (Service Level Indicator) 是我們用來衡量服務健康狀況的「體溫計」。
一個好的 SLI,必須滿足一個黃金法則: 它必須能反映真實的使用者體驗 。 我們的伺服器 CPU 使用率是 10% 還是 90%,使用者毫無感覺;但他們點擊「購買」按鈕後,頁面是 0.5 秒載入完成還是 5 秒才回應,這是他們能切身感受到的。
所以,SLI 是從外向內看的指標。我們來舉幾個例子:
定義 SLI 的過程,就是強迫我們從工程師的本位主義中跳脫出來,開始用我們使用者的眼睛去審視我們自己的產品。
在建立了 SRE 的宏觀思維框架,現在是時候深入其最關鍵的實踐基礎——服務等級指標 (SLI)。
如果說 SRE 是一門將可靠性科學化的工程學科,那麼 SLI 就是這門科學的度量衡單位。沒有精確的度量,一切的目標(SLO)與預算(Error Budget)都只是空中樓閣。
SLI 必須:
1. 絕對的「使用者導向」(User-Centricity)
這是最重要的第一原則。永遠要問: 「我的使用者在乎什麼?」
而不是 「我的伺服器在做什麼?」
2. 可量化與標準化 (Quantifiable & Standardized)
SLI 必須是一個可以計算的數字,通常是比例或分佈。最常見的標準化格式是:
SLI = (好的事件數量 / 有效的事件總數) * 100%
這個簡單的公式強迫我們去清晰地定義何謂「好」的事件、何謂「有效」的事件。例如,對於一個 API 的可用性 SLI:
3. 少即是多 (Less is More)
一個服務不應該有幾十個 SLI。過多的指標會導致雜訊過多、警報疲勞,並模糊了真正重要的焦點。通常,一個關鍵的使用者旅程,只需要關注 2-3 個核心的 SLI 就足夠了(例如,可用性、延遲、正確性)- 我們要關注的是 資訊濃度。
4. 涵蓋關鍵使用者旅程 (Cover Critical User Journeys)
我們的服務中,並非所有功能都同等重要。我們需要識別出那些對使用者和業務價值最高的路徑,並優先為它們定義 SLI。
SLI 的四大類型 (Four Golden Signals):
信號類型 | 定義 | 使用者關心的問題 | AWS 實作範例 |
---|---|---|---|
延遲 (Latency) | 處理請求所需的時間 | 「網站載入速度如何?」 | CloudWatch ResponseTime |
流量 (Traffic) | 系統需求的度量 | 「系統能處理多少使用者?」 | CloudWatch RequestCount |
錯誤 (Errors) | 失敗請求的速率 | 「功能是否正常工作?」 | CloudWatch 4xx/5xx Error Rate |
飽和度 (Saturation) | 服務資源使用程度 | 「系統會不會崩潰?」 | CloudWatch CPU/Memory Utilization |
身為一個「系統與體驗的架構師」(Architect of Systems & Experiences),我們的任務不僅是建構系統,更是要確保我們所建構的系統,真正在為最有價值的「體驗」服務。辨別出這些關鍵路徑,就是我們架構工作的「定錨點」。
** SRE 實踐的核心不僅是一個
技術問題
,更是一個商業策略問題
。SRE 實踐的核心其實是:「如何找到一個數位產品的靈魂?」
**
這不應該只靠直覺,而是需要一套系統性的方法論。我這邊分享當初在執行數位行銷投放的一個結合價值與頻率的二維框架,以及一套三層透鏡的分析法,來精準地定位這些路徑。
首先,要辨別一個使用者路徑的重要性,我們必須從兩個維度去評估它:它為業務帶來多少 價值 (Value) ,以及它被使用的 頻率 (Volume)。將所有功能與路徑放入這個四象限中,它們的優先級便一目了然。
quadrantChart
title SRE 優先級矩陣:業務價值 vs 使用頻率
x-axis "低頻率" --> "高頻率"
y-axis "低價值" --> "高價值"
quadrant-1 "生命線 (The Lifeline)"
quadrant-2 "關鍵時刻 (Critical Moments)"
quadrant-3 "周邊功能 (Periphery)"
quadrant-4 "基礎設施 (Foundation)"
"商品搜尋": [0.8, 0.9]
"影片播放": [0.85, 0.95]
"訊息流載入": [0.9, 0.85]
"結帳流程": [0.2, 0.95]
"用戶註冊": [0.15, 0.9]
"訂閱付費": [0.1, 0.95]
"修改頭像": [0.1, 0.1]
"撰寫評價": [0.2, 0.15]
"更換主題": [0.05, 0.05]
"用戶登入": [0.7, 0.3]
"訂單歷史": [0.6, 0.25]
"發表評論": [0.65, 0.2]
第一象限:生命線 (The Lifeline) - 高價值,高頻率
特徵:這是我們產品的心跳。使用者每天、每小時都在使用這些功能,並且它們直接或間接地貢獻了絕大部分的商業價值。
範例:
SRE 策略:必須設定最嚴苛的 SLI/SLO。可用性、延遲、正確性三者缺一不可。錯誤預算極其珍貴,任何消耗都需立刻警覺。這是我們需要投入最多監控與自動化資源的地方。
第二象限:關鍵時刻 (The Critical Moments) - 高價值,低頻率
特徵:這些是決定性的、高風險的「臨門一腳」。使用者不常執行,但一旦執行,就絕對不容許失敗。失敗的後果往往是直接的營收損失或用戶流失。
範例:
SRE 策略:SLO 同樣嚴苛,尤其是在可用性 (Availability) 與正確性 (Correctness) 上。延遲的容忍度可能稍高於第一象限,但失敗是不可接受的。災難恢復計畫與數據一致性的保障是此象限的重點。
第三象限:周邊功能 (The Periphery) - 低價值,低頻率
特徵:這些是次要或輔助性的功能,對核心體驗影響不大。
範例:
SRE 策略:設定最寬鬆的 SLO。監控的重點是確保它們「沒有完全壞掉」,而不是追求極致的性能。這些功能的錯誤預算可以相對充裕,甚至可以作為新技術或高風險變更的試驗田。
第四象限:基礎設施 (The Foundation) - 低價值,高頻率
特徵:這些是構成使用者體驗背景的基礎功能。它們本身不直接創造巨大價值,但如果它們壞了,會讓整個產品感覺「不對勁」,影響使用者信任感。
範例:
SRE 策略:需要可靠,但 SLO 可以比前兩者寬鬆一些。重點在於穩定與一致。我們可以容忍短時間的性能下降,但不能完全不可用。自動化修復 (self-healing) 是此處的關鍵。
我們有了基礎框架後,要如何將功能準確地填入象限中?我們需要透過三種不同的「透鏡」去審視我們的產品,這就是我們的標準作業程序 (SOP)。
要精準地辨別出使用者旅程的重要性,我們必須從三個不同的角度來審視我們的產品。這套三層透鏡的分析法,能確保我們不會遺漏任何關鍵的洞察。
graph TD
A[產品功能清單] --> B[第一層:數據透鏡]
A --> C[第二層:質化透鏡]
A --> D[第三層:戰略透鏡]
B --> B1[網站分析工具<br/>Google Analytics]
B --> B2[應用效能監控<br/>APM: Datadog, New Relic]
B --> B3[後端日誌分析<br/>Logs & Metrics]
B1 --> B4[流量/請求量數據<br/>定位 X 軸:頻率]
B2 --> B5[轉換漏斗分析<br/>識別流失環節]
B3 --> B6[功能使用率統計<br/>營收貢獻分析<br/>定位 Y 軸:價值]
C --> C1[產品經理訪談<br/>商業目標理解]
C --> C2[客服團隊反饋<br/>用戶痛點識別]
C --> C3[業務/銷售團隊<br/>付費意願分析]
C --> C4[用戶直接訪談<br/>真實需求挖掘]
C1 --> C5[核心功能識別]
C2 --> C6[關鍵問題定位]
C3 --> C7[商業價值驗證]
C4 --> C8[用戶體驗洞察]
D --> D1[公司 OKRs<br/>季度/年度目標]
D --> D2[商業模式畫布<br/>Business Model Canvas]
D --> D3[競爭對手分析<br/>市場定位]
D1 --> D4[品牌承諾分析<br/>最快/最可靠/最便宜]
D2 --> D5[戰略目標對齊<br/>成長引擎識別]
D3 --> D6[未來發展規劃<br/>新功能優先級]
B4 --> E[綜合分析]
B5 --> E
B6 --> E
C5 --> E
C6 --> E
C7 --> E
C8 --> E
D4 --> E
D5 --> E
D6 --> E
E --> F[SRE 優先級矩陣<br/>業務價值 vs 使用頻率]
F --> F1[生命線<br/>高價值 + 高頻率]
F --> F2[關鍵時刻<br/>高價值 + 低頻率]
F --> F3[基礎設施<br/>低價值 + 高頻率]
F --> F4[周邊功能<br/>低價值 + 低頻率]
style B fill:#e1f5fe
style C fill:#f3e5f5
style D fill:#e8f5e8
style E fill:#fff3e0
style F fill:#ffebee
第一層:數據透鏡 (The Quantitative Lens) - 客觀事實
這是我們的第一步,用數據說話。
工具:網站分析工具 (Google Analytics)、應用效能監控 (APM, 如 Datadog, New Relic)、後端日誌 (Logs)。
我們要找的指標:
第二層:質化透鏡 (The Qualitative Lens) - 人性洞察
數據告訴我們「發生了什麼」,但質化分析告訴我們「為什麼重要」。
工具:與人交談。
我們要訪談的對象:
第三層:戰略透鏡 (The Strategic Lens) - 未來方向
最後,我們需要從公司的高度來審視。
工具:公司季度/年度目標 (OKRs)、商業模式畫布 (Business Model Canvas)、競爭對手分析。
我們要思考的問題:
服務類型 | SLI 類別 | 指標定義 (公式) | 說明 |
---|---|---|---|
使用者請求驅動服務(如:Web API, 電商網站) | 可用性 (Availability) | (HTTP 2xx/3xx 回應數) / (總請求數 - HTTP 4xx 回應數) |
衡量服務是否「活著」並能成功處理合法請求 |
延遲 (Latency) | (回應時間 < N 毫秒的請求數) / (總成功請求數) |
衡量服務反應速度。通常會設定多個分位點,如 95% (p95) 和 99% (p99) | |
正確性 (Correctness) | (返回符合預期內容的成功請求數) / (總成功請求數) |
衡量服務的回應內容是否正確。例如,搜尋 API 雖返回 HTTP 200,但結果為空,這可能就是一個「不正確」的回應 | |
數據處理管線(如:ETL, 報表生成) | 新鮮度 (Freshness) | 數據處理完成時間 - 數據生成時間 < N 小時 |
衡量數據產出的即時性。使用者在乎報表數據是不是昨天的最新數據 |
覆蓋率 (Coverage) | (成功處理的記錄數) / (總應處理的記錄數) |
衡量數據處理是否完整,有沒有遺漏 | |
正確性 (Correctness) | (通過數據驗證的輸出數) / (總輸出數) |
衡量產出的數據是否符合業務規則或品質標準 | |
儲存系統(如:資料庫, 物件儲存) | 可用性 (Availability) | (成功的讀/寫操作數) / (總讀/寫操作數) |
衡量儲存系統是否能正常存取 |
耐久性 (Durability) | 通常是設計目標,而非即時 SLI | 衡量數據儲存後不會丟失的概率。這通常是透過架構設計(如多副本、校驗碼)來保障,而非即時監控 |
定義了 SLI 之後,下一步就是將它們視覺化,變成一個能指導決策的儀表板。一個優秀的 SRE 儀表板,應該能在 30 秒內回答以下問題:「我們的服務現在好嗎?我們還有多少犯錯的空間?」
儀表板核心元件架構
graph TD
A[SRE 監控儀表板] --> B[決策層面]
A --> C[監控層面]
A --> D[診斷層面]
B --> B1[錯誤預算剩餘<br/>🟢 充足 🟡 警告 🔴 危險]
B --> B2[預算消耗速率<br/>Burn Rate 指標]
B --> B3[SLO 達成狀態<br/>✅ 達成 ❌ 違反]
C --> C1[SLI 即時表現<br/>可用性/延遲/品質]
C --> C2[SLO 目標線<br/>承諾的及格線]
C --> C3[趨勢分析<br/>28天滾動窗口]
D --> D1[系統指標<br/>CPU/Memory/Network]
D --> D2[錯誤日誌<br/>快速診斷連結]
D --> D3[事件時間軸<br/>歷史事件回顧]
1. SLO 目標線 (The SLO Target Line)
這是儀表板上最重要的視覺元素。一條清晰的水平線,代表我們團隊承諾的目標(例如 99.9%)。所有指標都應該與這條線進行比較。
2. 當前 SLI 表現圖 (Current SLI Performance Graph)
一條隨著時間變動的曲線圖,顯示在特定時間窗口內(例如,滾動的 28 天)的 SLI 實際表現。我們一眼就能看出當前是在目標線之上還是之下。
3. 錯誤預算消耗圖 (Error Budget Burn-down Chart)
這是將 SRE 理念落實到決策層面的關鍵圖表。它顯示了從週期開始(例如,每月 1 號)到現在,剩餘的錯誤預算百分比或具體的「不可靠時間」(例如,剩餘 15.3 分鐘)。當這條線趨近於零時,所有人都會知道創新的「油門」必須鬆開了
graph LR
subgraph "錯誤預算消耗視覺化"
A[月初: 100%<br/>43.2 分鐘] --> B[第一週: 95%<br/>41.0 分鐘]
B --> C[第二週: 85%<br/>36.7 分鐘<br/>🟡 事件影響]
C --> D[第三週: 78%<br/>33.7 分鐘<br/>🟡 警告狀態]
D --> E[第四週: 15%<br/>6.5 分鐘<br/>🔴 危險狀態]
end
4. 預算消耗速率與預警 (Burn Rate & Alerts)
一個好的儀表板不只顯示「還剩多少」,更要預測「能撐多久」。
儀表板佈局範例
左上角 (最顯眼位置):用最大號字體顯示當前剩餘的錯誤預算。這是最重要的決策依據。
右上角:顯示幾個核心 SLI(可用性、延遲)相對於 SLO 目標線的長期趨勢圖。
下方:提供更詳細的數據圖表、相關的系統指標(CPU、Memory)以及錯誤日誌的快速連結,方便在問題發生時進行深入診斷 (drill-down)。
graph TB
subgraph "SRE 監控儀表板視覺佈局"
subgraph "頂部區域 - 關鍵決策資訊"
A1[錯誤預算剩餘<br/>85.3%<br/>🟢 健康狀態]
A2[預算消耗速率<br/>Burn Rate: 1.2x<br/>🟡 輕微超標]
A3[當前 SLO 狀態<br/>可用性: 99.92%<br/>延遲: P95 450ms<br/>✅ 全部達成]
end
subgraph "中間區域 - 趨勢監控"
B1[SLI vs SLO 趨勢圖<br/>📈 28天滾動視窗]
B2[錯誤預算消耗圖<br/>📉 預算燃燒趨勢]
end
subgraph "底部區域 - 詳細診斷"
C1[系統指標<br/>CPU/Memory<br/>詳細數據]
C2[錯誤日誌<br/>最新 50 筆<br/>快速連結]
C3[事件時間軸<br/>歷史事件<br/>根本原因]
end
end
掌握了如何定義、衡量並監控 SLI,我們就掌握了 SRE 實踐的基石。接下來的 SLO 設定與錯誤預算管理
SLO (Service Level Objective) 是我們為 SLI 設下的「及格線」。
它是一個具體的目標,是我們和我們的使用者、我們的業務團隊之間的一個公開承諾。它通常以百分比的形式,在一個特定的時間窗口內定義。
延續上面的例子:
設定 SLO 是一門藝術,也是一門生意 - 它不是越高越好。
一個 99.9% 的 SLO(常被稱為 "three nines")和一個 99.999% 的 SLO ("five nines"),背後的工程成本和複雜度是天壤之別。我們需要問自己:為了這額外的 0.099% 的可靠性,所付出的巨大成本,真的能為使用者帶來對等的價值嗎?還是說,把這些資源投入到開發一個新功能會更有價值?
如果 SLI 是溫度計,那麼 SLO 就是我們根據科學與經驗,為我們的溫室設定的「最佳生長溫度」。溫度太高(目標設太嚴苛),會耗盡所有能源,扼殺成長;溫度太低(目標設太寬鬆),則會讓作物(使用者體驗)枯萎。
設定 SLO,不是一個單純的技術決策。它是一場精密的外交談判,是我們在技術可能性、使用者期望、與商業成本之間,尋找那個最佳平衡點的過程。
SLO 是產品、開發、維運三方共同協商的結果。它是一條數據化的界線,明確定義了什麼叫做「服務運行良好」。
一個 SLO 數字的背後,蘊含著對商業的深刻理解和對技術的精準掌握 - 它既是科學方法,也是藝術哲學。常見的 SLO 的設定需要平衡多個因素:
SLO 設定考量因素:
使用者期望:使用者能容忍的服務品質底線
商業影響:服務中斷對業務的財務影響
技術現實:系統架構的技術限制
成本效益:提高可靠性的邊際成本
風險承受:組織對於風險的接受度
但我們可以從最主要的兩個面向 數據驅動的客觀基礎 (The Science) 與 藝術面:策略導向的主觀決策 (The Art) 來進行脈絡的設定
科學面:數據驅動的客觀基礎 (The Science)
這是 SLO 的邏輯骨架。我們不憑感覺,而是讓數據引導我們找到合理的起點。
藝術面:策略導向的主觀決策 (The Art)
如果科學告訴我們「能做到哪裡」,藝術則告訴我們「應該做到哪裡」。
SLO 設定的最佳實踐
遵循以下原則,可以讓我們的 SLO 設定過程更順暢、更有效。
從簡開始 (Keep it Simple):不要試圖為系統的每個角落都設定 SLO。從我們之前討論過的「關鍵使用者旅程」開始,為每個旅程選擇不超過 3 個最重要的 SLI 來設定 SLO(通常是可用性、延遲)。
永遠不要設定 100% (Never Set 100%): 100% 的 SLO 意味著零錯誤預算,這在現實世界中是不可能的。它不僅扼殺了所有變更與創新,也為團隊設定了一個註定失敗的目標,打擊士氣。
SLO 是活的,持續迭代 (Iterate and Refine):我們的第一個 SLO 很可能不是最完美的。設定一個初始目標,運行一兩個週期,然後根據實際情況、錯誤預算的消耗速率和使用者回饋,進行調整。它是一個需要持續校準的羅盤。
確保共同承擔 (Ensure Shared Ownership):SLO 不是 SRE 團隊的個人目標。它必須是產品、開發、SRE 團隊共同討論、一致同意並公開簽署的共同契約。當錯誤預算耗盡時,承擔後果(例如凍結發布)的是整個產品團隊,而不僅僅是 SRE。
明確定義衡量窗口 (Define the Measurement Window):我們的 SLO 是基於「過去 7 天」還是「過去 28 天」計算的?較短的窗口對故障更敏感,反應更快;較長的窗口更能反映長期趨勢,避免對短暫的波動過度反應。通常,「滾動的 28 天或 30 天」是一個很好的起點。
SLO 實施策略
在組織中推行 SLO 是一項文化變革,不能一蹴可幾。建議採用「起步-行走-奔跑」的三階段策略。
第一階段:起步 (Crawl)
第二階段:行走 (Walk)
第三階段:奔跑 (Run)
如果說 SLI 是度量衡,SLO 是羅盤,那麼「錯誤預算」( Error Budget
) 就是驅動整個 SRE 巨輪運轉的 引擎與燃料 。它是 SRE 最具革命性的發明,一個將抽象的商業管理哲學轉化為日常決策的強大機制 - 將 SLO 的概念從一個被動的監控目標,轉化為一個主動的管理工具。
我們將聊聊如何設計一個能自我調節、自我平衡的系統 - 不僅是技術系統,更是組織與文化系統。它用一個公平、透明、數據驅動的法則 (Error Budget),來駕馭團隊的情感 (創新衝動 vs. 穩定焦慮),最終達成共同的理想 (為使用者創造價值)。
在正式開始前,我們來看看鬼故事
決策模式對比:情感驅動 vs 數據驅動
傳統決策模式 (基於情感)
- Dev: "我們能發布這個新功能嗎?用戶期待已久,競爭對手都有了!"
- Ops: "不行,上次發布就出事了,太危險了!你們開發總是不考慮穩定性。"
- Dev: "但是產品經理說這個功能會帶來 20% 的營收提升!"
- Ops: "我不管什麼營收,我只知道如果系統掛了,所有人都會來罵我們。"
- Dev: "你們運維總是保守,這樣下去公司會失去競爭力的!"
- Ops: "保守總比半夜被叫起來修 Bug 好!上次那個事故我們加班到凌晨 3 點。"
- Manager: "你們別吵了,到底能不能發布?給我一個明確答案!"
SRE 決策模式 (基於數據)
- Dev: "我們還有足夠的錯誤預算來承擔這次發布的風險嗎?"
- SRE: "目前錯誤預算僅剩 15%,根據歷史數據,類似功能的發布有 30% 機率消耗 10% 預算。"
- Dev: "那意味著如果發布失敗,我們會超支錯誤預算?"
- SRE: "是的,但我們可以降低風險。建議先在 10% 用戶中進行灰度發布,觀察 48 小時。"
- Product: "灰度發布的風險預估是多少?會影響 SLO 嗎?"
- SRE: "灰度發布風險降至 5%,預計消耗 1-2% 錯誤預算。如果成功,可以安全擴展到全用戶。"
- Manager: "很好,數據清晰。批准灰度發布計劃,請持續監控錯誤預算狀況。"
傳統決策模式 (基於情感)
- Ops: "系統掛了!所有用戶都無法登入,客服電話被打爆了!"
- Dev: "不可能啊,我們昨天的代碼沒有動登入邏輯!一定是基礎設施的問題。"
- Ops: "基礎設施一直很穩定,肯定是你們的新代碼有 Bug!"
- Manager: "現在不是追究責任的時候,趕快想辦法恢復!"
- Dev: "要不先回滾到上個版本?但是會丟失昨天修復的安全漏洞。"
- Ops: "那就修復漏洞再發布,但不知道要多久,CEO 已經開始問了..."
- Manager: "這樣吵下去什麼時候能修好?給我一個時間!"
SRE 決策模式 (基於數據)
- SRE: "檢測到登入服務可用性降至 25%,已觸發 P1 事故,錯誤預算快速消耗中。"
- Dev: "根據監控數據,問題出現在數據庫連接池,與昨天的代碼發布時間吻合。"
- SRE: "MTTR 目標是 30 分鐘。選項一:立即回滾,5 分鐘恢復但重新引入安全風險。"
- Security: "選項二:熱修復連接池配置,15 分鐘恢復且保留安全修復。"
- Product: "根據錯誤預算,我們還能承受 8 分鐘停機。選項二風險太高。"
- SRE: "明確:立即執行回滾計劃。安全漏洞修復重新安排,並建立更嚴格的測試流程。"
- Manager: "同意。5 分鐘後系統恢復,下週一制定安全漏洞修復的安全發布計劃。"
就像是情境中所呈現的對話內容與交織而成的決策一樣, 錯誤預算將「風險」量化成一種可以交易和管理的「貨幣」。當預算充足時,團隊獲得了自主權,可以大膽創新;當預算耗盡時,整個團隊的唯一目標就是「停止花錢」,即專注於修復問題、提升穩定性,直到預算開始重新累積。它巧妙地將開發和維運的目標統一起來。
今天,我們將徹底拆解這個引擎,從它的 核心原理
到 決策框架
,再到如何在 AWS 這個世界級的雲端平台上將它具象化。
錯誤預算的數學定義非常簡單:
Error Budget = (1 - SLO) × Total Time
如果我們的可用性 SLO 是 99.9%,那麼我們的錯誤預算就是 0.1%。
這個 0.1% 代表什麼?它代表了「 被允許的失敗額度
」。它就像我們的零用錢,我們可以自由支配它。我們可以用它來:
這個 0.1% 不再是一個消極的「容錯率」,我們必須將它視為一個積極的授權。它代表了我們,作為系統的管理者,向產品與開發團隊所做出的鄭重承諾:
「在不超過這 0.1% 的前提下,你們擁有犯錯的權利。你們可以用這個預算去冒險、去創新、去發布那些可能不完美但極具潛力的新功能。這是你們創新的貨幣。」
想像一下,開發團隊 (Dev) 和維運團隊 (Ops/SRE) 共同管理一個銀行帳戶,戶頭裡的錢就是「錯誤預算」。
開發團隊 想花錢(發布新功能、進行高風險變更),因為花錢可能帶來更高的回報(市場佔有率、使用者滿意度)。
維運團隊 的首要任務是確保戶頭裡永遠有足夠的存款(維持系統穩定),以應對不時之需(非預期的故障)。
在這個模型下,傳統的對立消失了,雙方的目標變得完全一致: 如何以最聰明的方式花費這筆有限的預算,來最大化產品的長期價值。 當帳戶餘額告急時,任何一個理智的成員都會同意:現在必須停止消費,開始賺錢(修復問題、提升穩定性)。
也因此就像最早我們提到的兩種情境 新功能發布討論
、 緊急事故處理
一樣,我們終於終結了會議室裡無休止的拉扯。
有了錯誤預算,我們就有了一個即時的儀表板來指導我們的決策。核心是監控一個關鍵指標:預算消耗速率 (Burn Rate)。
Burn Rate 指的是我們消耗錯誤預算的速度。一個健康的 Burn Rate 應該約等於 1(即按照預期速度消耗)。當 Burn Rate > 1 時,意味著我們正在透支未來的創新能力。
這是一個我們可以直接應用的 SOP (Standard Operating Procedure):
預算狀態 | Burn Rate (範例) | 狀態燈號 | 核心原則 | 決策行動 |
---|---|---|---|---|
健康 (Healthy)> 70% 剩餘 | Burn Rate ≈ 1 | 🟢 綠燈 | 鼓勵創新 | • 加速發布:允許更高頻率、更高風險的功能發布• 計畫性實驗:執行混沌工程、壓力測試、架構變更• 安排維護:執行需要短暫停機的資料庫升級等 |
消耗中 (Depleting)30% - 70% 剩餘 | Burn Rate > 2 | 🟡 黃燈 | 謹慎前行 | • 提高發布門檻:只允許低風險、高價值的變更• 強化測試:要求更全面的自動化測試覆蓋率• 問題分析:分析是哪個功能或變更在快速消耗預算,優先修復 |
告急 (Endangered)< 30% 剩餘 | Burn Rate > 5 | 🟠 橘燈 | 準備煞車 | • 半凍結 (Slush):暫停所有非緊急的功能發布• 成立應變小組:由 Dev 和 SRE 組成,專注於提升穩定性• 根本原因分析 (RCA):深入調查導致預算快速消耗的根本原因 |
耗盡 (Exhausted)≈ 0% 剩餘 | Burn Rate >> 10 | 🔴 紅燈 | 穩定優先 | • 硬凍結 (Freeze):嚴禁任何功能性程式碼變更• 全員投入:整個產品團隊的最高優先級是修復 Bug、優化性能、增加測試• 事後檢討 (Postmortem):直到 SLO 回到目標線之上,且預算開始重新累積,才能解除凍結 |
接下來讓我們來利用一系列 AWS 服務,打造一個自動化、高度視覺化的錯誤預算管理系統。
-- 範例:計算過去 1 小時的可用性 SLI
filter @message like /HTTP/
| stats count(backend_status_code) as total_requests,
count(backend_status_code = 200 or backend_status_code = 304) as good_requests
| extend sli = (good_requests * 100.0 / total_requests)
使用 Metric Math,將這些計算結果發布為一個自訂的 CloudWatch Metric,命名為例如 WebApp/AvailabilitySLI。這一步是關鍵,它將 SLI 變成了一個可以被長期追蹤和告警的指標。
視覺化 (Visualization) - 我們的駕駛艙儀表板
ErrorBudgetRemaining = 100 - ((100 - WebApp/AvailabilitySLI) / (100 - SLO_TARGET)) * 100
這個指標會顯示從 100% 開始,我們的預算還剩下多少。