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 刻意招募具備軟體開發能力的工程師。書中對這群人的行為特徵描述相當務實:

  1. 他們在重複執行手動任務時會迅速感到厭倦。
  2. 他們具備編寫軟體的能力,能打造自動化工具來替代手動操作。

在人員結構上,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

判別 SLO 與 SLA 的法則非常直接:第四章指出,若未達標時沒有明文規定的商業後果,那麼它就只是 SLO,而不是 SLA。

為什麼 100% 可靠性是錯誤的目標?

原書第三章從純粹的經濟學角度推導出一個重要結論:追求極限可靠性(如 100% 或過多的 9)不僅不切實際,對使用者與企業反而有害。

理由主要有兩點:

  1. 使用者感知極限:使用 99% 可靠度行動網路的智慧型手機使用者,完全無法分辨後端服務是 99.99% 還是 99.999% 的可用性。
  2. 邊際成本爆炸:可用性每增加一個 9,工程難度與伺服器冗餘成本可能是前一個等級的 100 倍。

書中舉了一個具體的商業計算範例:若服務年營收為 100 萬美元,將可用性目標從 99.9% 提升至 99.99%,所保護的潛在營收價值僅有:

$1,000,000×(0.9999−0.999)=$1,000,000×0.0009=$900\$1,000,000 \times (0.9999 - 0.999) = \$1,000,000 \times 0.0009 = \$900

原書給的判準很直接:把可用性提升一個 9 的成本低於 900 美元,這筆投資才值得;一旦成本更高,支出就會超過新增的潛在營收。

因此,Google SRE 將可用性目標視為上限與下限的雙重約束:「we view the availability target as both a minimum and a maximum.」超過目標的穩定度並不會帶來額外價值,反而代表團隊發布新功能的步調太過保守。

錯誤預算(Error Budget)的運作機制

錯誤預算正是將上述經濟哲學轉化為日常工程決策的機制。其定義為:在特定週期內,服務被允許發生的最大不可靠度。

Error Budget=100%−SLOError\ Budget = 100\% - SLO

例如,若以 30 天滾動時間窗為基準:

 [Feature Release Queue]
            |
            v
  [ Error Budget > 0? ]
    /                \
  (Yes)              (No)
   /                    \
  v                      v
 [ Release Feature ]    [ Freeze & Fix Reliability ]

錯誤預算的核心在於充當產品發布的「調節閥」:

在實務執行時,SLO 必須搭配明文的錯誤預算政策,由 PM、開發與維運三方共同簽核(如 Workbook 第二章所強調),明確定義預算耗盡時的具體處置流程,否則容易退化為無約束力的儀表板裝飾。

設定 SLO 的反直覺準則

第四章給出幾條關鍵的 SLO 設定原則,其中兩條尤為反直覺:

  1. 保留安全餘裕(Safety Margin):對外公布的 SLO 應比內部監控的 SLO 寬鬆。內部採用更嚴格的標準,能在問題造成外部使用者感知或觸發 SLA 賠償之前,留出充足的告警與修復時間。
  2. 切忌過度達標(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,可以對照以下六個面向:

原書特別釐清: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):

告警系統的第一美德是可靠與簡約。原書立下了嚴格的 Page(把值班者緊急呼叫起來處理的警示)觸發準則:一條告警只有在緊急(Urgent)、可立即採取行動(Actionable),且正在或即將對真實使用者造成可見影響時,才有資格將工程師喚醒。

若某個告警只需要工程師執行固定的標準作業程序(SOP),該告警就應直接改寫為自動化腳本,而非發出 Page。

告警過多會導致警報疲勞(Alert Fatigue),第十一章強調組織應控制告警扇出(Alert Fan-out,即單一事故衍生多筆告警的現象),追求告警與真實事故接近 1:1 的健康比例——每則告警幾乎都對應一起真實事故。

2. On-call 制度:可持續的輪班架構

第十一章詳細規範了 On-call 的架構設計,核心目的在於防止工程師過勞與流失:

告警品質與 On-call 負載在此形成一個緊密的回饋迴圈:告警規則過於敏感會直接推高單一班次的事故數,事故數超標則會迫使團隊修復架構,或觸發交回呼叫器。

在重大事故應變中(第十四章),團隊借鏡了應急救災的事件指揮體系(Incident Command System, ICS),將現場處置拆解為四個角色:

這種分工確保了修復操作與資訊傳播互不干擾,避免單一工程師在多工壓力下顧此失彼。

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 報告應包含以下結構:

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 原書的上半部體系,其核心邏輯可以收斂為四個層次:

  1. 定義層:以軟體工程思維重新設計維運組織,打破人力線性增長陷阱。
  2. 量化層:以 SLO 與錯誤預算為核心,讓系統可靠性變成一筆可以計算邊際效益的經濟決策,同時為新功能發布設下明確閘門。
  3. 結構層:透過 50% Toil 硬上限與退回機制,保住工程師投入工程專案、以軟體消除雜事的時間。
  4. 實務層:藉由高訊雜比告警、可持續的 On-call 輪值、無指責文化與 Launch Checklist,將工程紀律落實於每日維運。

然而,這些高度理想化的制度,本質上是建立在 Google 龐大的工程規模、充裕的人才儲備與強大的內部工具鏈之上。中小型企業或非 Google 體系的架構該如何借鏡?

在下篇中,我們將走出書本核心,深入探討以下議題: