English· Español· Deutsch· Nederlands· Français· 日本語· ქართული· 繁體中文· 简体中文· Português· Русский· العربية· हिन्दी· Italiano· 한국어· Polski· Svenska· Türkçe· Українська· Tiếng Việt· Bahasa Indonesia

un

guest
1 / ?
back to lessons

歡迎

歡迎

一個網絡級的機群包含許多機器。在任何時刻,某些機器健康,有些機器正在啟動,有些機器正在排放,有些機器安靜地壞掉。機群在這個過程中生存,因為每台機器在要求時會回答兩個簡單的問題:

- /health — 我目前是否能夠服務實際請求?

- /version — 我正在運行的代碼是什麼?

此外,還有一個指標端點(通常為 /metrics),該端點揭示了用於監控工具挖掘的計數器和閾值。

這堂課教你如何設計這些端點,以便它們實際上反映現實,如何在代理層面應用四個黃金信號,以及如何將觀察到的數據與容量決策相聯繫。

在結束時,你將:

- 設計一個 /health 端點,該端點檢測實際路徑失敗,而不僅僅是過程的存活狀態

- 設計一個 /version 端點,讓你能夠驗證部署已經生效

- 在代理層面應用四個黃金信號(延遲、流量、錯誤、饒舌)

- 將觀察到的擴增指標與容量決策相聯繫:何時擴展、何時排放、何時發送警報

- 理解 SLO 和錯誤預算消耗速度作為『我們關心多少』的運營紀律

兩種健康檢查的種類

存活與準備就緒

存活:過程是否至少存活?由調度器(Kubernetes、systemd)決定是否重新啟動過程。

準備就緒:過程現在是否已經準備好處理實際流量?由負載平衡器決定是否將請求發送。

這些是不同的問題。一個過程即使是存活但無法達到其數據庫,也是存活但不具備現時準備就緒。一個正在啟動的過程是存活但尚未準備就緒。

浅表與深表健康檢查

浅表:返回 {"status": "ok"} 如果 HTTP 處理程序運行。簡單。只檢測過程下降。

深度: 實際執行真實請求路徑。檢查數據庫連接池是否可以返回連接,緩存是否可達到,下游依賴項是否響應。偵測功能中斷,淺度檢查會遺失。

交易-off: 深度檢查的成本更高(每一個都是synthetic請求)& 可能導致連鎖失效(如果每個副本的健康檢查撞擊數據庫,一個慢的數據庫使所有副本不健康,將從輪詢中移除,從而移除所有容量)。

最佳實踐:淺度檢查存活(快速,廉價,不依賴外部)& 深度檢查就緒(使用緩存結果,避免撞擊下游)。

版本端點

/version 返回 Git提交,建構時間和服務名稱。部署後,您可以使用 curl https://service.example.com/version 確認返回的提交與您推送的匹配。如果不匹配,部署失敗靜音。

沒有 /version,過時部署可以看起來成功並隱藏數小時。

最小響應形狀{"service":"my-api","git_commit":"abc1234","build_time":"2026-05-19T10:00:00Z"}

一個團隊的負載平衡器配置在連續三次健康檢查失敗後將副本從輪替中移除。目前的 `/health` 立即返回 `{"status": "ok"}`。在事件發生時,團隊驚訝地發現,每個副本都顯示為健康,即使沒有副本能夠達到數據庫。設計一個更好的準備檢查,該檢查將捕捉到數據庫中斷,然後說明你的新設計引入的具體風險。

延遲,流量,錯誤,飽和

四個數字覆蓋大多數操作

從Google SRE書中。四個信號在每個服務層次進行測量。如果對這四個信號進行良好的配置,您可以在生產環境中捕獲大多數問題,避免用戶自己做出。

延遲:請求花費的時間。報告分布,不僅僅是平均值。p99(99分位延遲)比平均值更重要,因為尾部延遲是用戶感受到的‘慢’。一個服務的平均值為50毫秒,p99為5000毫秒,有一個真正的問題,1%最受影響的用戶絕對感受到。

流量:每秒請求數。總請求,按每個端點,按每個狀態碼,按地區。基線已知;對異常進行報警(突降表示進入問題;突增表示突襲或攻擊)。

錯誤:失敗請求的速率。區分4xx(客戶錯誤,不是您的錯)和5xx(服務錯誤,您的錯)。以流量百分比的形式跟踪錯誤率,而不是以絕對數量進行跟踪,以便報警在不同負載水平下有效。

飽和度: 系統有多滿? CPU 利用率、記憶體、連接池深度、排隊長度。領導指標。飽和度在 latency 或錯誤惡化之前會上升。飽和度為 90% 的層級,意味著只差一分鐘就會導致排隊崩潰。

特別在代理層級

每個信號在邊緣層顯示:

- 代理層的延遲: TLS 握手時間、上游連接時間、請求-響應總時間。分別測量,因為它們生活在不同部分的路徑上。

- 代理層的流量: 總請求/秒、每個後端分佈(熱後端表示負載均衡器偏斜)、每個狀態碼分解。

- 代理層的錯誤: 從客戶端 (您的用戶訪問錯誤的端點) 的 4xx、從後端 (您的服務失敗) 的 5xx、代理內部錯誤 (502 = 後端無法接觸, 504 = 後端超時)。

- 代理層的飽和度: TLS 會話數、上游連接池深度、代理本身的 CPU (TLS 終止是 CPU 密集型)。

專業建議: 突然增加 502 的同時,後端 latency 低意味著後端在回應之前就掛住了 (連接重置、崩潰、OOM)。增加 504 意味著後端慢但仍回答。讀取錯誤碼,它告訴你失敗發生在哪里。

![/static/diagrams/distsys_four_golden_signals.svg]

閱讀信號

您的儀表板在過去的 10 分鐘內顯示如下:

- 流量: 約為 800 req/s (沒有暴增)

- 延遲: p50穩定在 40ms,p99 從 200ms 上升到 2,500ms 過了 5 分鐘仍在上升

- 錯誤: 4xx 率穩定在 0.3% (正常背景); 5xx 率從 0.1% 上升到 1.2% (主要是 504 Gateway Timeout)

- 飽和度: 後端 CPU 從 45% 上升到 78% 在同一個 5 分鐘內; 代理 CPU 穩定在 30%

診斷發生的事情。最可能的失敗模式是什麼?一個或兩個後續測量將確認或駁回你的假設,以及在下五分鐘內,你將採取什麼行動,如果趨勢繼續下去?

擴展、排放、提醒的時機

能力決策需要觸發器

觀察指標很簡單。知道何時應該採取行動則是自律的藝術。

擴展時機:當飽和度持續超過閾值時(例如,後端CPU超過70%持續5分鐘),或是排隊深度超過目標,或者是延遲p99超過SLO。觸發器應在事情發生之前觸發,而不是在事情發生時觸發。

排空副本時機:當它一致地慢或錯誤,而同伴則健康(一個副本運行得很熱往往是主機層級問題,而不是應用程式問題),或者在推出新版本時,或者在優雅地退休副本時。

叫醒人力時機:當SLO比錯誤預算更快地被燃燒時,或者飽和度觸發器在自動擴展未能吸收它時發生,或者出現漸層模式(錯誤率+重試率都在攀升)。

不要叫醒人力時機:當單個壞分鐘自己恢復時,或者背景批次作業導致期望的周期性突發時,或者噪音跨越閾值時(閾值是錯誤的,而不是系統本身)。

SLOs & Error Budget Burn

SLO(服務水平目標)定義了可接受的性能:‘成功率>=99.9%在28天的滑動窗口中’。其補充(0.1%)是錯誤預算。

燃燒速率:您正在什麼速度消耗錯誤預算。如果您在1小時內燃燒了10%的預算,那麼速率是不可持續的240倍(1小時是28天滑動窗口的1/672;在該窗口內燃燒10% = 10% × 672 = 6720%,預計為全窗口的100%時,只允許100%)。

多窗口燃燒速率警報:在短窗口(5分鐘,14.4倍速率)和長窗口(1小時,6倍速率)都燃燒得比可持續速度快時叫醒人力。這可以捕捉到快速中斷和慢慢惡化。

為什麼對於容量來說這有關係:一個運行在99.9% SLO的服務,具有1%的閒置空間,可以吸收小的突發。一個在99.93%(僅剛剛滿足SLO)運行的服務,只要有一天的差距就會違約。容量決策應該目標是舒適的SLO安全邊際,而不是最小的滿足它。

在觀察下進行容量決策

您的服務的SLO為28天內成功請求的99.9%。在過去1小時的監控中,當前狀態為:

- 成功率:99.5%(持續30分鐘)

- 後端CPU:整個艦隊的平均值為82%(目標值70%)

- p99延遲:800毫秒(SLO目標:<500毫秒)

- 流量:每秒1,400個請求,從基線1,000個請求/秒(高出正常水平40%;趨勢仍在上升)

- 自动扩展:配置在 CPU 大于 80% 持续 5 分钟时添加实例;当前正在进行缩放操作,将在 ~90 秒内添加 3 个实例

決定三件事:(1)這是否是一起需要立即叫醒人力進行處理的事件(2)您應該立即採取哪些超越讓自動擴展完成的行動(3)如果流量趨勢沒有上升而是保持穩定,您的決策將會有何不同?為每個部分進行說明。

设计发布观察性计划

合成

你现在可以设计一个 /health 来捕获真实的故障,一個 /version 来验证部署,四个金色信号仪表板在代理层,以及与 SLO 燃烧率相关的容量触发器。

应用所有四个。

你的团队正在发布 search.example.com(来自故障模式课程的搜索服务)。该团队希望部署一个能够在用户之前捕获问题的观察性系统,具有明确的页面还是不页面决策矩阵。SLO:99.9% 成功请求,p99 延迟 < 300 ms,覆盖 28 天的时间窗口。

设计发布观察性计划。解决:(1) 每个后端实例和每个代理的 `/health` 和 `/version` 返回什么内容,(2) 代理和后端层需要哪四个金色信号仪表板,(3) 自动扩展触发缩放操作的阈值在哪里,(4) 在什么阈值下人工触发页面(在适用时使用 SLO 燃烧率)。

课程总结

结束课程

你已经完成了五个课程:

- 代理与源:几乎每个公共网络服务使用的边缘层形状

- 无状态水平扩展:为什么无状态层可以便宜并且如何 sizing 它

- 入口与出口分离:为什么一个盒子变成两个,以及强制其执行的故障模式

- 故障模式与爆炸半径:SPOFs,链式故障,后续分析,无责行动项目

- 观察性与容量(这个):要测量的问题才能在用户之前浮现

主題線: 一個網絡級別的分布式系統不是魔法。它是一個小組的模式(反向代理,無狀態的副本,入口/出口分離,四個黃金信號,分隔帶和電路斷開器),由思考組合。 一旦您認識到模式,您將看到它們在每個生產架構中。

配對課程:五個形狀-* 的課程將相同的材料重新表述為圖論和幾何學。 它們可以在任何順序中進行。

很好。