Skip to content

monitoring

SRE: How Google Runs Production Systems 讀書筆記(三)

  • Ops

發行工程(release engineering)

這章開頭介紹了有關「發行」這個新的學科,在 Google 雖由 SRE 以外的特定角色負責,但 SRE 一樣須要與之密切合作與關注;後半部份介紹發行流程、以及 Google 使用的發行系統 Rapid 與建構工具 Blaze (開源版本為 Bazel)

發行工程師在幹麻?

發行工程是一項獨立出來的工作,核心是 build 跟 deliver,由發行工程師負責

發行工程師的工作不是「負責發行」,而是開發工具、制定 best practice,好讓產品研發團隊能自主發行,也就是 self-serving

發行模式有哪些?

發行的步驟由發行工程師、SWE、SRE 三者一起定義,舉幾個例子:

  • 每小時建構一次,再根據變更項目和測試結果挑出要發行的版本
  • Push On Green,測試通過就發行

因規模和軟體性質而異,有的發行時間會需要延長到好幾天(如基礎設施)

怎麼建構?

無論使用什麼建構工具(Google 用 Blaze),建構應該要是一致且可重複的,也就是在兩台不同機器上建構同一個版本,應該得到相同結果

建構過程應是密閉的 (hermetic),不應受機器上安裝的其他函式庫或軟體影響

正式站有 bug 怎麼辦?

Google 通常不在 master 分支直接發行,而是從 master 切新的分支用來發行(避免建構後無關的變更影響到 master)

針對 bug 的修復會先上到 master,在發行分支再把該變更 cherry pick 過來,即可重新建構跟發行

怎麼持續建構/部署?

因為這章提到的工具跟元件比較多,從 Florian Rathgeber 的簡報上找到的一張關聯圖來看可能會比較好理解

image

  • Midas Package Manager(MPM):是 Google 使用的套件管理系統,資料元存在 BigTable 上。我粗淺的理解方式是把它「對應」到容器的映像檔,它們都是利用「名稱 + 標籤」作為唯一識別,但比起容器映像檔,MPM 有更進階的功能,例如 ACL 跟簽章;另外一個從根本上不同的是映像檔是有序的 layers,而 MPM 則是無序的 filegroups
  • Blaze:建構工具,用來建構 MPM、二進制檔案、對應的測試
  • Rapid:分散式發行系統,可執行由建構藍圖 (blueprint) 定義的工作流、利用 Blaze 來跑建構及測試;Worker 是跑在 Borg 上,可以並行處理發行工作
  • Sisphus(希臘神話的薛西佛斯):自動化部署的框架,提供更彈性的部署功能、流程儀表板

一句話概括基本流程:Rapid 負責跑測試、建構 MPM(打上特定標籤),Sisphus 負責部署此 MPM 版本

Read More »SRE: How Google Runs Production Systems 讀書筆記(三)

SRE: How Google Runs Production Systems 讀書筆記(二)

  • Ops

第三章在講風險,開頭再度強調了「不該追求極端的可靠性」,我們必須考慮機會成本——可靠性的成本並非線性成長,多追求一個級別的提昇(例如 99% 提昇至 99.9%)說不定成本要提高百倍才做得到,甚至,好不容易達成後對使用者來說根本沒差

怎麼看風險?

可靠性(或者說對故障的容忍程度)是靠風險管理得出的結果。風險是一個非線性的連續體(continuum)的概念,我們要問的問題是:服務合理的風險是多少?

合理的風險更像是一個可選的區間,透過衡量「成本」、「業務風險」與「維運風險」對應後我們可以再選出一個目標值

怎麼量化風險?

故障導致的業務風險很難量化(例如媒體大肆報導導致退訂),最直接的作法是參考指標(延遲、停機時間、請求成功率等)

拿停機時間來看——可用性水準訂為 99.99%,一年當中可以接受的停機時間就是 52.56 分鐘

但對分散式服務來說,停機可能是很久才會發生一次的(較難追蹤校正),可以改用請求成功率——可用性水準訂為 99.99%,如果一天要接受 2.5 M 個請求,錯誤數量少於 250 個即可(要注意不同請求的重要性不同,直接面向使用者的請求會更重要)

可用性目標應該多久更新一次?訂定的依據是什麼?

通常以一季為單位來訂,每週或每天追蹤其變化

成本考量很重要,舉了一個很好的比較:Gmail 跟 Youtube——Gmail 定的可用性目標很高,因為如果服務中斷,會導致大量成本及嚴重後果(例如包含許多企業在內的使用者流失);反之,為 Youtube 設定的可用性目標較低,因為快速發展更重要

可以思考下列這些問題:

  • 使用者是誰?他們期望怎樣的服務水準?
  • 服務是否直接關係到收入?(公司的收入或客戶的收入都算)/ 是付費還是免費?
  • 競爭對手的服務水準如何?
  • 多一個「9」,收益增加多少,成本增加多少?
  • 服務是否為基礎設施?服務水準是否可以適用各個業務端?

如果難以訂定,可以參考「ISP 的服務錯誤率」(大約 0.01%-1%),只要可用性優於此基礎,故障就會被網際網路的噪音(noise)掩蓋掉

持續發生的零星故障 / 全網中斷哪個更糟糕?

看情況。不同故障類型不能以同樣方式來量化,要考慮不同故障會對業務端造成多大影響

同一個服務怎麼滿足不同類型的使用者?

有時服務的特性是雙面刃,書上舉了 BigTable 為例:要低延遲,利用率愈低愈好(可以更快處理),但要低成本,利用率愈高愈好(避免閒置)

我自己在使用 BigTable 也遇過這種競爭約束(competing constraints)的情況:同一個應用要服務 streaming 跟 batch 這兩種不同場景

書上提供一個解決方式:用戶隔離——低延遲使用者跟離線分析使用者分別使用不同叢集

Read More »SRE: How Google Runs Production Systems 讀書筆記(二)