一文詳解SRE之SLI/SLO設(shè)定
1.什么是SLI/SLO
SLI,全名Service Level Indicator,是服務(wù)等級(jí)指標(biāo)的簡(jiǎn)稱,它是衡定系統(tǒng)穩(wěn)定性的指標(biāo)。
SLO,全名Sevice Level Objective,是服務(wù)等級(jí)目標(biāo)的簡(jiǎn)稱,也就是我們?cè)O(shè)定的穩(wěn)定性目標(biāo)。
簡(jiǎn)單一句話:SLI 就是我們要監(jiān)控的指標(biāo),SLO 就是這個(gè)指標(biāo)對(duì)應(yīng)的目標(biāo)。
如何選擇SLI
在系統(tǒng)中,常見的指標(biāo)有很多種,比如:
- 系統(tǒng)層面:CPU使用率、內(nèi)存使用率、磁盤使用率等
- 應(yīng)用服務(wù)器層面:端口存活狀態(tài)、JVM的狀態(tài)等
- 應(yīng)用運(yùn)行層面:狀態(tài)碼、時(shí)延、QPS、TPS以及連接數(shù)等
- PASS層面:mysql、redis、kafka、mq和分布式文件儲(chǔ)存等組件的QPS、TPS、時(shí)延等。
這么多指標(biāo),應(yīng)該如何選擇呢?只要遵從兩個(gè)原則就可以:
- 選擇能夠標(biāo)識(shí)一個(gè)主體是否穩(wěn)定的指標(biāo),如果不是這個(gè)主體本身的指標(biāo),或者不能標(biāo)識(shí)主體穩(wěn)定性的,就要排除在外。
- 優(yōu)先選擇與用戶體驗(yàn)強(qiáng)相關(guān)或用戶可以明顯感知的指標(biāo)。
我們可以直接套用 Google 的方法:VALET。VALET 是 5 個(gè)單詞的首字母,分別是 Volume、Availability、Latency、Error 和 Ticket。這 5 個(gè)單詞就是我們選擇 SLI 指標(biāo)的 5 個(gè)維度。
Volume 容量(流量)
就是常說的QPS,TPS等。下圖是性能測(cè)試的拐點(diǎn)模型。

從圖中你可以發(fā)現(xiàn),并發(fā)用戶數(shù)處于輕壓力區(qū)時(shí),響應(yīng)時(shí)間平穩(wěn),吞吐量和并發(fā)用戶數(shù)線性相關(guān)。而當(dāng)并發(fā)用戶數(shù)處于重壓力區(qū)時(shí),系統(tǒng)資源利用率到達(dá)極限,吞吐量開始有下降的趨勢(shì),響應(yīng)時(shí)間也會(huì)略有上升。這個(gè)時(shí)候,再對(duì)系統(tǒng)增加壓力,系統(tǒng)就進(jìn)入拐點(diǎn)區(qū),處于超負(fù)荷狀態(tài),吞吐量下降,響應(yīng)時(shí)間大幅度上升。 所以我們?cè)谠u(píng)估系統(tǒng)性能時(shí)通常需要做壓力測(cè)試,目的就是找到系統(tǒng)的“拐點(diǎn)”,從而知道系統(tǒng)的承載能力,也便于找到系統(tǒng)的瓶頸,持續(xù)優(yōu)化系統(tǒng)性能。
Availability 可用性
可用性是一個(gè)抽象的概念,你需要知道要如何來度量它,與之相關(guān)的概念是:MTBF 和 MTTR。
- MTBF(Mean Time Between Failure)是平均故障間隔的意思,代表兩次故障的間隔時(shí)間,也就是系統(tǒng)正常運(yùn)轉(zhuǎn)的平均時(shí)間。這個(gè)時(shí)間越長(zhǎng),系統(tǒng)穩(wěn)定性越高。
- MTTR(Mean Time To Repair)表示故障的平均恢復(fù)時(shí)間,也可以理解為平均故障時(shí)間。這個(gè)值越小,故障對(duì)于用戶的影響越小。
- 可用性與 MTBF 和 MTTR 的值息息相關(guān),我們可以用下面的公式表示它們之間的關(guān)系:
- Availability = MTBF / (MTBF + MTTR)
Latency 延遲
是說響應(yīng)是否足夠快,這是一個(gè)會(huì)直接影響用戶訪問體驗(yàn)的指標(biāo)。但是這個(gè)還對(duì)系統(tǒng)資源有影響。這里區(qū)分成功請(qǐng)求和失敗請(qǐng)求很重要。
- 復(fù)雜的高并發(fā)系統(tǒng)通常會(huì)有很多的系統(tǒng)模塊組成,同時(shí)也會(huì)依賴很多的組件和服務(wù),比如說緩存組件,隊(duì)列服務(wù)等等。它們之間的調(diào)用最怕的就是延遲而非失敗,因?yàn)镠TTP 500錯(cuò)誤通常是瞬時(shí)的,可以通過重試的方式解決。
- 調(diào)用某一個(gè)模塊或者服務(wù)發(fā)生比較大的延遲,調(diào)用方就會(huì)阻塞在這次調(diào)用上,它已經(jīng)占用的資源得不到釋放。當(dāng)存在大量這種阻塞請(qǐng)求時(shí),調(diào)用方就會(huì)因?yàn)橛帽M資源而掛掉。如果把HTTP 500回復(fù)的延遲也計(jì)算在內(nèi),可能會(huì)產(chǎn)生誤導(dǎo)性的結(jié)果。因此,監(jiān)控錯(cuò)誤恢復(fù)的延遲是很重要的。
Error 錯(cuò)誤
錯(cuò)誤率有多少?這里除了 5xx 之外,我們還可以把 4xx 列進(jìn)來,因?yàn)榍懊嫖覀兊姆?wù)可用性不錯(cuò),但是從業(yè)務(wù)和體驗(yàn)角度,4xx 太多,用戶也是不能接受的。有時(shí)候還有隱式的失敗。比如http 200恢復(fù)中包含了錯(cuò)誤內(nèi)容,或者策略導(dǎo)致的失敗。比如我們要求超過一秒的請(qǐng)求就返回失敗,這樣超過一秒的請(qǐng)求都是失敗請(qǐng)求。當(dāng)協(xié)議內(nèi)部的錯(cuò)誤碼不能表達(dá)全部的失敗情況時(shí),可以利用其它信息,如內(nèi)部協(xié)議,來跟蹤一部分特定故障情況。
Ticket 故障單
是否需要人工介入?如果一項(xiàng)工作或任務(wù)需要人工介入,那說明一定是低效或有問題的。舉一個(gè)我們常見的場(chǎng)景,數(shù)據(jù)任務(wù)跑失敗了,但是無法自動(dòng)恢復(fù),這時(shí)就要人工介入恢復(fù);或者超時(shí)了,也需要人工介入,來中斷任務(wù)、重啟拉起來跑等等。
Tickets 的 SLO 可以想象成它的中文含義:門票。一個(gè)周期內(nèi),門票數(shù)量是固定的,比如每月 20 張,每次人工介入,就消耗一張,如果消耗完了,還需要人工介入,那就是不達(dá)標(biāo)了。好,VALET 我們就講完了,怎么選 SLI 指標(biāo),你是不是一下子就清楚了??梢哉f,這是一個(gè)我們可以直接復(fù)用的工具。
SLO 方式計(jì)算
我們可以將多個(gè)SLO的百分?jǐn)?shù)相乘,得到最后的SLO值。
- SLO1:99.95% 狀態(tài)碼成功率
- SLO2:90% Latency <= 80ms
- SLO3:99% Latency <= 200ms
- 直接用公式表示:
- Availability = SLO1 & SLO2 & SLO3
2.案例:
本案例源自《SRE工作手冊(cè)》英文版第三章,講述的是家得寶(THD)公司在SRE轉(zhuǎn)型中如何使用VALET來定義SLO:家得寶又創(chuàng)建一個(gè) VALET 應(yīng)用程序,以存儲(chǔ)和報(bào)告 SLO 數(shù)據(jù)。由于 SLO 可以最好地用作趨勢(shì)工具,因此該服務(wù)每天、每周和每月對(duì) SLO 進(jìn)行跟蹤。請(qǐng)注意,我 SLO 是一種趨勢(shì)分析工具,可用于錯(cuò)誤預(yù)算,但未直接連接到監(jiān)控系統(tǒng)。相反,家得寶仍舊有各種不同的監(jiān)控平臺(tái),每個(gè)監(jiān)控平臺(tái)都有自己的報(bào)警。這些監(jiān)控系統(tǒng)每天匯總其 SLO ,并發(fā)布到 VALET 服務(wù)以進(jìn)行趨勢(shì)分析。這種設(shè)置的缺點(diǎn)是,監(jiān)控系統(tǒng)中設(shè)置的警報(bào)閾值未與 SLO 集成在一起。但是,可以根據(jù)需要靈活地更改監(jiān)控系統(tǒng)。TPS 報(bào)告是第一個(gè)與 VALET 服務(wù)集成的系統(tǒng),到目前為止,家得寶的 VALET 與其各種本地應(yīng)用程序平臺(tái)(在 VALET 中注冊(cè)的服務(wù)的一半以上)集成。
VALET 儀表板
VALET 儀表板如上圖所示,用于可視化和報(bào)告此數(shù)據(jù),并且相對(duì)簡(jiǎn)單。它允許用戶:
- 注冊(cè)新服務(wù)。這通常意味著將服務(wù)分配給一個(gè)或多個(gè)URL,這些URL可能已經(jīng)收集了VALET數(shù)據(jù)。
- 為五個(gè) VALET 類別中的任何一個(gè)設(shè)定 SLO 目標(biāo)。
- 在每個(gè) VALET 類別下添加新的指標(biāo)類型。例如,一項(xiàng)服務(wù)可以跟蹤 P99 的延遲,而另一項(xiàng)服務(wù)可以跟蹤 P90 (或兩者)的延遲。后端處理系統(tǒng)可以跟蹤每天的交易量(一天創(chuàng)建的購(gòu)買訂單),而客戶服務(wù)前端可以跟蹤每秒的高峰交易。
VALET 儀表板使用戶可以立即報(bào)告許多服務(wù)的 SLO ,并以多種方式對(duì)數(shù)據(jù)進(jìn)行切片和切塊。例如,一個(gè)團(tuán)隊(duì)可以查看過去一周不滿足 SLO 的所有服務(wù)的統(tǒng)計(jì)信息。尋求查看服務(wù)性能的團(tuán)隊(duì)可以查看所有服務(wù)及其所依賴服務(wù)的延遲。VALET 儀表板將數(shù)據(jù)存儲(chǔ)在簡(jiǎn)單的Cloud SQL數(shù)據(jù)庫(kù)中,開發(fā)人員使用流行的 BI 工具來構(gòu)建報(bào)告。這些報(bào)告成為開發(fā)人員采取新的最佳實(shí)踐的基礎(chǔ):定期對(duì)其服務(wù)進(jìn)行 SLO 審核(通常是每周或每月)?;谶@些審查,開發(fā)人員可以創(chuàng)建操作項(xiàng)以將服務(wù)返回到其 SLO ,或者可以決定需要調(diào)整不切實(shí)際的 SLO。
將VALET應(yīng)用于批處理應(yīng)用
當(dāng)圍繞 SLO 開發(fā)可靠的報(bào)告時(shí),家得寶還發(fā)現(xiàn),只要對(duì) VALET 稍作調(diào)整,就可以用在批處理應(yīng)用程序上,如下所示:
- 容量:處理的記錄量
- 可用性:在一定時(shí)間內(nèi)完成工作的頻率(以百分比為單位)
- 延遲:作業(yè)運(yùn)行所需的時(shí)間
- 錯(cuò)誤:無法處理的記錄
- 故障單:操作員必須手動(dòng)修復(fù)數(shù)據(jù)并重新處理作業(yè)的次數(shù)
3.總結(jié):
根據(jù)上面的 SLI 和 SLO 設(shè)定標(biāo)準(zhǔn)示例,內(nèi)容很直觀,需要你認(rèn)真研上面的內(nèi)容。請(qǐng)你嘗試按照上面的格式,制定一個(gè)自己所負(fù)責(zé)系統(tǒng)的 SLO。
本文轉(zhuǎn)載自微信公眾號(hào)「運(yùn)維開發(fā)故事」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系運(yùn)維開發(fā)故事公眾號(hào)。