LY Corporation Tech Blog

支持 LY Corporation 和 LY Corporation Group (LINE Plus, LINE Taiwan and LINE Vietnam) 服務,宣傳技術和開發文化。

This post is also available in the following languages. Japanese, English, Korean

採用 SLI/SLO 來提升系統可靠性 - 第一部分:介紹與採用原因

你好,我們是來自 LINE 服務工程部門的 Dahee Eo( Enablement Engineering team)與 Ki Cheol Cheon(Service Reliability team),負責站點可靠性工程 (Site Reliability Engineering: SRE) 相關工作。

我們兩個團隊皆隸屬於服務工程部,專注於提升 LINE App 所提供服務的品質與可用性。具體來說,我們負責 LINE App 內的即時通訊服務與媒體平台等服務的 SRE。為了達成目標,我們會識別服務上線與活動所需的技術要素,提供合適的解決方案,並藉由技術支援與自動化來消除不確定性、減少重複性工作,讓開發團隊能更專注於開發與營運。此外,我們也從需求預測、效能優化、可觀察性提升與事件回應等多方面努力,持續提升服務的可靠性。

基於這些經驗,我們計畫發表一系列三篇文章,主題為「採用 SLI/SLO 以提升服務可靠性」。本篇文章作為開端,將簡單介紹服務水準目標(Service Level Objective : SLO)與服務水準指標(Service Level indicator: SLI)是什麼,並說明為何對初次接觸這些概念的人來說,它們是必要的。

SRE 的主要角色

SRE 負責執行所有必要的工程任務,以確保向客戶提供「穩定性(stability)」與「可靠性(Reliability)」的服務。具體來說,這包括撰寫程式碼來提升效能與自動化流程、系統監控,以及事件回應。SRE 的目標是在盡可能適應變動的同時,維持服務的穩定性,進而提供高度可靠的服務。

「可靠性(Reliability)」這個詞彙較為抽象,可以理解為與「信賴」相關的任何正面描述,常見的面向包括:

  • 提供快速的服務。
  • 提供穩定的服務。
  • 提供安全的服務。

最終,服務可靠性代表的是用戶能夠信任並持續使用該服務。換句話說,可靠性並非由服務提供者的監控數據單方面決定,而是取決於用戶的實際體驗與感知。

因此,SRE 必須能夠透過數據來表達用戶對服務的感受。舉例來說,不應該只用「服務很慢」或「服務不穩定」等定性描述,而是要用量化的方式呈現,例如:「訊息傳送 API 的回應速度已放慢至超過 1 秒,對用戶造成不便。」這就需要明確的標準、分級以及針對不同情況的應對方案。

這正是 SLI(服務水準指標)SLO(服務水準目標) 以及 SLA(Service Level Agreement 服務水準協議) 這些概念發揮作用的地方。LINE App 也導入了 SLI 和 SLO,藉此向用戶提供更可靠的服務。

可靠性如何被衡量?

如前面簡短提及,可靠性如何以量化方式進行衡量呢?

讓我們以「影片服務」為例來說明。對用戶而言,使用影片服務時最重要的是影片能夠快速啟動且播放順暢不中斷。在這裡,影片啟動所需的延遲時間(Latency)即成為服務水準指標(SLI),也就是衡量服務表現的指標。而這個指標的目標值,即是服務水準目標(SLO)。

另外,對於訂閱制服務來說,因為這是用戶與公司間的契約,會明確規定與這些指標相關的標準,若未達標則會有相應的賠償條款,這就是服務水準協議(SLA)。

我們使用的這個例子是簡化且直觀的,目的是讓任何人都能輕鬆理解。接下來,我們將更深入地探討每個概念的細節。

使用者旅程(User Journey)

要理解 SLI、SLO 和 SLA,首先需要了解「使用者旅程」的概念。使用者旅程指的是用戶在使用服務時所經歷的過程或流程。

以先前提到的影片服務為例,「用戶在服務中播放影片的過程」就是一個使用者旅程。在即時通訊服務中,則可能是「用戶發送訊息的流程」或「用戶新增好友的過程」。

而使用者旅程中關鍵功能與服務的流程,稱為關鍵使用者旅程(Critical User Journey, CUJ)。導入 SLI 和 SLO 的第一步,就是先定義服務的主要功能所對應的 CUJ,並識別每個使用者旅程中所使用的 API。

SLI, SLO, SLA

以下表格總結了概念關於 SLI, SLO 與 SLA

分類Service Level Indicator (SLI)Service Level Objective (SLO)Service Level Agreement (SLA)
敘述
  • 從使用者角度定量衡量服務穩定性的數值
  • 例如延遲(Latency)、可用性(Availability)、吞吐量(Throughput)等
  • 透過測量的 SLI 設定服務必須達到的目標值或範圍,以符合用戶期望
  • 基於 SLO 與用戶簽訂的商業契約(非免費服務適用)
範例
  • 過去 1 分鐘影片播放請求的第 95 百分位延遲低於 300 毫秒
  • 過去 1 分鐘影片清單取得請求的可用率達 99.9%(以 2XX、3XX 狀態碼計算)
  • 過去 1 個月影片播放的 SLI 達到 99.9%
  • 過去 1 個月影片清單取得的 SLI 達到 99.9%
  • 影片服務每月維持 99.8% 上線時間
  • IT 支援團隊於 1 小時內回覆客戶郵件
  • 影片播放重大故障於 4 小時內解決

以下範例對 SLI 與 SLO 的定義做了更細緻的說明,文字顏色分別代表:事件(Event)成功標準(Success Criterion)在哪裡及如何測量(API 與測量方法)測量時間窗(Measurement Window)

請注意,這些範例為一般性示範,尚未針對特定關鍵使用者旅程(CUJ)進行定義。

<範例 1:基於延遲的 SLI/SLO>

SLI 類型
  • 延遲 (Latency)
SLI 規格
  • 測量 Gateway Log 中,對 /api001 HTTP GET 請求中,有多少比例的請求能在 300 毫秒內完成完整回應。
  • HTTP GET 成功 請求數HTTP GET 請求數 ×100%\frac { HTTP\ GET\ 成功\ 請求數}{ HTTP\ GET\ 請求數}\ \times 100\%
SLI 實作細節
  • HTTP 方法: GET
  • API: /api001
  • 成功標準: 回應時間在 300 毫秒以內
  • 測量位置與方式: Gateway Log
SLO
  • 過去 28 天的滾動時間窗內,/api001  API 的 HTTP GET 請求中,有 99.9% 請求成功且符合回應時間標準

<範例 2:基於可用性的 SLI/SLO>

SLI 類型
  • 可用性 (Availability)
SLI 規格
  • 測量 Gateway Log 中,對 /api002  /api002 的 HTTP POST 請求中,有多少比例的請求回應狀態碼為 2XX、3XX 或 4XX(不包含 429)
  •  HTTP POST 成功 請求數 HTTP POST 請求數 ×100%\frac {\ HTTP\ POST\ 成功\ 請求數}{\ HTTP\ POST\ 請求數}\ \times 100\%
SLI 實作類型
  • HTTP 方法: POST
  • API: /api002
  • 成功標準: 回應狀態碼為 2XX、3XX 或 4XX(不包含 429)
  • 測量位置與方式: Gateway Log
SLO
  • 過去 28 天的滾動時間窗內,/api002  API 的 HTTP GET 請求中,有 99.9% 請求成功且符合回應時間標準

以下是基於 SLI/SLO 的可靠性衡量流程總結:

image

定義與衡量 SLI/SLO 的原則

  1. 從使用者角度出發: 重要的不是能測量什麼數值,而是找出用戶真正關心的指標。

  2. 保持簡單明瞭: 若 SLI 以過於複雜的方式彙整,可能無法清楚反映系統的真實狀況,因此應盡量簡單。

  3. 設定最少數量的 SLO: 挑選能準確反映系統特性的最少數目 SLO,避免過多目標造成管理與判斷困難。

  4. 設定合理目標: 設定能反映期望的目標,但避免過高(例如 100%)的要求,以免不切實際。

  5. 持續發展與改進: 無法一開始就完美設定 SLI/SLO,必須持續檢視、調整與優化。

錯誤預算(Error Budget)

當你已經量測了 SLI 並設定了 SLO 作為目標後,接下來需要管理風險與錯誤,以應對目標未達成的狀況。

這時「錯誤預算」的概念就非常重要。錯誤預算是根據 SLO 所定義的,允許服務在一定範圍內發生失敗或穩定性下降的容忍度。舉例來說,如果 SLO 設定為一個月內可用率 99.9%,代表允許有 0.1% 的錯誤率。用公式計算的話,這 0.1% 的錯誤率相當於一個月內約 40.32 分鐘 的容錯時間。

99.9%=0.1%=0.001×28×24小時×60小時=40.32分鐘\frac {\small 99.9\%↑}{\small 月} = \frac {\small 0.1\%↓}{\small 月} = 0.001 \times \frac {\small 28 天}{\small 月} \times \frac {\small 24 小時}{\small 天} \times \frac {\small 60 分}{\small 小時} = \frac {\small 40.32 分鐘}{\small 月}

譯者說明:

  • 99.9% 的可用率意即每個月允許 0.1% 的錯誤時間。
  • 0.1% 換算成數值為 0.001。
  • 以 28 天為一個月計算,乘上每天 24 小時與每小時 60 分鐘,得到每月允許的錯誤時間約為 40.32 分鐘。

如下面所示,SLO 設定越高,允許的錯誤時間自然越少(以下計算皆以一個月為基準)。不過,目標設定過高並非總是好事。Google 說明,將可用率從 99.9% 提升到 99.99%,或從 99.99% 提升到 99.999%,所需的努力是原本的 10 倍(參考資料)。因此,根據不同服務的特性與狀況,適當設定目標非常重要。

SLO 目標允許的錯誤時間(每月)對應說明
99.9%約 40 分鐘可由人工偵測異常、監控、找出根因並修復
99.99%約 4 分鐘錯誤時間過短,人工難以即時偵測與修復,需設計系統自動偵測與自我修復
99.999%約 24 秒人工無法偵測,必須完全依賴系統自動監控與修復

錯誤預算的最大優點是讓開發團隊與 SRE 團隊能以「同一語言」討論「服務可靠性」問題,也就是判斷服務是否正常運作。此外,錯誤預算讓開發團隊能夠自主管理風險。透過觀察錯誤預算的使用狀況,開發團隊可以決定是優先投入新功能開發,還是專注於提升服務穩定性。

  • 當錯誤預算已用盡且服務不穩定時,所有新功能開發與發布應暫停,重點放在修復與穩定服務上。
  • 當錯誤預算尚未用盡時,則可以繼續推動新功能開發。

需要注意的是,錯誤預算中涵蓋的錯誤不僅限於應用程式本身,還包括網路、儲存等各種可能影響服務的錯誤,且這些錯誤的定義應依據各服務的特性來設定。

SLI/SLO 的實際運用

當你已經定義並實作了 SLI/SLO,就能開始以量化方式評估用戶對服務可靠性的感受。那麼,SRE 如何在實際運維工作中善用 SLI/SLO 呢?

  1. 共用語言評估可靠性
    服務相關的各方利害關係人可以共同使用「SLI」、「SLO」與「錯誤預算」來評估可靠性,透過這些量化指標以相同語言討論服務狀況。

  2. 定期監控與回顧
    透過定期會議(如每週或每月),共同監控 SLI/SLO 狀態,分享指標變化,找出變化原因或問題,並定義改善方案。

  3. 建立基於錯誤預算的警示系統
    利用錯誤預算設計分階段的警示機制,向值班人員或服務運維團隊發出警告,讓他們能及時採取相應行動。

  4. 根據 SLO 與錯誤預算調整策略與資源分配
    根據錯誤預算的餘額,決定是否可以加快新功能發布與短週期部署;若錯誤預算不足,則將資源優先投入服務穩定性提升與修復。

結語

希望本篇文章能幫助對 SRE 角色感到好奇,或對 SLI/SLO 概念感到困惑的讀者有所幫助。在接下來的第二與第三部分,我們將介紹應用於 LINE App 服務的量測與實作案例。第二部分將聚焦於平台層面的案例,第三部分則介紹應用程式層面的案例。期待各位的關注與支持,本文到此結束,謝謝大家。