SRE 入門:從後端 RD 到網站可靠性工程

是什麼?

SRE(Site Reliability Engineering,網站可靠性工程)是 Google 在 2003 年左右提出的維運方法論,一句話總結:用寫軟體的方式來做維運

傳統 Ops(維運)的工作是手動敲指令、值班救火、寫 runbook;而 SRE 把「維運問題當成軟體問題來解」——能用程式自動化的,就不要用人力重複做。SRE 工程師大多是會寫程式的後端工程師,只是把精力放在「讓系統穩定地跑」而不是「做新功能」。

那跟 DevOps 差在哪?可以這樣理解:

DevOps(一套文化與原則)
具體落地
SRE(Google 的具體實作)
傳統 Ops(手動維運)

DevOps 是一種「打破開發與維運高牆」的文化與理念(CI/CD、自動化、共同負責);SRE 則是 Google 對這套理念的「具體實作版本」,帶來可量化的指標(SLO)、錯誤預算等明確制度。常聽到的一句話是:「class SRE implements DevOps」——SRE 是 DevOps 的一種介面實作。

ℹ️SRE 的核心信條

可靠度(Reliability)是一種「可以被預算管理的產品特性」,而不是越高越好。100% 的可靠度既不可能達到,成本也高到不合理,使用者也感受不出差別。SRE 的工作是找出「剛剛好」的可靠度,把剩下的力氣留給做功能。

核心:可靠度的量化(SLI / SLO / SLA)

這三個是 SRE 最重要的詞彙,務必分清楚。它們是「指標 → 目標 → 合約」的遞進關係。

名詞全名是什麼範例
SLIService Level Indicator實際量測到的「指標數字」過去 30 天成功請求佔比 = 99.95%
SLOService Level Objective你「內部訂的目標」成功率 ≥ 99.9%
SLAService Level Agreement對「外部客戶的合約承諾」,違約要賠月可用率低於 99.5% 退費 10%

關鍵直覺:

SLO 數字背後的「可容忍停機時間」非常重要,這是談判可靠度成本的依據:

SLO(可用率)每月可容忍停機每年可容忍停機
99%(兩個 9)約 7.2 小時約 3.65 天
99.9%(三個 9)約 43 分鐘約 8.76 小時
99.95%約 21.6 分鐘約 4.38 小時
99.99%(四個 9)約 4.3 分鐘約 52.6 分鐘
99.999%(五個 9)約 26 秒約 5.26 分鐘

💡後端 RD 的實務提醒

不要一開始就追求五個 9。每多一個 9,所需的冗餘、多區域部署、自動化投資都呈倍數成長。先量出目前的 SLI,再訂一個「比現況略高、但做得到」的 SLO,跑一兩季後再調。

錯誤預算 Error Budget

如果 SLO 是 99.9%,那剩下的 0.1% 就是你的「錯誤預算」——允許出錯的額度。以每月為例:

text
錯誤預算 = 1 - SLO = 1 - 0.999 = 0.001(0.1%)
換算停機時間 ≈ 30 天 × 24 小時 × 60 分 × 0.001 ≈ 43 分鐘 / 月

錯誤預算的精神在於把「衝功能」和「保穩定」之間的拉扯變成一個數字遊戲,而不是吵架

本月錯誤預算 43 分鐘
剩很多
預算充足:放心發新功能
預算告急:放慢發布、加強測試
預算燒光:凍結發版只修穩定性

這套機制讓開發團隊與 SRE 團隊的目標一致:與其爭論「能不能上線」,不如看錯誤預算的餘額來決定。它把「可靠度」變成一個雙方都認可、可被預算管理的特性。

四大黃金訊號(Four Golden Signals)

來自 Google SRE 一書,是替任何線上服務做監控時「至少要先量」的四個面向。對後端 RD 來說,這四個訊號幾乎涵蓋了一個 API 服務的健康狀況。

1

延遲 Latency

處理一個請求要花多久。要區分成功請求與失敗請求的延遲,通常看 P50/P95/P99 分位數而非平均值。

2

流量 Traffic

系統承受的需求量,例如每秒請求數(RPS)、每秒交易數。用來判斷負載高低與容量規劃。

3

錯誤 Errors

失敗請求的比率,例如 HTTP 5xx 佔比、超時、回傳內容錯誤。直接對應 SLI 的成功率。

4

飽和度 Saturation

系統資源有多滿,例如 CPU、記憶體、連線池、佇列長度。逼近上限就是即將出事的前兆。

💡為什麼看分位數不看平均?

平均延遲會被大量快速請求「稀釋」,掩蓋掉少數使用者體驗極差的情況。P99 = 100ms 的意思是「最慢的 1% 使用者也在 100ms 內被服務」,這才貼近真實的使用者體驗。

可觀測性三支柱(Logs / Metrics / Traces)

要量出上面那些訊號,靠的是「可觀測性(Observability)」的三大資料來源。詳細內容請見 observability 主題,這裡先一句話定位各自角色:

ℹ️延伸閱讀

可觀測性是 SRE 的眼睛,建議搭配 observability/observability-fundamentals 一起看。沒有可觀測性,SLO 與黃金訊號都無從量起。

事故管理與 Postmortem

當錯誤預算正在被快速消耗、服務真的出事了,就進入「事故管理(Incident Management)」流程。

嚴重度分級(Severity)

事先定義好等級,才能讓「該叫醒誰、該多快回應」有共識:

等級影響範例回應期待
SEV-1全站不可用 / 資料遺失風險主要 API 全掛、付款失敗立刻、全員待命
SEV-2主要功能受損登入緩慢、部分區域中斷數分鐘內進場
SEV-3次要功能受損非關鍵報表延遲上班時間處理

值班 On-call

由團隊輪流擔任「第一線接告警」的人。健康的 On-call 制度應該:告警必須「可行動」(不該半夜被無意義的告警吵醒)、有清楚的 runbook、輪班負擔合理、補休或補償到位。

無究責事後檢討(Blameless Postmortem)

事故結束後寫的檢討文件。核心精神是 對事不對人:假設每個人在當下都已盡力做出合理決定,問題出在「系統與流程」讓錯誤得以發生,而不是某個人「不小心」。一份典型骨架:

1

摘要與影響

一句話講清楚發生什麼事、影響多少使用者、持續多久、燒掉多少錯誤預算。

2

時間線 Timeline

客觀記錄從異常發生、被偵測、診斷、緩解到復原的每個時間點。

3

根因分析

用 5 Whys 等方法追到系統性根因,而非停在表面或歸咎個人。

4

行動項 Action Items

具體、有負責人、有期限的改善事項,並追蹤到完成。

💡Blameless 的關鍵

如果檢討會變成抓戰犯,下次大家就會隱瞞、不敢通報,反而更危險。無究責文化是為了讓真相浮現、讓系統變強。詳見 observability/incident-response。

消除 Toil(重複勞動)

Toil 指的是那種「手動、可重複、無長期價值、會隨服務成長而線性增加」的維運工作——例如每次發版都要手動跑十個步驟、每天手動清 log、每次擴容都要人工改設定。

Toil 的特徵:手動、重複、可自動化、戰術性(救火而非建設)、沒有持久價值、隨規模等比成長。

為什麼要消滅它?因為 toil 會吃光工程師的時間,讓人沒空做真正能提升可靠度的工程改善,最後陷入「越忙越救火、越救火越忙」的惡性循環。

ℹ️SRE 的時間分配原則

Google 的經驗法則是:SRE 花在 toil 的時間應該控制在 50% 以下,另外一半投入在自動化、工具開發、可靠度改善等「能讓未來更輕鬆」的工程工作。超過上限就是一個該動手自動化的訊號。

部署與發佈可靠度

很多事故來自「發新版」,所以「怎麼安全地發版」是 SRE 的核心戰場。重點是讓變更可以漸進、可觀測、可快速回滾

ℹ️延伸閱讀

這三種策略的細節、流量切換做法與資料庫相容性問題,請見 ci-cd/deployment-strategies。

後端 RD 的 SRE 學習路線

這是本課最實用的一段,直接回答「從後端 RD 想做 SRE,要照什麼順序學」。重點是先學會量化與看懂系統,再學自動化與底層,依優先序排列:

1

SLI / SLO / 錯誤預算

先建立可靠度的思維框架。學會替自己的服務定義成功率、延遲 SLI,並訂出合理 SLO。這是 SRE 的世界觀,最該先學。

2

可觀測性 Metrics / Logs / Traces

學會讓服務吐出指標、結構化日誌與分散式追蹤。看不到系統就無法管理可靠度。

3

監控與告警

Prometheus + Grafana、儀表板設計、以 SLO 為基礎的告警(燃燒率 burn rate)。讓告警可行動、不擾人。

4

事故管理與 Postmortem

學會分級、值班、止血流程與寫無究責檢討。把每次事故變成系統變強的養分。

5

CI/CD 與部署策略

自動化發布管線、金絲雀與藍綠、快速回滾。讓變更安全且頻繁。

6

容器與 Kubernetes

Docker、K8s 的 Pod/Deployment/Service、HPA 自動擴縮、健康探針。現代服務的執行環境。

7

基礎設施即程式碼 IaC

Terraform、Helm。把環境寫成程式碼,可版本控管、可重現、可審查。

8

Linux 與網路基礎

行程、檔案描述符、TCP/IP、DNS、負載平衡、TLS。出事時往下挖的根基。

9

自動化與腳本

用程式消滅 toil:自動擴容、自動修復、批次維運腳本(Python / Go / Bash)。SRE 的最終目標。

💡後端 RD 的優勢

你已經會寫程式、懂 API 與資料庫——這正是 SRE 最缺的能力。轉 SRE 不是從零開始,而是把既有的軟體工程能力,轉去解決「讓系統穩定運行」這類問題。前四步(量化思維 + 可觀測性 + 告警 + 事故管理)是門檻最低、效益最高的起點。

C# / .NET 實務銜接

把上面的觀念落到 .NET 服務上,最快讓服務「變得可觀測」的四件事:

健康檢查(Health Checks),讓編排器(K8s)與負載平衡器能探活:

csharp
builder.Services.AddHealthChecks()
    .AddCheck("self", () => HealthCheckResult.Healthy())
    .AddNpgSql(connectionString, name: "database")
    .AddRedis(redisConnectionString, name: "redis");
 
var app = builder.Build();
// liveness:行程還活著嗎;readiness:可以接流量了嗎
app.MapHealthChecks("/health/live");
app.MapHealthChecks("/health/ready");

指標(Metrics),用 .NET 內建的 System.Diagnostics.Metrics 暴露黃金訊號:

csharp
var meter = new Meter("MyApp.Api");
var requestCounter = meter.CreateCounter<long>("http_requests_total");
var latencyHistogram = meter.CreateHistogram<double>("http_request_duration_ms");
 
// 在中介軟體裡記錄每個請求
requestCounter.Add(1, new KeyValuePair<string, object?>("status", statusCode));
latencyHistogram.Record(elapsedMs);

結構化日誌(Structured Logging),讓日誌可被查詢、可關聯:

csharp
// 用具名參數而非字串拼接,後端日誌系統才能依欄位搜尋
logger.LogInformation(
    "Order {OrderId} processed for {CustomerId} in {ElapsedMs}ms",
    order.Id, order.CustomerId, elapsedMs);

OpenTelemetry(OTel),一次到位地把 Metrics / Traces / Logs 匯出到後端(Prometheus、Jaeger、Grafana 等):

csharp
builder.Services.AddOpenTelemetry()
    .WithMetrics(m => m
        .AddAspNetCoreInstrumentation()
        .AddMeter("MyApp.Api")
        .AddOtlpExporter())
    .WithTracing(t => t
        .AddAspNetCoreInstrumentation()
        .AddHttpClientInstrumentation()
        .AddOtlpExporter());

ℹ️一句話總結 .NET 銜接

ASP.NET Core 內建的 Health Checks、System.Diagnostics.MetricsILogger,再加上 OpenTelemetry,幾乎不用第三方框架就能把一個 .NET 服務變得「可被 SRE 管理」。

常見誤區

⚠️SRE 路上最容易踩的坑

  • 追求 100% 可用率:不可能達到、成本暴增,而且使用者根本感受不到差別。應該訂「剛剛好」的 SLO,把資源留給做功能。
  • 只看機器指標、不看使用者體驗:CPU、記憶體都正常不代表使用者沒事。SLI 應該以「使用者實際感受到的成功率與延遲」為準,而非單純的主機指標。
  • 究責文化扼殺 Postmortem:把事故檢討變成抓戰犯,會讓人隱瞞問題、不敢通報。沒有無究責文化,事後檢討就失去揭露真相、強化系統的意義。
  • 告警太吵(Alert Fatigue):到處設門檻式告警,導致 On-call 麻木而忽略真正重要的告警。告警應以 SLO 燃燒率為基礎,且每一條都「可行動」。

實戰補充(Q&A)

Q:SLO 到底該訂多少? A:不要憑感覺。先用監控量出「目前實際的 SLI」(例如過去 90 天成功率是 99.92%),把 SLO 訂在「略低於現況、且使用者能接受」的位置,例如 99.9%。訂太高會永遠在違約救火,訂太低則失去約束力。跑一兩季後依錯誤預算的消耗狀況再調整。

Q:SRE 和 DevOps 差在哪? A:DevOps 是一種打破開發與維運壁壘的「文化與原則」,比較抽象;SRE 是 Google 對這套原則的「具體實作」,帶來明確的制度,例如 SLO、錯誤預算、toil 上限、無究責檢討。可以說 SRE 是一種「有明確規則手冊的 DevOps」。

Q:小團隊也需要 SRE 嗎? A:需要的是「SRE 的思維」,不一定是「專職 SRE 團隊」。小團隊通常由後端 RD 兼任,重點先做三件事:(1) 替關鍵服務訂一個 SLO;(2) 把黃金訊號做成儀表板與告警;(3) 出事後寫一份簡短的無究責檢討。等規模成長、toil 變多,再考慮設立專職角色。

理解測驗

🤔 SLI、SLO、SLA 三者的正確關係是?

🤔 某服務 SLO 為 99.9%,這個月已經用掉大部分錯誤預算。依 SRE 的精神,團隊最該怎麼做?

🤔 關於四大黃金訊號中的「延遲(Latency)」,下列何者最正確?

重點整理

💡一句話記住

SRE 就是「用寫軟體的方式做維運」,而可靠度是一種可以被錯誤預算管理的產品特性——不是越高越好,而是剛剛好。

主題一句話重點
SRE 定位用軟體工程解決維運問題,是 DevOps 的具體實作
SLI / SLO / SLA量測值 / 內部目標 / 對外合約,嚴格度 SLO ≥ SLA
錯誤預算1 − SLO 的額度,平衡衝功能與保穩定,燒光就凍結發版
四大黃金訊號延遲、流量、錯誤、飽和度
可觀測性Metrics 看健康、Logs 查細節、Traces 找瓶頸
事故管理嚴重度分級 + On-call + 無究責 Postmortem
消除 Toil自動化重複勞動,toil 控制在 50% 以下
部署可靠度藍綠 / 金絲雀 / 快速回滾,讓變更漸進可回退
學習路線SLO → 可觀測性 → 告警 → 事故 → CI/CD → K8s → IaC → Linux/網路 → 自動化
.NET 銜接Health Checks + Metrics + 結構化日誌 + OpenTelemetry

你可能也想看

監控、日誌與版本管理一個完整專案從 0 到上線

按 ← → 鍵切換課程