Google《Site Reliability Engineering》導讀(上)
Google 在 2016 年出版的《Site Reliability Engineering》(業界通稱「SRE 經典書」,全文免費公開於 sre.google),是現代分散式系統維運與可靠性工程的奠基之作。
這本由 Google SRE 團隊親自撰寫的書,在過去十年間深刻重塑了科技業對「維運」的認知。
對準備從後端轉職 DevOps 的工程師來說,可以從這本書看到 Google 當年如何用工程思維與經濟理性,把「系統穩定」從一門靠運氣的玄學,拆解成一套有度量、有預算、有制衡機制的組織架構。
本篇作為導讀上集,涵蓋全書 34 章中的第 1、3–6、11、14、15、27 章與附錄 D:從 SRE 的組織起源、可靠性的量化模型與 Toil,到告警、On-call、無指責檢討與上線審查四項日常實務;SRE 與 DevOps 的關係則借 2018 年的續作《The Site Reliability Workbook》補上。
一、SRE 是什麼:2003 年的七人團隊與組織重造
SRE 的誕生有非常明確的歷史起點。原書第一章由當時主管 Google 生產環境的工程副總裁 Ben Treynor Sloss 親自執筆。他回顧在 2003 年加入 Google 時,接手了一支僅有 7 名工程師的「Production Team」,這個小組正是 SRE 體系的雛形。
Treynor 在開篇給出了 SRE 的經典定義:
SRE is what happens when you ask a software engineer to design an operations team. (當你請一位軟體工程師去設計一個維運組織時,長出來的東西就是 SRE。)
在中文技術社群中,這句話常被模糊地轉述為「SRE 就是找軟體工程師來做以前叫做 ops 的工作」。但原句的重心在於 design an operations team(設計維運組織),而非單純替換執行任務的人選。SRE 不是讓軟體工程師去承受傳統的維運痛苦,而是由具備軟體設計思維的人,從根本上重新建構組織與流程。
突破線性擴充的結構困境
傳統的系統管理(Sysadmin)模式之所以在 Google 被淘汰,並非從業人員的能力問題,而是其固有的結構性缺陷:團隊規模必須隨著服務流量與伺服器數量線性同步增長。在業務以指數速度成長的情況下,純靠人力堆疊的維運必然破產。
Scale vs Service Growth
[Traditional Sysadmin]
Scale : ------------------------> (10x)
Staff : ------------------------> (10x Linear Growth)
[Site Reliability Engineering]
Scale : ------------------------> (10x)
Staff : --------> (Sublinear Growth via Software)
為了解決線性擴充問題,Google 刻意招募具備軟體開發能力的工程師。書中對這群人的行為特徵描述相當務實:
- 他們在重複執行手動任務時會迅速感到厭倦。
- 他們具備編寫軟體的能力,能打造自動化工具來替代手動操作。
在人員結構上,Google SRE 團隊約 50% 至 60% 是標準的軟體工程師(SWE),其餘 40% 至 50% 則是技能達到 SWE 標準 85% 至 99% 的專家,專精於 UNIX 系統核心與網路底層架構。原書指出,這兩類人在實際工作中的績效並無實質差異,反而形成了極佳的技能互補。
寫程式或被淹死:50% 的組織防線
由此衍生出 SRE 體系中最核心的組織紀律:
the team tasked with managing a service needs to code or it will drown. (負責維護服務的團隊必須寫程式,否則會被淹死。)
為了確保工程師有時間寫程式,Google 替 SRE 的維運工作設下 50% 上限(這類工作稱為 Toil,第四節詳述)。當維運負載超出 50% 時,超出的工單、Bug 與故障排除工作將會直接退回給產品開發團隊,甚至會將開發者編入 On-call 輪值清單。
這個「把問題交還給製造問題的人」的機制,打破了開發端只管寫新功能、維運端被迫吞下穩定性債務的對立局面。
正因如此,原書第一章將「Hope is not a strategy.」(希望不是策略)列為章首題辭,第三章更稱其為非官方座右銘。這句話點出了 SRE 的核心信仰:系統可靠性絕不能寄託於開發者的謹慎或運氣,而必須仰賴制度防線與工程約束。
二、SRE 與 DevOps:class SRE implements DevOps
談到 SRE 與 DevOps 的關係,業界最著名的金句莫過於:
class SRE implements interface DevOps
這是借用 Java 物件導向的比喻。interface(介面)只規定「必須提供哪些方法」,不管怎麼做;class(類別)宣告 implements 某個介面後,就得寫出每個方法的具體做法。
套回組織:DevOps 是一組原則,說明開發與維運該如何協作,但沒有規定具體做法;SRE 則是 Google 對這組原則的一種具體實作。既然是「一種」,同一個介面自然也能有其他實作。
不過,這句話並不在 2016 年的原書裡。它首次成文於 2018 年的續作《The Site Reliability Workbook》第一章,章名下方直接以這行程式碼作為標語,用意是終結當時業界對「SRE 與 DevOps 是否互相對立」的爭論。
DevOps 五大支柱在 SRE 的實踐對照
同一章中,作者群將經典的 DevOps 評估面向(即業界通稱的 CALMS 框架:Culture, Automation, Lean, Measurement, Sharing)逐一對應至 SRE 的具體制度:
| DevOps 哲學面向 | SRE 的具體實作制度 | 核心精神與原文論據 |
|---|---|---|
| Culture(文化) | 無指責檢討(Blameless Postmortems) | 消除恐懼與指責反應。「A good culture can work around broken tooling, but the opposite rarely holds true.」(好文化能彌補壞工具,反之極難成立。) |
| Automation(自動化) | Toil 硬上限(50%) | 將維運瑣事嚴格限制在工作時間的 50% 以內,釋放工程生產力。 |
| Lean(精實) | 小步持續變更與縮短 MTTR | 以小幅度、高頻率的發布降低爆炸半徑,並透過降低平均修復時間支持快速迭代。 |
| Measurement(度量) | SLO 與錯誤預算治理 | 「Measurement is absolutely key to how both DevOps and SRE work.」將所有服務決策建立在可量化的指標之上。 |
| Sharing(共享) | 統一工具鏈與共同所有權 | 開發與 SRE 使用相同的工具鏈,共享生產環境的維護責任。 |
Workbook 同章在 Compare and Contrast 一節的總結是:
SRE believes in the same things as DevOps but for slightly different reasons. (SRE 與 DevOps 信仰著相同的理念,只是出發的理由略有不同。)
三、可靠性量化:SLI、SLO、SLA 與錯誤預算的經濟學
三層概念的嚴格階層
在 SRE 體系中,度量可靠性並非憑感覺,而是透過三個層次遞進的概念嚴格定義:
[SLI: Service Level Indicator]
| Quantitative measure (e.g., latency, error rate)
v
[SLO: Service Level Objective]
| Target value or range (e.g., 99.9% success rate)
v
[SLA: Service Level Agreement]
Contract with users with explicit consequences
- SLI(服務水準指標):對服務某個特定面向的精確量化度量(例如請求延遲、成功率)。度量時必須採用看長尾的指標而非簡單平均值——例如 P99 分位數(99% 的請求都比這個值快)——具體寫法如「在 1 分鐘聚合時間窗內,Get RPC 延遲是否小於 100ms」。
- SLO(服務水準目標):依據 SLI 設定的目標值或區間(例如「每月成功請求比例需達 99.9%」)。
- SLA(服務水準協定):與使用者簽訂的明示或暗示合約,必須明確包含未達標時的處罰與後果(例如賠償服務點數或退費)。
判別 SLO 與 SLA 的法則非常直接:第四章指出,若未達標時沒有明文規定的商業後果,那麼它就只是 SLO,而不是 SLA。
為什麼 100% 可靠性是錯誤的目標?
原書第三章從純粹的經濟學角度推導出一個重要結論:追求極限可靠性(如 100% 或過多的 9)不僅不切實際,對使用者與企業反而有害。
理由主要有兩點:
- 使用者感知極限:使用 99% 可靠度行動網路的智慧型手機使用者,完全無法分辨後端服務是 99.99% 還是 99.999% 的可用性。
- 邊際成本爆炸:可用性每增加一個 9,工程難度與伺服器冗餘成本可能是前一個等級的 100 倍。
書中舉了一個具體的商業計算範例:若服務年營收為 100 萬美元,將可用性目標從 99.9% 提升至 99.99%,所保護的潛在營收價值僅有:
原書給的判準很直接:把可用性提升一個 9 的成本低於 900 美元,這筆投資才值得;一旦成本更高,支出就會超過新增的潛在營收。
因此,Google SRE 將可用性目標視為上限與下限的雙重約束:「we view the availability target as both a minimum and a maximum.」超過目標的穩定度並不會帶來額外價值,反而代表團隊發布新功能的步調太過保守。
錯誤預算(Error Budget)的運作機制
錯誤預算正是將上述經濟哲學轉化為日常工程決策的機制。其定義為:在特定週期內,服務被允許發生的最大不可靠度。
例如,若以 30 天滾動時間窗為基準:
- SLO 99.9%:容許的故障停機時間為 43.2 分鐘。
- SLO 99.99%:容許的故障停機時間縮減至僅剩 4.32 分鐘。
[Feature Release Queue]
|
v
[ Error Budget > 0? ]
/ \
(Yes) (No)
/ \
v v
[ Release Feature ] [ Freeze & Fix Reliability ]
錯誤預算的核心在於充當產品發布的「調節閥」:
- 預算充足時:開發團隊可以大膽推進新功能、嘗試重構與架構升級。
- 預算耗盡時:原書第三章〈Embracing Risk〉明文規定觸發發布凍結(Release Freeze),所有非常態的變更暫停,研發資源必須全力轉向撰寫整合測試、修復效能瓶頸與改善災難復原(DR)架構,直到系統穩定度恢復為止。
在實務執行時,SLO 必須搭配明文的錯誤預算政策,由 PM、開發與維運三方共同簽核(如 Workbook 第二章所強調),明確定義預算耗盡時的具體處置流程,否則容易退化為無約束力的儀表板裝飾。
設定 SLO 的反直覺準則
第四章給出幾條關鍵的 SLO 設定原則,其中兩條尤為反直覺:
- 保留安全餘裕(Safety Margin):對外公布的 SLO 應比內部監控的 SLO 寬鬆。內部採用更嚴格的標準,能在問題造成外部使用者感知或觸發 SLA 賠償之前,留出充足的告警與修復時間。
- 切忌過度達標(Don’t Overachieve):若服務長期運作在遠高於宣稱 SLO 的水準,外部依賴方會逐漸產生錯誤的期待,將這種「超額穩定」視為理所當然,一旦系統因偶發故障回到原本宣稱的 SLO,下游應用就可能因此故障。
Google 內部的經典案例是 Chubby 分散式鎖服務:當 Chubby 長時間未發生任何異常時,維運團隊會刻意製造短暫的計畫內停機,以確保下游依賴 Chubby 的應用程式確實實作了斷線重試與降級邏輯。
⭐️四、Toil:SRE 對抗的組織敵人
Toil(勞碌/瑣事)是 SRE 體系中有嚴格判定標準的概念。第五章對其特徵進行了明確界定:
Toil is the kind of work tied to running a production service that tends to be manual, repetitive, automatable, tactical, devoid of enduring value, and that scales linearly as a service grows. (Toil 是與維運生產服務綁定,傾向於手動、重複、可自動化、戰術性、缺乏持久價值,且隨著服務成長線性擴充的工作。)
Toil 的六大特徵
判斷一項工作是否屬於 Toil,可以對照以下六個面向:
- 手動執行(Manual):需要人工在終端機敲指令或點選介面。
- 重複性(Repetitive):多次遇到相同模式的問題。
- 可自動化(Automatable):本質上能以腳本或軟體取代。
- 戰術性(Tactical):僅解決當下症狀,不具策略性。
- 缺乏持久價值(Devoid of enduring value):任務完成後,系統並未變得更好。
- 線性擴充(Scales linearly):隨著服務流量翻倍,工作量也等比例翻倍。
原書特別釐清:Toil 不等於「我不喜歡做的工作」,也與必要的組織開銷(如團隊會議、目標設定與評核、HR 文件)有所區別。
工程槓桿與次線性成長
第一節提到的 50% 上限是長期平均值;SRE 其餘至少一半的時間必須投入在工程專案(Engineering Project Work)上——即撰寫自動化工具、重構基礎架構、開發自癒系統,以徹底消滅未來的 Toil。
SRE Work Distribution
[Engineering Project Work (>= 50%)]
+-- Build Automation Frameworks
+-- Architectural Hardening
+-- Self-Healing & Scalability Engineering
[Operational Toil (< 50%)]
+-- Manual Interventions & Ticket Response
+-- Repetitive On-Call Routine Tasks
工程專案具備複利效應,這正是 SRE 能夠實現次線性擴充(Sublinear Growth)的關鍵槓桿。Google 內部定期問卷的調查結果顯示,全體 SRE 的平均 Toil 比例約落在 33%,證明 50% 的硬性上限確實發揮了實質的防線作用。
五、日常實務:告警、On-call、檢討與上線審查
理論最終必須落入日常營運。原書將 SRE 的實踐歸納為四項核心日常機制:
1. 監控與告警:四大黃金訊號
第六章將監控系統的核心職責歸納為兩個基本問題:「哪裡壞了(What’s broken)」與「為什麼壞(Why)」。
在症狀面,Google 提出了著名的四大黃金訊號(Four Golden Signals):
- 延遲(Latency):請求處理耗時,且必須嚴格區分成功請求與失敗請求的延遲。
- 流量(Traffic):系統承受的需求負載(如 QPS 或並行連線數,即 Concurrent Connections)。
- 錯誤(Errors):請求失敗的比例(包含 HTTP 5xx、隱式業務錯誤或回應逾時)。
- 飽和度(Saturation):系統資源的用量有多接近上限(如記憶體使用率、連線池排隊狀況)。
告警系統的第一美德是可靠與簡約。原書立下了嚴格的 Page(把值班者緊急呼叫起來處理的警示)觸發準則:一條告警只有在緊急(Urgent)、可立即採取行動(Actionable),且正在或即將對真實使用者造成可見影響時,才有資格將工程師喚醒。
若某個告警只需要工程師執行固定的標準作業程序(SOP),該告警就應直接改寫為自動化腳本,而非發出 Page。
告警過多會導致警報疲勞(Alert Fatigue),第十一章強調組織應控制告警扇出(Alert Fan-out,即單一事故衍生多筆告警的現象),追求告警與真實事故接近 1:1 的健康比例——每則告警幾乎都對應一起真實事故。
2. On-call 制度:可持續的輪班架構
第十一章詳細規範了 On-call 的架構設計,核心目的在於防止工程師過勞與流失:
- 角色分工:Primary 專注處理即時 Page;Secondary 負責處理日常非緊急的生產問題。
- 團隊最低規模:單一據點提供 24/7 支援需至少 8 人;若採取雙據點全球互備(Follow the sun),各據點需至少 6 人。
- 工時與頻率上限:單一工程師投入 On-call 的時間不得超過 25%;每個 12 小時班次最多承受 2 起事故,超過即代表營運負載已不可持續。
- 終極制衡機制:當某個服務的故障頻率長期居高不下,SRE 擁有交回呼叫器(Give back the pager)的權力,將整個服務的維運與 On-call 責任直接退還給開發團隊。
告警品質與 On-call 負載在此形成一個緊密的回饋迴圈:告警規則過於敏感會直接推高單一班次的事故數,事故數超標則會迫使團隊修復架構,或觸發交回呼叫器。
在重大事故應變中(第十四章),團隊借鏡了應急救災的事件指揮體系(Incident Command System, ICS),將現場處置拆解為四個角色:
- Incident Commander:掌握整體情勢與決策調度。
- Operations Lead:負責實際操作工具與修復。
- Communications Lead:擔任對外資訊同步窗口。
- Planning Lead:支援 Ops 處理較長期的議題,例如提報 Bug、安排交接或訂晚餐等後勤。
這種分工確保了修復操作與資訊傳播互不干擾,避免單一工程師在多工壓力下顧此失彼。
3. 無指責檢討(Blameless Postmortems)
第十五章與 Appendix D 定義了事後檢討的文化與報告格式。
檢討的核心假設非常純粹:
A blamelessly written postmortem assumes that everyone involved in an incident had good intentions and did the right thing with the information they had. (無指責檢討假設參與事故的每個人都出於善意,並以其當時所掌握的資訊做出了合理的判斷。)
指責個人只會迫使工程師隱瞞失誤與架構弱點。組織必須認清:「你無法修復人性,但你可以修復系統與流程。」(You can’t fix people, but you can fix systems and processes.)
標準的 Postmortem 報告應包含以下結構:
- 影響範圍(Impact):量化使用者損失(如受影響查詢數、營收衝擊)。
- 根本原因與觸發條件(Root Causes & Trigger):技術面的深層失效鏈。
- 處置時間線(Timeline):從異常發生、告警觸發到修復完成的精確分鐘級紀錄。
- 改進行動項(Action Items):具體的工程待辦清單,必須明確標註 Type、Owner 與追蹤 Issue。
- 經驗教訓(Lessons Learned):檢討哪些環節做對了、哪些環節有疏漏,以及哪些成果純屬運氣。
4. 上線審查:Production Reviews
第二十七章記錄了 Google 自 2004 年成立 Launch Coordination Engineering(LCE)團隊以來發展出的上線審查機制(Launch Reviews)。
該機制透過標準化的 Launch Checklist,在架構依賴、容量規劃、故障隔離、資料備份與發布策略等九大領域進行審核。
清單中每一個檢核項目的存在,都必須具備明確的經驗佐證——通常來自過往上線時所發生的慘痛災難(「Every question’s importance must be substantiated, ideally by a previous launch disaster.」)。
審查機制在早期也曾遭遇 SRE 因經驗不足而過度保守、阻礙業務發布的摩擦,最終演進為技術顧問式的協作模式——SRE 提供諮詢與支援,而不是官僚式的守門人。
結語與下篇預告
回顧 Google SRE 原書的上半部體系,其核心邏輯可以收斂為四個層次:
- 定義層:以軟體工程思維重新設計維運組織,打破人力線性增長陷阱。
- 量化層:以 SLO 與錯誤預算為核心,讓系統可靠性變成一筆可以計算邊際效益的經濟決策,同時為新功能發布設下明確閘門。
- 結構層:透過 50% Toil 硬上限與退回機制,保住工程師投入工程專案、以軟體消除雜事的時間。
- 實務層:藉由高訊雜比告警、可持續的 On-call 輪值、無指責文化與 Launch Checklist,將工程紀律落實於每日維運。
然而,這些高度理想化的制度,本質上是建立在 Google 龐大的工程規模、充裕的人才儲備與強大的內部工具鏈之上。中小型企業或非 Google 體系的架構該如何借鏡?
在下篇中,我們將走出書本核心,深入探討以下議題:
- 系統故障力學:剖析級聯失效(Cascading Failures)、過載保護與重試風暴的底層原理,並對照現代 Kubernetes 架構。
- 非 Google 組織的實踐驗證:解讀 Evernote 與 The Home Depot 在導入 SRE 過程中的陣痛與失敗模式。
- 十年間的典範轉移(2016–2026):在平台工程(Platform Engineering)興起、可觀測性生態成熟的今天,SRE 的哪些論述依然穩固,哪些假設已被時代重寫。