原文:

前言

SLO和SLA是大家常見(jiàn)的兩個(gè)名詞:服務(wù)等級(jí)目標(biāo)和服務(wù)等級(jí)協(xié)議。

云計(jì)算時(shí)代,各大云服務(wù)提供商都發(fā)布有自己服務(wù)的SLA條款,比如Amazon的EC2和S3服務(wù)都有相應(yīng)的SLA條款。這些大公司的SLA看上去如此的高達(dá)上,一般是怎么定義出來(lái)的呢?

說(shuō)SLA不能不提SLO,這個(gè)是眾所周知的,但是還有一個(gè)概念知道的人就不多了,那就是SLI(Service Level Indicator),定義一個(gè)可執(zhí)行的SLA,好的SLO和SLI是必不可少的。

再有就是SLI/SLO/SLA都是和服務(wù)聯(lián)系在一起的,脫離了服務(wù)這三個(gè)概念就沒(méi)有什么意義了。

Service

什么是服務(wù)?

簡(jiǎn)單說(shuō)就是一切提供給客戶的有用功能都可以稱為服務(wù)。

服務(wù)一般會(huì)由服務(wù)提供者提供,提供這個(gè)有用功能的組織被稱為服務(wù)提供者,通常是人加上軟件,軟件的運(yùn)行需要計(jì)算資源,為了能對(duì)外提供有用的功能軟件可能會(huì)有對(duì)其他軟件系統(tǒng)的依賴。

客戶是使用服務(wù)提供者提供的服務(wù)的人或公司。

SLI

SLI是經(jīng)過(guò)仔細(xì)定義的測(cè)量指標(biāo),它根據(jù)不同系統(tǒng)特點(diǎn)確定要測(cè)量什么,SLI的確定是一個(gè)非常復(fù)雜的過(guò)程。

SLI的確定需要回答以下幾個(gè)問(wèn)題:

  1. 要測(cè)量的指標(biāo)是什么?
  2. 測(cè)量時(shí)的系統(tǒng)狀態(tài)?
  3. 如何匯總處理測(cè)量的指標(biāo)?
  4. 測(cè)量指標(biāo)能否準(zhǔn)確描述服務(wù)質(zhì)量?
  5. 測(cè)量指標(biāo)的可靠度(trustworthy)?

1. 常見(jiàn)的測(cè)量指標(biāo)有以下幾個(gè)方面:

  • 性能
    • 響應(yīng)時(shí)間(latency)
    • 吞吐量(throughput)
    • 請(qǐng)求量(qps)
    • 實(shí)效性(freshness)
  • 可用性
    • 運(yùn)行時(shí)間(uptime)
    • 故障時(shí)間/頻率
    • 可靠性
  • 質(zhì)量
    • 準(zhǔn)確性(accuracy)
    • 正確性(correctness)
    • 完整性(completeness)
    • 覆蓋率(coverage)
    • 相關(guān)性(relevance)
  • 內(nèi)部指標(biāo)
    • 隊(duì)列長(zhǎng)度(queue length)
    • 內(nèi)存占用(RAM usage)
  • 因素人
    • 響應(yīng)時(shí)間(time to response)
    • 修復(fù)時(shí)間(time to fix)
    • 修復(fù)率(fraction fixed)

下面通過(guò)一個(gè)例子來(lái)說(shuō)明一下:hotmail的downtime SLI

  • 錯(cuò)誤率(error rate)計(jì)算的是服務(wù)返回給用戶的error總數(shù)
  • 如果錯(cuò)誤率大于X%,就算是服務(wù)down了,開(kāi)始計(jì)算downtime
  • 如果錯(cuò)誤率持續(xù)超過(guò)Y分鐘,這個(gè)downtime就會(huì)被計(jì)算在內(nèi)
  • 間斷性的小于Y分鐘的downtime是不被計(jì)算在內(nèi)的。

2. 測(cè)量時(shí)的系統(tǒng)狀態(tài),在什么情況下測(cè)量會(huì)嚴(yán)重影響測(cè)量的結(jié)果

  • 測(cè)量異常(badly-formed)請(qǐng)求,還是失敗(fail)請(qǐng)求還是超時(shí)請(qǐng)求(timeout)
  • 測(cè)量時(shí)的系統(tǒng)負(fù)載(是否最大負(fù)載)
  • 測(cè)量的發(fā)起位置,服務(wù)器端還是客戶端
  • 測(cè)量的時(shí)間窗口(僅工作日、還是一周7天、是否包括計(jì)劃內(nèi)的維護(hù)時(shí)間段)

3. 如何匯總處理測(cè)量的指標(biāo)?

  • 計(jì)算的時(shí)間區(qū)間是什么:是一個(gè)滾動(dòng)時(shí)間窗口,還是簡(jiǎn)單的按照月份計(jì)算
  • 使用平均值還是百分位值,比如:某服務(wù)X的ticket處理響應(yīng)時(shí)間SLI的
  • 測(cè)量指標(biāo):統(tǒng)計(jì)所有成功解決請(qǐng)求,從用戶創(chuàng)建ticket到問(wèn)題被解決的時(shí)間
  • 怎么測(cè)量:用ticket自帶的時(shí)間戳,統(tǒng)計(jì)所有用戶創(chuàng)建的ticket
  • 什么情況下的測(cè)量:只包括工作時(shí)間,不包含法定假日
  • 用于SLI的數(shù)據(jù)指標(biāo):以一周為滑動(dòng)窗口,95%分位的解決時(shí)間

4. 測(cè)量指標(biāo)能否準(zhǔn)確描述服務(wù)質(zhì)量?

  • 性能:時(shí)效性、是否有偏差
  • 準(zhǔn)確性:精度、覆蓋率、數(shù)據(jù)穩(wěn)定性
  • 完整性:數(shù)據(jù)丟失、無(wú)效數(shù)據(jù)、異常(outlier)數(shù)據(jù)

5. 測(cè)量指標(biāo)的可靠度

  • 是否服務(wù)提供者和客戶都認(rèn)可
  • 是否可被獨(dú)立驗(yàn)證,比如三方機(jī)構(gòu)
  • 客戶端還是服務(wù)器端測(cè)量,取樣間隔
  • 錯(cuò)誤請(qǐng)求是如何計(jì)算的

SLO

SLO(服務(wù)等級(jí)目標(biāo))指定了服務(wù)所提供功能的一種期望狀態(tài)。SLO里面應(yīng)該包含什么呢?所有能夠描述服務(wù)應(yīng)該提供什么樣功能的信息。

服務(wù)提供者用它來(lái)指定系統(tǒng)的預(yù)期狀態(tài);開(kāi)發(fā)人員編寫(xiě)代碼來(lái)實(shí)現(xiàn);客戶依賴于SLO進(jìn)行商業(yè)判斷。SLO里沒(méi)有提到,如果目標(biāo)達(dá)不到會(huì)怎么樣。

SLO是用SLI來(lái)描述的,一般描述為:
比如以下SLO:

  • 每分鐘平均qps > 100k/s
  • 99% 訪問(wèn)延遲 < 500ms
  • 99% 每分鐘帶寬 > 200MB/s

設(shè)置SLO時(shí)的幾個(gè)最佳實(shí)踐:

  • 指定計(jì)算的時(shí)間窗口
  • 使用一致的時(shí)間窗口(XX小時(shí)滾動(dòng)窗口、季度滾動(dòng)窗口)
  • 要有一個(gè)免責(zé)條款,比如:95%的時(shí)間要能夠達(dá)到SLO

如果Service是第一次設(shè)置SLO,可以遵循以下原則

  • 測(cè)量系統(tǒng)當(dāng)前狀態(tài)
    • 設(shè)置預(yù)期(expectations),而不是保證(guarantees)
    • 初期的SLO不適合作為服務(wù)質(zhì)量的強(qiáng)化工具
  • 改進(jìn)SLO
    • 設(shè)置更低的響應(yīng)時(shí)間、更改的吞吐量等
  • 保持一定的安全緩沖
    • 內(nèi)部用的SLO要高于對(duì)外宣稱的SLO
  • 不要超額完成
    • 定期的downtime來(lái)使SLO不超額完成

設(shè)置SLO時(shí)的目標(biāo)依賴于系統(tǒng)的不同狀態(tài)(conditions),根據(jù)不同狀態(tài)設(shè)置不同的SLO:總SLO = service1.SLO1 weight1 + service2.SLO2 weight2 + …

為什么要有SLO,設(shè)置SLO的好處是什么呢?

  • 對(duì)于客戶而言,是可預(yù)期的服務(wù)質(zhì)量,可以簡(jiǎn)化客戶端的系統(tǒng)設(shè)計(jì)
  • 對(duì)于服務(wù)提供者而言
    • 可預(yù)期的服務(wù)質(zhì)量
    • 更好的取舍成本/收益
    • 更好的風(fēng)險(xiǎn)控制(當(dāng)資源受限的時(shí)候)
    • 故障時(shí)更快的反應(yīng),采取正確措施

SLO設(shè)好了,怎么保證能夠達(dá)到目標(biāo)呢?
需要一個(gè)控制系統(tǒng)來(lái):

  • 監(jiān)控/測(cè)量SLIs
  • 對(duì)比檢測(cè)到的SLIs值是否達(dá)到目標(biāo)
  • 如果需要,修證目標(biāo)或者修正系統(tǒng)以滿足目標(biāo)需要
  • 實(shí)施目標(biāo)的修改或者系統(tǒng)的修改

該控制系統(tǒng)需要重復(fù)的執(zhí)行以上動(dòng)作,以形成一個(gè)標(biāo)準(zhǔn)的反饋環(huán)路,不斷的衡量和改進(jìn)SLO/服務(wù)本身。

我們討論了目標(biāo)以及目標(biāo)是怎么測(cè)量的,還討論了控制機(jī)制來(lái)達(dá)到設(shè)置的目標(biāo),但是如果因?yàn)槟承┰?,設(shè)置的目標(biāo)達(dá)不到該怎么辦呢?

也許是因?yàn)榇罅康男略鲐?fù)載;也許是因?yàn)榈讓右蕾嚥荒苓_(dá)到標(biāo)稱的SLO而影響上次服務(wù)的SLO。這就需要SLA出場(chǎng)了。

SLA

SLA是一個(gè)涉及2方的合約,雙方必須都要同意并遵守這個(gè)合約。當(dāng)需要對(duì)外提供服務(wù)時(shí),SLA是非常重要的一個(gè)服務(wù)質(zhì)量信號(hào),需要產(chǎn)品和法務(wù)部門(mén)的同時(shí)介入。

SLA用一個(gè)簡(jiǎn)單的公式來(lái)描述就是: SLA = SLO + 后果

  • SLO不能滿足的一系列動(dòng)作,可以是部分不能達(dá)到
    • 比如:達(dá)到響應(yīng)時(shí)間SLO+未達(dá)到可用性SLO
  • 對(duì)動(dòng)作的具體實(shí)施
    • 需要一個(gè)通用的貨幣來(lái)獎(jiǎng)勵(lì)/懲罰,比如:錢

SLA是一個(gè)很好的工具,可以用來(lái)幫助合理配置資源。一個(gè)有明確SLA的服務(wù)最理想的運(yùn)行狀態(tài)是:增加額外資源來(lái)改進(jìn)系統(tǒng)所帶來(lái)的收益小于把該資源投給其他服務(wù)所帶來(lái)的收益。

一個(gè)簡(jiǎn)單的例子就是某服務(wù)可用性從99.9%提高到99.99%所需要的資源和帶來(lái)的收益之比,是決定該服務(wù)是否應(yīng)該提供4個(gè)9的重要依據(jù)。