自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

要是還沒搞明白SLO,你算哪門子SRE呢?

開發(fā) 新聞
SLO的核心價值是定義服務(wù)能力,設(shè)置SLO報警,及時發(fā)現(xiàn)線上問題,優(yōu)化報警和推動穩(wěn)定性治理,主動幫業(yè)務(wù)團隊去提升業(yè)務(wù)質(zhì)量,合作共贏。

一、背景

最近幾年,Google SRE在國內(nèi)非常流行。Google SRE方法論中提出了SLO是SRE實踐的核心,SLO為服務(wù)可靠性設(shè)定了一個目標(biāo)級別,它是可靠性決策的關(guān)鍵因素。那如何選擇和計算SLI,如何設(shè)置SLO,如何實踐落地呢?本文就來講講B站SRE在實踐SLO時所走的彎路和總結(jié)的經(jīng)驗。

二、Google SRE中SLO的定義

服務(wù)水平目標(biāo)(SLO)指定了服務(wù)可靠性的目標(biāo)水平。由于SLO是做出以數(shù)據(jù)為依據(jù)的可靠性決策的關(guān)鍵,因此它們是SRE實踐的核心。

上文是Google SRE《站點可靠性手冊》中的原文。那為什么需要SLO呢,我們摘取原文中的核心觀點:

工程師稀缺,需要把時間投入到重要服務(wù)的核心問題上

  • SLO是做出工作優(yōu)先級排序和可靠性相關(guān)工作的關(guān)鍵

  • SRE的核心職責(zé)不僅是自動化和處理故障,日常工作都要按照SLO來開展

  • 沒有SLO,就沒有SRE

為了采用基于錯誤預(yù)算的可靠性工程方法,同樣摘取原文中的核心觀點:

  • 服務(wù)的利益相關(guān)方認(rèn)可此SLO

  • 服務(wù)正常狀態(tài)下可以達到SLO的要求

  • 組織認(rèn)可錯誤預(yù)算并在決策中發(fā)揮作用

  • 有完善的SLO流程

否則,SLO合規(guī)性成為一個KPI或報告指標(biāo),而不是決策制定工具。請記住這句話,因為我們的彎路就走到這里了。

三、Google SRE中SLO的實施

在《站點可靠性手冊》第二章“實施SLO”中,Google詳細(xì)講述了如何實施SLO,大致流程如下:

1)SLI選擇

  • 對于請求驅(qū)動型服務(wù),SLI一般選擇可用性(成功響應(yīng)的請求比例)、延遲、質(zhì)量。

2)SLI計算

  • SLI的計算可以使用應(yīng)用服務(wù)器日志、負(fù)載均衡監(jiān)控、黑盒監(jiān)控、客戶端插件等數(shù)據(jù)源。
  • 一般選擇負(fù)載均衡監(jiān)控,因為其代表一個用戶請求在整套系統(tǒng)所有模塊處理耗時和所有網(wǎng)絡(luò)傳輸耗時的總和,且和客戶端插件相比,實施成本較低。

3)SLO定義

  • 基于計算出來的可用性、延遲數(shù)據(jù),來定義合適的服務(wù)SLO。

  • 服務(wù)可用性:例如,全年可用性 > = 99.99%。

  • 服務(wù)延遲:例如,99%的請求<= 200ms,90的請求< 100ms。

  • 可以在不同的時間窗口上定義SLO,比如一個月或一個季度。

  • 獲得關(guān)鍵的利益相關(guān)者認(rèn)可和批準(zhǔn)。

4)錯誤預(yù)算

  • 有了SLI和SLO,時間窗口內(nèi)的允許失敗數(shù)就知道了。

  • 如果給定時間內(nèi)錯誤預(yù)算消耗殆盡,要制定錯誤預(yù)算執(zhí)行策略,如:開發(fā)團隊專注于可靠性問題,直到系統(tǒng)處于SLO范圍內(nèi),功能迭代推遲;為了降低風(fēng)險,凍結(jié)生產(chǎn)系統(tǒng)的變更,直到有了錯誤預(yù)算來支持變更。

5)記錄SLO和錯誤預(yù)算

  • SLO的作者,審核人,批準(zhǔn)日期,下次審核日期,相關(guān)背景。

  • 定義和變更有平臺、流程、制度、變更事件可回溯。

  • SLO的細(xì)節(jié):SLI實現(xiàn)、如何計算、如何使用錯誤預(yù)算。

  • 錯誤預(yù)算的記錄跟上面信息類似。

6)儀表盤和報表

  • 除了已發(fā)布的SLO和錯誤預(yù)算,還需要一個報表和儀表盤來做展示。

7)持續(xù)改進SLO,提高SLO質(zhì)量

四、我們的SLO實踐

從上文Google對SLO的介紹中,我們抽象出了關(guān)鍵信息來指導(dǎo)我們的建設(shè)。

圖片

1、服務(wù)分級

1)應(yīng)用:技術(shù)視角

  • 一個應(yīng)用對應(yīng)一個appid,包括前端和后端應(yīng)用。

  • 編碼構(gòu)建后,可獨立部署運行。

  • 一個業(yè)務(wù),會包含多個應(yīng)用,一般具有相同的命名前綴或關(guān)鍵詞。

2)業(yè)務(wù):產(chǎn)品視角

  • 一組網(wǎng)站/APP產(chǎn)品相關(guān)功能的聚合。
  • 相對獨立的業(yè)務(wù)模塊。
  • 包含一組相關(guān)聯(lián)的應(yīng)用。

3)等級分級

我們分為L0-L3四個級別:

  • L0

公司級核心業(yè)務(wù),一般是公司級基礎(chǔ)服務(wù)或公司核心業(yè)務(wù)場景,如APP推薦、視頻播放、支付平臺及強依賴業(yè)務(wù)等。

  • L1

部門級核心業(yè)務(wù),一般是L0業(yè)務(wù)體驗中依賴的主要業(yè)務(wù)、核心的二類業(yè)務(wù),如視頻播放頁的一鍵三連功能、核心二類業(yè)務(wù)動態(tài)、搜索等。

  • L2

用戶可直接使用的其他業(yè)務(wù),如播單、分享、專欄、答題等。

  • L3

其他后臺類業(yè)務(wù)或?qū)τ脩趔w驗無影響的業(yè)務(wù)。

4)分級對象

  • 先對業(yè)務(wù)(產(chǎn)品)定級。
  • 再對這個業(yè)務(wù)下的多個應(yīng)用定級,根據(jù)應(yīng)用所提供的產(chǎn)品功能和故障影響來定,應(yīng)用等級不超過業(yè)務(wù)等級。
  • 在對此業(yè)務(wù)中用戶所能觸達到的API定級,API等級不超過應(yīng)用等級。

5)分級用途

  • 基于服務(wù)等級,要求核心服務(wù)遵守對應(yīng)技術(shù)標(biāo)準(zhǔn)。
  • 對不同等級的服務(wù),制定不同的變更流程。
  • 報警基于服務(wù)等級來做分級。
  • 要求服務(wù)滿足穩(wěn)定性要求,如具備熔斷降級能力,具備同城雙活能力等。

6)分級運營

  • 其他基礎(chǔ)平臺展示分級數(shù)據(jù),基于服務(wù)等級定運行策略。

  • 基于分級后的技術(shù)標(biāo)準(zhǔn)、流程等反推定級準(zhǔn)確率提升。

2、SLO系統(tǒng)

1)SLI選擇

對于在線業(yè)務(wù)來說,基本都是請求驅(qū)動的業(yè)務(wù),所以選擇可用性、延遲、吞吐。

  • 可用性:我們度量了兩個指標(biāo):錯誤量、請求成功率。

  • 延遲:我們度量了p90和p99兩個分位的延遲數(shù)據(jù)。

  • 吞吐:每天的請求總量和單位時間的請求速率。

可用性為什么不選擇可用時間來度量呢?如果選擇時間,一般的做法是在某個時間段內(nèi)錯誤率大于多少,則認(rèn)為這段時間內(nèi)服務(wù)不可用。假如這段時間內(nèi)某個服務(wù)錯誤率低于閾值但同時有大量用戶反饋不可用的話,我們不能掩耳盜鈴的認(rèn)為這段時間服務(wù)是可用的。因為無法解決這個問題,所以我們選擇了請求成功率。

2)SLI模型

  • 應(yīng)用的API是業(yè)務(wù)功能的直接體現(xiàn),通過度量API的SLI就能反映出業(yè)務(wù)某個功能的情況。
  • 選擇能代表業(yè)務(wù)核心功能的API,按上面的業(yè)務(wù)分級模型對這些API定級,一般只度量L0、L1等級的業(yè)務(wù)和其接口。
  • 業(yè)務(wù)一般都會提供多個功能,比如彈幕的讀寫,評論的讀寫,所以業(yè)務(wù)的SLI是由代表業(yè)務(wù)功能的多個API SLI數(shù)據(jù)聚合而成的。
  • 對于API,我們度量可用性、延遲、吞吐。
  • 對于業(yè)務(wù),我們通過聚合API 的SLI,主要度量可用性。

3)SLI計算

  • 統(tǒng)一標(biāo)準(zhǔn),使用接入層負(fù)載均衡指標(biāo)。所有面向用戶的公網(wǎng)服務(wù)都會經(jīng)過接入層負(fù)載均衡,也即SLB(下文統(tǒng)稱為SLB)。

  • 內(nèi)網(wǎng)服務(wù)東西向調(diào)用時通過服務(wù)發(fā)現(xiàn)直接調(diào)用,不過SLB,所以無法用SLB的指標(biāo)度量。我們認(rèn)為內(nèi)網(wǎng)服務(wù)的故障最終能在面向用戶側(cè)的公網(wǎng)服務(wù)中體現(xiàn)出來,所以我們只對面向用戶的公網(wǎng)服務(wù)做度量。

  • API可用性:每分鐘計算出API的錯誤量(HTTP 5XX請求)、總請求量、成功率、分位延遲請求量、吞吐。每天再聚合出一天的錯誤量、總請求量、成功率、分位延遲請求量、吞吐。有了每天的數(shù)據(jù)后,可靈活的聚合出API每個季度、半年、全年或某個時間區(qū)間的數(shù)據(jù)。

  • 業(yè)務(wù)可用性:對于業(yè)務(wù)來說,我們只做錯誤量、成功率聚合。

(a)相同等級的API權(quán)重應(yīng)該是一樣的,不同等級的API應(yīng)該加權(quán);

?(b)每分鐘計算出L0等級API的錯誤量之和、總請求量之和、總成功率(1 - (錯誤量之和 / 總請求量之和));

(c)每分鐘L1等級的API也聚合出相同的數(shù)據(jù);

(d)每分鐘業(yè)務(wù)可用性 = (L0 API總成功率 * 權(quán)重 + L1 API總成功率 * 權(quán)重)/ 總權(quán)重;

(e)有了業(yè)務(wù)每分鐘的可用性后,再聚合出業(yè)務(wù)一天的可用性,以及靈活的聚合出每個季度、半年、全年或某個時間區(qū)間的數(shù)據(jù)。

4)SLO定義

  • 只對可用性和延遲做SLO定義,吞吐做SLI儀表盤和報表即可;

  • 在API分級時,我們會對API設(shè)置一個基于分級的默認(rèn)SLO,比如L0 API 可用性>= 99.99%,L1 API可用性>= 99.99%,L0 API 99分位延遲<=200ms;

  • 在業(yè)務(wù)分級時,我們會讓研發(fā)對業(yè)務(wù)設(shè)置一個可用性SLO目標(biāo),比如全年可用性>= 99.99%。

5)錯誤預(yù)算

  • 我們在一開始嘗試SLO時,并沒有去重點建設(shè)錯誤預(yù)算。只是使用了基于服務(wù)分級的SLO錯誤量和可用性報警。

6)記錄SLO和錯誤預(yù)算

我們提供了平臺化能力去支持定義SLO時的審核和記錄。

7)儀表盤和報表

  • API儀表盤與報表

圖片

  • 業(yè)務(wù)儀表盤與報表

圖片

圖片

上面一套SLO體系建設(shè)完成以后,我們對L0、核心L1業(yè)務(wù)都做了SLO定義、SLI指標(biāo)和計算。核心API和業(yè)務(wù)都具備了SLI報表能力,我們的可用性有了可視化的圖表,一切似乎非常美好...但仍存在問題。

五、遇到的問題

圖片

1)業(yè)務(wù)定級

  • 業(yè)務(wù)抽象認(rèn)知不一,產(chǎn)品范圍可大可小。

  • L0、核心L1業(yè)務(wù)在SRE的關(guān)注下定級基本準(zhǔn)確,但其他業(yè)務(wù)定級就一言難盡了。

2)應(yīng)用定級

  • 應(yīng)用數(shù)量遠(yuǎn)多于業(yè)務(wù),定級難度更高。

  • 老應(yīng)用等級更新延遲于業(yè)務(wù)重構(gòu)或產(chǎn)品迭代。

  • 除L0、核心L1應(yīng)用外,其他應(yīng)用等級準(zhǔn)確率低。

3)接口定級 

  • 接口數(shù)量又遠(yuǎn)多于應(yīng)用,定級耗時耗力,維護成本高,當(dāng)時公司還沒有API GW平臺。

  • 同上,接口等級更新延遲于業(yè)務(wù)重構(gòu)或產(chǎn)品迭代。

4)SLI計算

  • 當(dāng)服務(wù)因上下游調(diào)用依賴導(dǎo)致請求失敗時,API的HTTP CODE可能是200,真實的錯誤被封到了業(yè)務(wù)錯誤碼中。SLB作為通用的負(fù)載均衡,不會去解析HTTP Body。

  • 這就導(dǎo)致一個問題:服務(wù)故障了半個小時,但今天的可用性卻是100%,可用性SLI指標(biāo)沒受到任何影響,SLO也完全符合要求。

  • 如果我們改用應(yīng)用上報的Metrics(內(nèi)部使用Prometheus),可以解決此問題。但當(dāng)應(yīng)用不可用,無法上報Metrics時,也會獲取不到數(shù)據(jù),導(dǎo)致SLI數(shù)據(jù)不準(zhǔn)確。

  • 我們試過推研發(fā)把業(yè)務(wù)錯誤碼中的系統(tǒng)錯誤(調(diào)用依賴類的系統(tǒng)錯誤,而非業(yè)務(wù)邏輯錯誤)改為HTTP CODE,但成本極高,跟微服務(wù)的標(biāo)準(zhǔn)也不相符。

5)業(yè)務(wù)SLI

  • 需要篩選出影響業(yè)務(wù)核心功能的API,這些API的SLI數(shù)據(jù)再聚合到業(yè)務(wù),其他API的SLI數(shù)據(jù)不影響業(yè)務(wù)SLI 。

  • 業(yè)務(wù)迭代導(dǎo)致API變更,原API SLI不再代表業(yè)務(wù)功能,導(dǎo)致業(yè)務(wù)SLI數(shù)據(jù)沒價值。

6)總結(jié)一下遇到的問題

  • 分級模型過于理想,定級成本高;

  • 業(yè)務(wù)SLI關(guān)聯(lián)關(guān)系、API SLI元信息更新不及時,數(shù)據(jù)準(zhǔn)確率低;

  • 無法通過一條Metrics計算到的可用性SLI來覆蓋業(yè)務(wù)全部故障場景;

  • 部分部門的業(yè)務(wù)只提供內(nèi)網(wǎng)服務(wù),不直接對用戶,導(dǎo)致沒有SLI數(shù)據(jù);

  • SLI數(shù)據(jù)好像除了當(dāng)報表外,也沒什么價值。

最后壓死我們SLO體系的稻草是一個業(yè)務(wù)需求:把業(yè)務(wù)的可用性SLI作為業(yè)務(wù)年度可用性總結(jié)報表,替代基于故障時間計算出的業(yè)務(wù)年度可用性。此需求我們認(rèn)為是合理的,因為我們度量了業(yè)務(wù)可用性SLI,那算出的可用性當(dāng)然可以作為業(yè)務(wù)年度總結(jié)報表來使用了。但我們在實際使用數(shù)據(jù)時遇到了一個問題:

假設(shè)某業(yè)務(wù)正常情況下一天的總請求是24W,此業(yè)務(wù)某天故障了半個小時,這半個小時在未故障時的請求量是1W,故障時因為用戶或鏈路上的重試導(dǎo)致接入層負(fù)載均衡收到的故障請求為2W。

  • 基于請求成功率算出的當(dāng)天業(yè)務(wù)可用性:( 1 - 2W / ( 24W + 1W) ) * 100% = 92%,假設(shè)此業(yè)務(wù)一年內(nèi)其他時間日請求不變,每天都是100%可用性,則此業(yè)務(wù)全年可用性為:1 - (2W / ( 25W + 24W * 364))  = 99.977%

  • 基于故障時間算出的當(dāng)天業(yè)務(wù)可用性為:( 1 - 0.5 / 24 ) * 100% = 97.916%,假設(shè)此業(yè)務(wù)全年其他時間每天都是100%的可用性,則此業(yè)務(wù)全年可用性為:( 1 - 0.5 / 24 / 365 ) * 100% = 99.994%

可以看出,兩種計算方式得出的可用性差距極大。為了解決這個問題,我們想到了一種數(shù)據(jù)補償機制:基于故障時段的同環(huán)比數(shù)據(jù)對故障損失數(shù)據(jù)去重,盡量向故障時間數(shù)據(jù)靠齊。去重后基于請求成功率數(shù)據(jù)結(jié)果為:

  • 忽略重試增加的1W請求量,則當(dāng)天業(yè)務(wù)可用性:( 1 - 1W /  24W ) * 100% = 95.833%,假設(shè)此業(yè)務(wù)一年內(nèi)其他時間日請求不變,每天都是100%可用性,則此業(yè)務(wù)全年可用性為:1 - (1W / ( 24 * 365))  = 99.988%

此方式雖然依舊無法跟基于故障時間的可用性數(shù)據(jù)對齊,但已經(jīng)非常接近了,我們認(rèn)為加上了數(shù)據(jù)補償機制之后,統(tǒng)一用這個計算標(biāo)準(zhǔn)的話,業(yè)務(wù)的可用性SLI是可以作為業(yè)務(wù)年度可用性報表使用的。想法又一次非常美好...

實際運作起來時,我們發(fā)現(xiàn)成本太高了。當(dāng)發(fā)生了影響業(yè)務(wù)核心功能的事故,我們就要對故障數(shù)據(jù)去重,然后修訂故障當(dāng)天的SLI數(shù)據(jù)。需要有人去盯著事故報告的損失,跟研發(fā)一起核對損失數(shù)據(jù),再修訂SLI數(shù)據(jù).....

最終,因為我們執(zhí)著于提升SLI的準(zhǔn)確率,導(dǎo)致整個SLO系統(tǒng)無法運轉(zhuǎn)......此時我們的SLO體系開始停滯和崩潰.....

六、反思

我們開始反思問題出在了哪里,SLO的價值到底是什么?SLI度量的對象到底是什么?是業(yè)務(wù)嗎,還是應(yīng)用?Google 基于錯誤預(yù)算做了消耗率報警,我們的SLO除了做報表外好像沒啥價值?想清楚這些問題后我們才意識到之前為什么走偏了。

1)SLO是可靠性決策的關(guān)鍵因素,但不是非有不可

  • 在沒有SLO、SLI之前,我想大家的穩(wěn)定性工作也能分的清楚優(yōu)先級,比如基于事故復(fù)盤來決策高可用工作方向,如服務(wù)降級、熔斷、中間件高可用、多活容災(zāi)等。

2)SLO的價值絕對不是報表,而是及時報警,發(fā)現(xiàn)影響SLI指標(biāo)的異常

  • SRE中有一章專門講基于SLO的報警,但在我們的實踐中卻忽略了這個方向,執(zhí)著于提升SLI指標(biāo)的準(zhǔn)確率。

  • 應(yīng)用每天都有無數(shù)的報警通知,如CPU、內(nèi)存、磁盤、調(diào)用超時、請求錯誤、請求重試等,產(chǎn)生了大量噪音。但哪些報警會影響到可用性SLI需要SRE和研發(fā)關(guān)注呢?我想這就是SLO的核心價值之一了。

3)錯誤預(yù)算策略是詩與遠(yuǎn)方

  • 如果業(yè)務(wù)某個季度發(fā)生事故,把這個季度的錯誤預(yù)算耗盡,SLO已不符合預(yù)期,SRE也不能凍結(jié)這個業(yè)務(wù)的變更。

  • 至于調(diào)整業(yè)務(wù)團隊的短期目標(biāo),從業(yè)務(wù)迭代轉(zhuǎn)到專注于可靠性問題還是可以的。但這個目標(biāo)一般是事故驅(qū)動達成的共識。

  • 如果讓國內(nèi)互聯(lián)網(wǎng)公司產(chǎn)品迭代停止三個月,我想沒有哪個公司會同意。

4)SLI度量的核心是業(yè)務(wù)功能和應(yīng)用,而不是聚合業(yè)務(wù)SLI

  • API是業(yè)務(wù)功能的直接體現(xiàn),通過度量API的SLI就能反映出業(yè)務(wù)某個功能的情況。

  • 業(yè)務(wù)功能不可能全部枚舉出來,接口也不可能全部定級和計算SLI。但應(yīng)用是有限且標(biāo)準(zhǔn)的,基于應(yīng)用的Metrics即可算出所有應(yīng)用的可用性SLI。

  • 業(yè)務(wù)核心功能的SLI通過API SLI已度量出來,是否要聚合成一條代表業(yè)務(wù)SLI的指標(biāo)其實并不重要。比如在業(yè)務(wù)報表頁面展示業(yè)務(wù)多個功能的API SLI數(shù)據(jù)可能會更直觀。

  • 業(yè)務(wù)SLI的核心價值是NOC/技術(shù)支持團隊在Oncall時的關(guān)注指標(biāo),或構(gòu)建業(yè)務(wù)場景監(jiān)控時從業(yè)務(wù)指標(biāo)到技術(shù)指標(biāo)的下鉆串聯(lián),更偏向運營層面。

以上內(nèi)容詳細(xì)介紹了我們在實踐SLO體系時的思路,落地方式和遇到的問題。在沒徹底理解SLO及其價值的情況下,我們就嘗試建設(shè)SLO體系,走了很多彎路。反思階段我們也認(rèn)清了SLO的價值。下面我們就來講述我們新認(rèn)知下的SLO體系建設(shè)思路。

圖片

七、業(yè)務(wù)分級優(yōu)化

1)等級分級

還是分為L0-L3四個級別:

① L0

公司級核心業(yè)務(wù),一般是公司級基礎(chǔ)服務(wù)或公司核心業(yè)務(wù)場景,如APP推薦、視頻播放、支付平臺及強依賴業(yè)務(wù)等,同時需滿足:

  • 滿足DAU > xx W;

  • 滿足日均營收>  xx W;

  • 雖未達到上述要求,但業(yè)務(wù)屬于公司戰(zhàn)略級方向。

② L1

部門級核心業(yè)務(wù),一般是L0業(yè)務(wù)體驗中依賴的主要業(yè)務(wù)、核心的二類業(yè)務(wù),如視頻播放頁的一鍵三連功能、核心二類業(yè)務(wù)動態(tài)等。

③ L2

用戶可直接使用的其他業(yè)務(wù),如播單、分享、專欄等。

④ L3

其他后臺類業(yè)務(wù)或?qū)τ脩趔w驗無影響的業(yè)務(wù)。

2)分級模型優(yōu)化

  • 對業(yè)務(wù)(產(chǎn)品)定級。

  • 創(chuàng)建應(yīng)用(也可叫服務(wù),下文不再區(qū)分)時,用戶打標(biāo)這個應(yīng)用對此業(yè)務(wù)的重要程度即可:核心、重要、普通。此數(shù)據(jù)非定級使用。

  • 用戶只需要在創(chuàng)建業(yè)務(wù)時做一次業(yè)務(wù)定級即可。

大大簡化我們的業(yè)務(wù)分級模型,不再對應(yīng)用和API分級,減少大家的心智負(fù)擔(dān)和運維、運營成本。

八、SLI選擇與計算

在線業(yè)務(wù)常見的微服務(wù)調(diào)用鏈路如下:

圖片

從上述鏈路圖中可以看出,可用率、延遲有如下兩種指標(biāo):

  • 應(yīng)用通過SLB代理時,使用SLB Metrics計算出應(yīng)用可用率、延遲等SLI:如服務(wù)A、服務(wù)B。

  • 應(yīng)用Server側(cè)上報指標(biāo)數(shù)據(jù),計算出應(yīng)用可用率、延遲等SLI:每個微服務(wù)都有這個指標(biāo)上報,適用所有服務(wù)。

圖片

上篇中我們有提到,我們只度量了面向用戶的公網(wǎng)服務(wù)。這導(dǎo)致我們的SLI覆蓋率很低,大量的內(nèi)網(wǎng)應(yīng)用沒有SLI,那SLO報警也就無從做起了?,F(xiàn)在補充了HTTP/gRPC Server Metrics后,就能覆蓋到所有應(yīng)用,同時也能覆蓋到所有的服務(wù)不可用場景。

  • 應(yīng)用訪問超時,容器OOM、進程Panic等不可用,會在SLB側(cè)上報錯誤指標(biāo)。

  • 應(yīng)用HTTP CODE 200,但因依賴下游服務(wù)、讀取DB、CACHE失敗等系統(tǒng)錯誤時,會在應(yīng)用Metrics側(cè)上報錯誤指標(biāo)。

  • 當(dāng)應(yīng)用無法上報Metrics時,可以認(rèn)為應(yīng)用已徹底不可用。

除可用率、延遲指標(biāo)外,應(yīng)用數(shù)據(jù)層面的新鮮度指標(biāo)也特別重要。當(dāng)數(shù)據(jù)發(fā)生延遲時,應(yīng)用Server側(cè)并不能直接感知到數(shù)據(jù)是延遲的,要通過其對中間件的Metrics指標(biāo)來度量。應(yīng)用對中間件的常見依賴如下圖:

圖片

可度量的數(shù)據(jù)新鮮度指標(biāo)如下:

  • 應(yīng)用對消息隊列服務(wù)的寫入和消費延遲指標(biāo):數(shù)據(jù)消費延遲會導(dǎo)致用戶緩存數(shù)據(jù)不更新。
  • 應(yīng)用所使用DB的主從同步延遲指標(biāo):數(shù)據(jù)同步延遲會導(dǎo)致用戶緩存數(shù)據(jù)不更新。
  • Canal作為數(shù)據(jù)同步組件的同步延遲指標(biāo):數(shù)據(jù)同步延遲會導(dǎo)致用戶緩存數(shù)據(jù)不更新。
  • 多活場景下DTS組件的同步延遲指標(biāo):數(shù)據(jù)同步延遲會導(dǎo)致多機房DB數(shù)據(jù)不一致。

1、應(yīng)用SLI選擇與計算

1)可用率

  • SLB Metrics度量出的應(yīng)用請求錯誤量(HTTP 5XX)、請求成功率。

  • HTTP/gRPC Server Metrics度量出的應(yīng)用請求錯誤量(非業(yè)務(wù)邏輯錯誤,如因下游依賴、DB、Cache請求失敗導(dǎo)致的應(yīng)用系統(tǒng)級錯誤,在我們的微服務(wù)框架中,這類錯誤code一般是-5xx)、請求成功率。

2)延遲

  • SLB Metrics度量出的應(yīng)用分位延遲。

  • HTTP/gRPC Server Metrics度量出的應(yīng)用分位延遲。

3)新鮮度

  • 應(yīng)用對MQ寫入、消費的Metrics來度量消息延遲。

  • 應(yīng)用所使用DB主從同步延遲Metrics。

  • 如果使用到Canal組件來更新緩存,那需要度量Canal對DB的消費延遲和對MQ的寫入延遲Metrics。

  • 多活場景下DTS組件的同步延遲Metrics。

上述Metrics以應(yīng)用維度采集計算存儲,在應(yīng)用視角我們就能看到應(yīng)用的核心SLI,基于這些SLI指標(biāo)再來做可用率和新鮮度的SLO報警,報警準(zhǔn)確率可以大大提升。

假如我們已經(jīng)度量了評論應(yīng)用的SLI指標(biāo),當(dāng)觸發(fā)SLO報警時,我們知道評論應(yīng)用出問題了,但并不知道是發(fā)評論還是讀評論功能出問題。為了提高我們SLO的業(yè)務(wù)精度,我們需要再對業(yè)務(wù)的核心功能做度量。

2、業(yè)務(wù)核心功能SLI選擇與計算

在上一篇中我們提到:應(yīng)用的API是業(yè)務(wù)功能的直接體現(xiàn),通過度量API的SLI就能反映出業(yè)務(wù)某個功能的情況。所以我們需要對核心API做SLI度量。

1)定義業(yè)務(wù)功能

  • 在SLO系統(tǒng)錄入業(yè)務(wù)對應(yīng)的業(yè)務(wù)核心功能,如發(fā)送評論、拉取評論。

  • 從API GW平臺獲取API信息,關(guān)聯(lián)到定義的業(yè)務(wù)功能。

2)API SLI選擇與計算

① 可用率

  • SLB Metrics度量出核心API的請求錯誤量(HTTP 5XX)、請求成功率。

  • HTTP/gRPC Server Metrics度量出核心API的請求錯誤量、請求成功率。

② 延遲

  • SLB Metrics度量出核心API的分位延遲。

  • HTTP/gRPC Server Metrics度量出核心API的分位延遲。

③ 吞吐

  • 核心API每天的請求總量和單位時間的請求速率。

注:吞吐只在核心API上度量,不在應(yīng)用上度量。因為應(yīng)用有多個API,包含很多不重要的API,對用戶感知很低,度量吞吐意義并不大。

④ 新鮮度

  • 因為應(yīng)用Server側(cè)并不能直接感知到數(shù)據(jù)是延遲的,是通過應(yīng)用對中間件的Metrics指標(biāo)來度量,所以API維度并無新鮮度指標(biāo)。

上述Metrics以API維度采集計算存儲,這樣在業(yè)務(wù)核心功能視角我們就能看到各種SLI指標(biāo)情況,以此來了解業(yè)務(wù)功能目前的運行情況。

3、業(yè)務(wù)SLI選擇與計算

我們已經(jīng)有了應(yīng)用SLI、業(yè)務(wù)核心功能的SLI,難道還不夠嗎?為何還要建設(shè)業(yè)務(wù)SLI呢?

原因如下:

  • 業(yè)務(wù)核心功能SLI是從技術(shù)指標(biāo)計算出來的,如發(fā)評論功能的可用率和數(shù)據(jù)延遲。前面我們有提到錯誤的請求是指系統(tǒng)依賴導(dǎo)致的錯誤而非業(yè)務(wù)邏輯錯誤,所以此技術(shù)指標(biāo)并不能代表業(yè)務(wù)邏輯上的成功率。

  • 業(yè)務(wù)SLI的核心價值是NOC/技術(shù)支持團隊在Oncall時的關(guān)注指標(biāo),或構(gòu)建業(yè)務(wù)場景監(jiān)控時從業(yè)務(wù)指標(biāo)到技術(shù)指標(biāo)的下鉆串聯(lián),更偏向運營層面。

業(yè)務(wù)指標(biāo)是需要從業(yè)務(wù)系統(tǒng)獲取,如業(yè)務(wù)DB或數(shù)倉平臺。所以只能覆蓋公司級核心業(yè)務(wù)指標(biāo),如:

  • 點播播放:播放量、在線人數(shù)
  • 社區(qū):發(fā)送評論量、評論彈幕量
  • 登錄:平均登錄量、各渠道登錄量

可以看出,業(yè)務(wù)SLI其實更側(cè)重于業(yè)務(wù)吞吐數(shù)據(jù)指標(biāo),有了這個指標(biāo)后,我們可以做以下兩方面的工作建設(shè):

  • 重大事故發(fā)現(xiàn):當(dāng)業(yè)務(wù)SLI指標(biāo)異常而觸發(fā)報警時,可以認(rèn)為線上發(fā)生了重大事故。在很多公司,NOC團隊的核心就是關(guān)注業(yè)務(wù)指標(biāo)的健康度情況。

  • 業(yè)務(wù)觀測運營:從業(yè)務(wù)吞吐指標(biāo)到業(yè)務(wù)功能技術(shù)指標(biāo)再到應(yīng)用技術(shù)指標(biāo),從上往下構(gòu)建業(yè)務(wù)-技術(shù)全鏈路監(jiān)控能力和可視化能力。

業(yè)務(wù)指標(biāo)數(shù)據(jù)收集成本較高,需要按業(yè)務(wù)系統(tǒng)case by case來建設(shè)。我們的思路是讓業(yè)務(wù)部門自建業(yè)務(wù)數(shù)據(jù),再由SLO系統(tǒng)同步、匯聚、清洗后做運營大盤與報警。

九、SLO與報警

1、應(yīng)用SLO

應(yīng)用維度我們度量了可用率、延遲、新鮮度,可設(shè)置對應(yīng)的SLO如下:

  • 可用率 >= 99.99%
  • 響應(yīng)99分位延遲 <= 1s
  • 數(shù)據(jù)更新延遲 < = 5min

按照應(yīng)用所屬業(yè)務(wù)的等級,給應(yīng)用推薦一個默認(rèn)的SLO,研發(fā)和跟SRE溝通后設(shè)定。注意:

  • 此SLO用于觸發(fā)SLO報警策略
  • 而非凍結(jié)研發(fā)變更

2、業(yè)務(wù)核心功能SLO

業(yè)務(wù)核心功能維度我們度量了可用率、延遲、吞吐,可設(shè)置對應(yīng)的SLO如下:

  • 可用率 >= 99.99%
  • 響應(yīng)99分為延遲 <= 1s
  • 吞吐不用設(shè)置SLO,做儀表盤和報表即可

按照所屬業(yè)務(wù)的等級,給代表業(yè)務(wù)核心功能API同樣推薦一個默認(rèn)的SLO,研發(fā)和跟SRE溝通后設(shè)定。

3、業(yè)務(wù)SLO

業(yè)務(wù)指標(biāo)本質(zhì)上是吞吐指標(biāo),如播放量、在線人數(shù)、評論量等,不需要設(shè)置SLO,只用做吞吐下跌的業(yè)務(wù)報警即可。當(dāng)觸發(fā)業(yè)務(wù)吞吐報警時,一般代表出現(xiàn)了嚴(yán)重事故。

4、SLO報警

雖然我們度量了應(yīng)用、業(yè)務(wù)核心功能、業(yè)務(wù)三個對象的可用率、響應(yīng)延遲、數(shù)據(jù)新鮮度、吞吐指標(biāo),但各個指標(biāo)的報警價值并不一樣。

  • 可用率:用戶功能不可用,價值高。
  • 響應(yīng)延遲:延遲不代表用戶功能一定不可用,價值一般。
  • 數(shù)據(jù)新鮮度:更新延遲代表用戶數(shù)據(jù)延遲,價值高。
  • 吞吐:業(yè)務(wù)側(cè)的吞吐能發(fā)現(xiàn)線上重大事故,價值高。

圖片

監(jiān)控報警一般情況下是按如下分層建設(shè)的:

  • 基礎(chǔ)設(shè)施:機房、網(wǎng)絡(luò)、設(shè)備等。
  • 系統(tǒng):服務(wù)器、存儲、硬盤、網(wǎng)卡、虛擬化等。
  • 中間件:DB、Cache、MQ、LB等。
  • 應(yīng)用:進程內(nèi)資源、系統(tǒng)資源、QPS、錯誤、依賴等。
  • 業(yè)務(wù):業(yè)務(wù)核心指標(biāo),訂單、播放、登錄等。
  • 終端:性能、返回碼、運營商、地區(qū)、APP版本等。

對于研發(fā)、SRE來說,平時接觸最多的應(yīng)用和業(yè)務(wù)了,應(yīng)用和業(yè)務(wù)側(cè)的報警尤其重要。SLO報警一旦觸發(fā)就代表影響了用戶體驗,是準(zhǔn)確率最高的報警,可以作為無效報警治理的切入點。Google SRE在《站點可靠性手冊》中第五章節(jié)也詳細(xì)講解了基于可用率SLO的幾種報警策略

1)目標(biāo)錯誤率≥SLO閾值

選擇一個時間窗口(如10分鐘),該窗口內(nèi)錯誤率超過SLO閾值時發(fā)出報警。例如,如果SLO在30天內(nèi)為99.9%,則在前10分鐘的錯誤率≥0.1%時發(fā)出報警。

優(yōu)點:

  • 檢測時間良好:總停機時間為0.6秒(10m * 0.1%)。此報警會觸發(fā)任何威脅SLO的事件,表現(xiàn)出良好的召回率。

缺點:

  • 精度很低:報警會觸發(fā)許多不會威脅SLO的事件。10分鐘的0.1%錯誤率會發(fā)出報警,而每月錯誤預(yù)算僅消耗0.02%。

  • 極端情況下,每天最多可以收到144個報警,即使不需要對此采取任何措施,此服務(wù)一個月仍然符合99.9%的SLO。

不建議使用此報警策略,精確度太低,每天可能會觸發(fā)很多報警,逐漸成為噪音,導(dǎo)致狼來了的效果。

2)增加報警窗口

可以設(shè)置當(dāng)事件消耗了30天錯誤預(yù)算的5%(30d * 5% = 36h)時才收到報警,以提高精度。

優(yōu)點:

  • 檢測時間仍然很好:完全停機需要2分10秒(30d * 0.1% * 5%)。

  • 比前方案1更精確:錯誤率持續(xù)了更長時間,報警可能對應(yīng)著嚴(yán)重影響錯誤預(yù)算的事件。

缺點:

  • 非常差的恢復(fù)時間:在服務(wù)100%不可用的情況下,報警將在2分鐘后觸發(fā),但在36小時后才恢復(fù)。

  • 0.1%的錯誤下,需要36h時才觸發(fā)報警,此時存在?量數(shù)據(jù)點,計算成本會很高。

不建議使用此報警策略,當(dāng)錯誤率很低時,報警檢測時間太長,接到報警時問題可能已經(jīng)持續(xù)了1天。當(dāng)服務(wù)完全不可用時,2分鐘即可報警出來,但恢復(fù)要等待36小時,恢復(fù)時間太久。

3)增加報警持續(xù)時間

當(dāng)SLO低于閾值持續(xù)一段時間后再觸發(fā)報警,如10分鐘或者1小時。

優(yōu)點:報警精度更高。在觸發(fā)之前需要持續(xù)的低于SLO閾值,意味著報警更可能對應(yīng)于重大事件。

缺點:召回率和檢測時間不佳:由于持續(xù)時間不隨事件嚴(yán)重程度而變化,因此在服務(wù)100%中斷10分鐘或1小時后才會發(fā)出報警,0.2%服務(wù)中斷也會有相同的檢測時間。

不建議使用此報警策略,因為不管錯誤率如何,報警檢測時間都是一樣,報警無基于問題嚴(yán)重程度的分級,對SRE很不友好。

4)消耗率報警

消耗速率是指相對于SLO,服務(wù)消耗錯誤預(yù)算的速度。例如:當(dāng)錯誤率是0.1%時,此時消耗速率是1,當(dāng)錯誤率是10%時,此時消耗速率是100。下表展示消耗掉一個可用率SLO為99.9%的服務(wù)月度錯誤預(yù)算時的時間表。

圖片

可以將報警窗口定為1小時,并設(shè)定當(dāng)消耗掉當(dāng)月5%的錯誤預(yù)算時發(fā)出告警。1小時的窗口消耗掉30天錯誤預(yù)算的5%時,錯誤預(yù)算的消耗率為30d * 24h * 60m * 5% / 60m = 36,報警觸發(fā)所需的時間為:

  • ((1 - SLO)/ 錯誤率)* 報警窗口 * 消耗率:(( 1 - 99.9% )/ 錯誤率)* 1h * 36。

  • 當(dāng)錯誤預(yù)算消耗速率是36時,1小時發(fā)出報警。

  • 當(dāng)服務(wù)完全不可用,錯誤預(yù)算消耗速率是1000,2分10秒發(fā)出報警。

優(yōu)點:

  • 良好的精確度:此策略選擇大部分錯誤預(yù)算消耗時發(fā)出報警。更短的時間窗口,計算起來代價較小,檢測時間好。

缺點:

  • 低召回率:消耗速率低于36時永遠(yuǎn)不會發(fā)出報警,假如錯誤預(yù)算消耗率為35,在20.5小時(30d / 35 * 24h)后會消耗掉30天的全部錯誤預(yù)算。

  • 服務(wù)完全不可用時觸發(fā)報警需要2分10秒,報警重置時間:58分鐘仍然太長。

不建議使用此報警策略,因為當(dāng)錯誤率 < 3.6%時,永遠(yuǎn)不會發(fā)出報警。

5)多次消耗率報警

可以使用多個消耗速率和時間窗口來解決上述的問題,來確保當(dāng)錯誤率較低時可以發(fā)出報警。

Google建議設(shè)置如下三個報警條件:

  • 1小時內(nèi)消耗月度2%的預(yù)算消耗,發(fā)出緊急報警。

  • 6小時內(nèi)消耗月度5%的錯誤預(yù)算,發(fā)出緊急報警。

  • 3天內(nèi)消耗月度10%的預(yù)算,發(fā)出故障工單。

下表顯示了消耗的SLO預(yù)算百分比、相應(yīng)消耗效率和時間窗口:

圖片

優(yōu)點:

  • 能夠根據(jù)關(guān)鍵值調(diào)整監(jiān)控配置以適應(yīng)多種情況:錯誤率高時快速報警;如果錯誤率很低但持續(xù)發(fā)生,最終會發(fā)出報警。

  • 多個消耗速率和時間窗口,報警具有良好的精確度。

  • 因為有3天10%錯誤預(yù)算的報警策略,所以有很好的召回率。

  • 能夠根據(jù)錯誤率的嚴(yán)重程度來選擇適合的報警類型。

缺點:

  • 更多數(shù)據(jù)、窗口大小和閾值需要管理。

  • 由于有3天消耗10%錯誤預(yù)算的報警,當(dāng)服務(wù)完全不可用時,4.3分鐘就會觸發(fā)報警,但需要3天后才恢復(fù)。

  • 如果所有條件都滿足,則會觸發(fā)多個報警,需要做報警屏蔽。當(dāng)服務(wù)完全不可用時,4.3分鐘內(nèi)10%的預(yù)算消耗報警也會觸發(fā)6小時5%的預(yù)算消耗報警、1小時內(nèi)2%的預(yù)算消耗報警。

這種報警策略已經(jīng)具備了很好的精確度和召回率,可以在報警系統(tǒng)里嘗試使用這種報警策略。

6)多窗口,多消耗率報警

可以加一個較短時間窗口,用于在報警和恢復(fù)時檢查是否仍然達到錯誤預(yù)算消耗速率,從而減少誤報。Google建議將短窗口設(shè)為長窗口持續(xù)時間的1/12。

圖片

如何理解短窗口的作用呢?以1小時消耗月度2%的錯誤預(yù)算為例:

  • 假如服務(wù)錯誤率為10%,則錯誤預(yù)算消耗率是100,超過14.4的消耗速率,在43秒(14.4 * 5 / 100 * 60s = 43s)時已經(jīng)觸發(fā)了短窗口的條件:5分鐘錯誤預(yù)算消耗速率平均值大于14.4。
  • 服務(wù)故障持續(xù)8.6分鐘(30d * 24h * 60m * 2% / 100 = 8.64m)時,會消耗掉月度2%的錯誤預(yù)算,觸發(fā)長窗口的報警閾值:1小時內(nèi)消耗掉2%的錯誤預(yù)算,此時發(fā)出報警。
  • 服務(wù)故障停止5分鐘后,短窗口錯誤預(yù)算消耗速率平均值低于14.4,不會再觸發(fā),報警恢復(fù)。
  • 服務(wù)故障停止51.4分鐘后,長窗口錯誤預(yù)算消耗平均值速率低于14.4,不會再觸發(fā)。

你可以在前一小時和前五分鐘超過14.4倍錯誤預(yù)算消耗速率時發(fā)送工單,只有在消耗了2%的錯誤預(yù)算后,才發(fā)送報警。5分鐘后短窗口不再觸發(fā),此時報警恢復(fù)時間最佳。

優(yōu)點:

  • 靈活的報警框架,允許你根據(jù)事件的嚴(yán)重性和組織的要求控制報警類型。
  • 良好的精度,與所有固定預(yù)算的部分報警方法一樣。不錯的召回率,因為有三天的窗口。

缺點:要指定的參數(shù)很多,這可能使報警規(guī)則難以管理。

這種報警策略大大降低了報警恢復(fù)時間,是最合理的報警方式,但增加了報警復(fù)雜度,理解起來也有一定的成本。其實方案5也是一種不錯的選擇,這兩種方案都可以實施,具體選哪種報警策略視自己公司的監(jiān)控系統(tǒng)和報警能力而定。

B站目前的SLO報警是基于策略5做了一定調(diào)整,不同的服務(wù)等級設(shè)定了不同的報警窗戶和消耗率,大致如下:

圖片

目前我的SLO報警策略也不夠精確,缺少低錯誤預(yù)算消耗速率的報警和長時間窗口報警,會漏掉哪些在偷偷消耗錯誤預(yù)算的事件。我們的SLO報警會先向方案5靠齊,再朝著方案6優(yōu)化。

最后總結(jié)一下我們開啟SLO報警的指標(biāo)如下:

圖片

十、質(zhì)量運營

有了各個維度的SLI指標(biāo)和SLO報警后,我們可以很靈活的構(gòu)建質(zhì)量運營大盤,如:

  • 基于業(yè)務(wù)SLI構(gòu)建業(yè)務(wù)指標(biāo)大盤。

  • 基于業(yè)務(wù)核心功能SLI構(gòu)建業(yè)務(wù)健康度大盤。

  • 基于業(yè)務(wù)和應(yīng)用的關(guān)聯(lián)關(guān)系構(gòu)建業(yè)務(wù)應(yīng)用健康度大盤。

  • 業(yè)務(wù)可用率排名、應(yīng)用可用率排名。

  • 業(yè)務(wù)大盤到業(yè)務(wù)核心功能到應(yīng)用指標(biāo)的場景監(jiān)控大盤。

總結(jié)

沒有SLO就沒有SRE?想必到這里大家對SLO的方法論和實踐已經(jīng)有了深刻的理解。僅度量SLI做可用性報表來給業(yè)務(wù)帶上枷鎖是沒意義的,SLO的核心價值是定義服務(wù)能力,設(shè)置SLO報警,及時發(fā)現(xiàn)線上問題,優(yōu)化報警和推動穩(wěn)定性治理,主動幫業(yè)務(wù)團隊去提升業(yè)務(wù)質(zhì)量,合作共贏。?

責(zé)任編輯:張燕妮 來源: 嗶哩嗶哩技術(shù)
相關(guān)推薦

2020-12-17 06:44:00

防腐層驅(qū)動

2021-07-27 11:05:52

云計算

2020-03-27 13:00:14

運維架構(gòu)技術(shù)

2021-11-07 14:34:26

跨域網(wǎng)絡(luò)后端

2022-01-20 16:28:00

數(shù)字化轉(zhuǎn)型衡量指標(biāo)

2016-03-29 10:29:38

數(shù)據(jù)產(chǎn)品數(shù)據(jù)科學(xué)創(chuàng)業(yè)

2023-05-23 08:54:43

SRESLO運營

2023-06-21 00:12:14

物聯(lián)網(wǎng)成本

2023-02-07 17:23:54

物聯(lián)網(wǎng)IOT

2024-05-09 09:09:19

組合模式對象

2024-05-10 08:43:04

外觀模式接口系統(tǒng)

2024-05-13 10:45:25

中介模式面向?qū)ο?/a>數(shù)量

2019-08-27 14:46:59

ElasticSearES數(shù)據(jù)庫

2020-07-10 08:03:35

DNS網(wǎng)絡(luò)ARPAne

2022-05-10 08:57:56

死鎖程序線程

2021-12-28 21:52:14

訂單

2022-09-07 08:41:57

SpringIstio分布式

2023-07-27 08:26:36

零拷貝I/O操作

2021-10-11 10:41:14

TCP傳輸層協(xié)議網(wǎng)絡(luò)

2020-09-23 16:56:51

Python語言技術(shù)
點贊
收藏

51CTO技術(shù)棧公眾號