第一章 SRE与DevOps之间的联系
作者:By Niall Richard Murphy,Liz Fong-Jones, and Betsy Beyer,with Todd Underwood, Laura Nolan,and Dave Rensin
運維是一門很難的學科。 不但沒有解決如何很好地運行系統,即便那些已經在使用的最佳實踐也是高度依賴環境且未被廣泛采納的。 并且最重要的,沒有解決如何良好地管理運維團隊這一問題。人們普遍認為,對這些問題的詳細分析源于二戰期間致力于改善盟軍軍事進程和產出的作戰研究,但事實上,長期以來我們一直都在思考如何更好地實踐。
盡管有這么多的努力和想法,可靠的生產運維仍然是難以保障的,特別是在信息技術和軟件可操作性領域, 例如: 企業通常將運維視為成本中心, 這使得對結果進行有意義的改進變得困難甚至不可能。 這種短視的方法還沒有被廣泛理解, 但對它的不滿卻已經引發了IT領域對如何組織工作方面的一場革命。
這場革命源于試圖解決一系列普遍問題, 并誕生了兩個不同的解決方案: DevOps 和 SRE(Site Reli‐ability Engineering)。 盡管單從描述上看,他們是企業完全不同的兩個方面,需要單獨討論,但事實上,它們的相似之處,要遠比我們想象的多。
但首先,我們需要來了解一下每種原則的背景。
?
?
DevOps產生的背景
DevOps是一套松散的實踐,指南和文化,旨在打破IT開發,運維,網絡和安全方面的孤立。 是由John Willis,Damon Edwards和Jez Humble提出,使用CA(L)MS表示:文化(Culture),自動化(Automation),精益(Lean, 如精益管理;也包含持續交付),測量(Measurement,)和分享(Sharing) -- 這是一個記住DevOps哲學要點很有用的縮寫。 而分享和合作是這一運動的重中之重。 在DevOps方法中,您可以改進某些內容(通常通過自動化實現)、測量結果,并與同事分享這些結果,以便整個組織得到改進。 所有CALMS原則都是由支持文化促進的。
DevOps,Agile以及各種其他業務和軟件工程技術,都是關于如何在現代世界中進行最佳實踐的示例。DevOps哲學中的任何元素彼此都不能輕易分離,這是由基本設計來決定的。 但是,有一些關鍵的想法可以相對分開地討論。
?
不再孤立
第一個關鍵點是:不再孤立。 有兩種觀點能夠體現:
-
曾經流行將運維和開發團隊分別獨立,但現在卻越來越過時。
-
在許多情況下,極端的知識孤立化、純粹的對內部優化的激勵以及缺乏協作對商業是十分不利的。
?
事故是正常的
第二個關鍵點是:事故不僅僅是由個人的孤立行動造成的,更是當問題不可避免地發生時,缺乏防范措施的結果。例如,一個糟糕的接口在不經意間助長了壓力下的錯誤行為;如果出現(未知的)錯誤,系統缺陷將不可避免地導致失敗;監控失效使得人們不可能知道是否出了問題,更不用說出了什么問題。一些傳統觀念更強的企業,擁有開除犯錯者并懲罰他們的文化。但這樣做有其自身的惡果: 他會誘使人們混淆問題、掩蓋真相和指責他人, 而所有這些最終沒有任何價值,專注于恢復服務比阻止事故發生要更有價值。
?
變更應該是循序漸進的
第三個關鍵點是, 小而頻繁的變更是最佳的。 一個比較激進的示例,是變更委員會每月開會討論徹底修改大型機配置的計劃,然而這種做法并不鮮見,所有變更必須由經驗豐富的人員進行有效的規劃,結果或多或少與最佳實踐相悖。變更是有風險的,沒錯,但是正確的做法是將變更盡可能拆分成更小的組件或單元。然后,根據產品、設計和基礎架構的變更,構建穩定的低風險變更管道。(Then you build a steady pipeline of low-risk change out of regular output from product, design, and infrastructure changes)這種策略,增加對小變更的自動化測試和異常變更的可靠回滾,就形成了管理變更的方法:持續集成(CI)和持續交付或部署(CD)。
?
工具和文化是相互關聯的
工具是DevOps的一個重要組成部分,特別是強調正確管理變更的今天,變更管理依賴于高度定制化的工具。 但總的來說,DevOps的支持者十分強調組織文化 - 而不是工具 - 這是成功采用新工作方式的關鍵。 一個好的文化可以解決破碎的工具,但相反的情況很少適用。 俗話說, 文化能把戰略當早餐吃(意味著文化的影響力遠勝過策略)。 與運維一樣,變更本身也很難。
?
度量是至關重要的
最后,度量在整個業務環境中尤為重要,例如,打破孤立和故障處理。 在上述的每種場景中,你可以通過客觀的度量來確定正在發生事情的真實性,驗證改變是否符合預期,并為不同職能部門達成一致的對話創建客觀基礎。 (這適用于商業和其他環境,例如On-call。)
?
SRE產生的背景
SRE是由Google的工程副總裁Ben Treynor Sloss提出的術語(和相關的工作角色)。正如我們在上一節中所看到的,DevOps是運維和產品開發之間在整個生命周期互相協作的一系列廣泛原則。SRE是一個工作角色,也是我們發現的一組實踐(稍后介紹),以及一些激勵這些實踐的信念。如果您將DevOps看作一種哲學和工作方法,則可以認為SRE實現了DevOps描述的一些哲學,并且比“DevOps工程師”更接近于這個工作或角色的具體定義。因此,在某種程度上,SRE類實現了DevOps接口。
與DevOps運動不同,DevOps運動起源于多家公司的領導者和從業者之間的合作,而SRE在整個行業廣泛普及之前,則是由Google的SRE繼承周圍公司的大部分文化。 考慮到這一軌跡,整個SRE學科目前并沒有像DevOps那樣在文化上突然增長。 (當然,這并不能說明文化變革對在任意組織中進行SRE是否是必要的)
SRE由以下具體原則定義。
?
運維是一個軟件問題
SRE的基本原則是:做好運維是一個軟件問題。 因此,SRE應使用軟件工程來解決這一問題。 這涉及廣泛的領域,涵蓋了從流程和業務變更到同樣復雜但更傳統的軟件問題的所有內容,例如重寫堆棧以消除業務邏輯中的單點故障。
?
通過SLOs進行管理
SRE不會嘗試提供100%的可用性。 正如我們的第一本書 《Site Reliability Engineering》中所討論的,這是錯誤的目標, 原因有很多。 相反,產品團隊和SRE團隊為服務及其用戶群選擇適當的可用性目標,并管理服務達到該目標,選定這樣的目標需要業務部門的強大協作。 SLOs也具有文化內涵:作為利益相關者之間的協作決策,SLO違規行為將團隊無可厚非地帶回到原點。
?
減少瑣事
對于SRE來說,任何手動的, 重復性的的運維任務都是令人憎惡的。 (這并不意味著我們沒有任何此類任務:我們有很多這樣的操作。我們只是不喜歡它們。)我們相信,如果機器可以執行所需的操作,那么通常應該讓機器來執行。 這是一種區別(也是一種價值),在其他組織中并不常見。在那里,瑣事就是工作,而這就是你付錢讓一個人去做的事情。而對于在谷歌環境下的SRE來說,瑣事不是工作——它不可能是。任何在操作任務上花費的時間都意味著無法再投入到項目工作上——項目工作才能使我們的服務可靠和可擴展。
然而,通過“the wisdom of production”,執行運維任務確實為決策提供了重要的參考。這項工作通過提供來自給定系統的實時反饋信息來保持穩定。(This work keeps us grounded by providing real-time feedback from a given system.)瑣事的來源需要明確,這樣可以最小化或消除它們。然而,如果你發現自己處于操作不足的狀態,那么你可能需要更頻繁地推動新特性和更改,以便工程師依舊熟悉你所支持的服務的工作方式。
The Wisdom of Production
A note on “the wisdom of production”: by this phrase, we mean the wisdom you get from something running in production—the messy details of how it actually behaves, and how software should actually be designed, rather than a whiteboarded view of a service isolated from the facts on the ground. All of the pages you get, the tickets the team gets, and so on, are a direct connection with reality that should inform better system design and behavior.
?
把今年的工作自動化
在這個領域真正要做是,確定哪些工作基于什么樣的條件,以什么樣的方式要完成自動化。(The real work in this area is determining what to automate, under what conditions, and how to automate it.)
在Google,經驗豐富的SRE嚴格限制團隊成員花費在瑣事上的時間,與之相反的是他們會在產生持續價值的工程類工作中花費50%的時間。許多人認為這個限制是一個上限。 事實上,將它視為一種保證更為有用,一種明確的聲明和啟用機制,采用基于工程的方法來解決問題,而不是一遍又一遍地辛勞的解決問題。
當我們考慮自動化和瑣事時,基線和其如何發揮作用并不直觀。(There is an unintuitive and interesting interaction between this benchmark and how it plays out when we think about automation and toil.) 隨著時間的推移,一個SRE團隊最終會將服務的大部分操作自動化,只留下無法自動化的(Murphy-Beyer效應)。 在其他條件相同的情況下,除非采取其他行動,否則SRE團隊所做的事情就會受到影響。 在google你更傾向于通過不斷新增服務來達到填滿50%的工程設計時間的限制,或者你在自動化方向做的非常成功,以至于你可以去做一些完全不同的事情。
?
通過降低故障成本來快速行動
日益提高的可靠性只是SRE帶來的眾多收益中的一種,事實的確如此,它實際上提高了開發的產出。為什么呢?對于常見故障,減少故障平均修復時間( Mean Time To Repair)會提高產品開發人員的速度,因為工程師不必在這些故障問題之后耗費時間和精力進行處理。這源于一個眾所周知的事實,在一個產品的生命周期里,問題發現的越晚,修復它所付出的代價越高。SREs專門負責改善異常問題的過晚發現,為公司整體帶來收益。
?
與開發分享權限
“應用程序開發”和“生產”(有時被稱為Dev和Ops)之間的嚴格界限會適得其反。 如果項目事務處的職責劃分和作為成本中心的分類,導致權力不平衡、尊重或薪酬方面的差異,則尤其如此。
SREs往往傾向于關注生產而不是業務邏輯問題,但隨著問題被他們用軟件工程工具所解決,他們與產品開發團隊分享技術棧。 通常,SREs在他們正在關注的服務的可用性,延遲,性能,效率,變更管理,監控,應急響應和容量規劃方面具有特殊的專業知識。 那些特定的(通常定義明確的)能力是SRE對產品和產品的開發團隊所做的貢獻。理想情況下,產品開發和SRE團隊應該對技術棧有一個整體的看法 - 前端,后端,庫,存儲,內核和物理機器 - 沒有團隊應該令人嫉妒的擁有著單個組件。事實證明,如果你“模糊線條”并使用SREs共苦JavaScript,或者產品開發人員對內核進行限定,你可以做得更多:知識如何進行更改,權限更加廣泛,而激勵小心翼翼地保護任何特定的功能這一想法都應摒棄。
在《Site Reliability Engineering》這本書里,,我們沒有明確表明Google中的產品開發團隊默認擁有自己的服務。 SRE既不可用也不保證大部分服務,盡管如此,SRE原則仍然可以告知整個Google如何管理服務。 SRE團隊與產品開發團隊合作時的所有權模式最終也是一個共享模型。
?
使用相同的工具,無論功能或職位
工具是一個非常重要的行為決定因素, 在Google的環境中,SRE如果沒有統一的代碼庫、軟件和系統的各種工具、高度優化和專有的生產堆棧等是非常天真的。我們與DevOps分享這個絕對的假設:團隊服務應該使用相同的工具,無論他們在組織中的角色如何。 沒有好的方法來管理一個服務,當該服務具有一個用于SRE的工具,一個用于產品開發人員的工具,在不同情況下表現不同(并且可能具有災難性)。 當擁有的分歧越多,公司從改進每個工具努力中的獲益就越少。
?
比較和對比
從上面聊到的原則中,我們可以立即看到他們之間有很多共性:
-
DevOps和SRE都接受一種理念,即為了改進,變更是必要的(都接受對于提高而言,變更是必要的)。否則,就沒有多少可操作的空間。
-
協作是DevOps工作的前沿和中心。 有效的分享所有權模式和合作伙伴關系是SRE發揮作用所必需的。 與DevOps一樣, SRE也具有跨組織分享的強大價值,這樣更容易打破團隊之間的孤立。
-
變更的最佳實踐是: 持續小而頻繁的變更,大多數操作理想情況下應該是:自動化測試和部署。變更和可靠性之間的關鍵交互使得這對于SRE尤為重要。
-
正確的工具至關重要,工具在一定程度上決定了你的行為范圍。然而,我們決不能過于關注是否使用某些特定工具實現某種操作;歸根結底,面向系統管理的API是更為重要的哲學,它將比任何特定的實現都持久。
-
度量絕對是DevOps和SRE如何工作的關鍵。對于SRE, SLOs (服務質量目標) 決定著是否改善和優化服務。當然,如果沒有度量( 以及在產品、基礎設施/SRE和業務之間的跨團隊合作),就不可能有SLOs。對于DevOps,度量行為通常用于理解流程的輸出是什么,反饋周期的持續時間是什么,等等。DevOps和SRE都是面向數據的東西, 無論是從專業角度還是從哲學角度。
-
管理生產服務的殘酷現實意味著故障時有發生,您必須說明原因。SRE和DevOps都進行了無可厚非的故障復盤,以抵消爭議。
-
最終,實施DevOps或SRE是一種整體行為; 兩者都希望通過高度特定的方式共同合作,使整個團隊(或單位或組織)更好。 對于DevOps和SRE,更好的速度就是產出。
如你所見,DevOps和SRE之間有許多的共同點。
然而,也存在著顯著的差異。DevOps在某種意義上是一個更廣泛的哲學和文化。因為它影響的變化范圍比SRE更廣,所以DevOps對上下文更敏感。 DevOps對于如何在一個具體層面上執行操作沒有更詳細的說明。例如,它不是關于服務的精確管理的規定。相反,它選擇專注于在更廣泛的組織中打破壁壘。這就很有價值。
另一方面,SRE的職責定義相對狹窄,其職權范圍通常是面向服務(面向最終用戶)而非整體業務。 因此,它為如何有效運行系統的問題帶來了自以為是的知識框架(包括錯誤預算等概念)。 雖然作為一個職業,SRE非常清楚激勵措施及其影響,但它反過來卻對孤立化和信息壁壘等主題保持沉默。 它將支持CI和CD,不一定是因為業務需要,而是因為所涉及的操作實踐得到了改進。 或者,換句話說,SRE相信和DevOps一樣的東西,但原因略有不同。
?
組織環境與成功采納的培養
DevOps和SRE在其運行方式上存在非常大的概念重疊。 正如您所料,他們也有一組類似的條件必須在組織內成立,以便他們 a)首先可以實現,并且 b)從該實現中獲得最大的好處。 正如托爾斯泰幾乎從未說過的:有效的操作方法都是相似的,而失敗的方法都有各自的失敗之處。 激勵機制可以部分解釋這一點。
如果組織的文化重視DevOps方法的好處并且愿意承擔這些成本 - 通常表現為招聘困難,維持團隊和責任,流動性所需的能量,以及用于補償必要技能所增加的財務資源,這更為罕見 。然后該組織還必須確保激勵措施是正確的,以實現這種方法的全部好處。
具體而言,以下內容應在DevOps和SRE的環境中都應成立。
教條,剛性的激勵措施限制了你的成功
許多公司無意中定義了破壞集體績效的激勵措施。為了避免這種錯誤,不要將激勵機制局限于與發布相關或可靠性相關的結果。正如任何一位經濟學家都能告訴你的那樣,如果有一個數字衡量標準,人們總會找到一種方法,讓它產生不好的效果,有時甚至是以一種完全出于善意的方式。相反,你應該允許其他人自由地找到正確的選擇。正如前面所討論的,DevOps或SRE通常可以作為產品團隊的催化劑,允許其他軟件組織以連續可靠的方式向客戶提供功能。這種動態機制還解決了傳統和分散的系統/軟件組方法的一個持久性問題:設計和生產之間缺乏循環反饋。具有早期SRE參與的系統(理想情況下,在設計時)通常在部署后的生產中工作得更好,而不用管是誰負責管理服務。 (沒有什么比丟失用戶數據更能阻礙功能開發的進展。)
?
最好自己解決這個問題; 不要責怪別人
此外,要避免把生產事故或系統故障的責任推給其他組。在許多方面,推卸責任的動力是傳統工程操作模型的核心問題,因為運維和軟件團隊允許出現單獨的激勵機制。不管怎樣,考慮采用以下做法來反駁組織層面的指責:
-
不僅僅只是允許,而是積極鼓勵工程師在產品需要時改變代碼和配置。還應允許這些團隊在其任務范圍內采取激進行動,從而消除采取緩慢行動的想法。
-
支持事后總結。這樣做排除了淡化或掩蓋問題的動機。這一步驟對于充分理解產品并實際優化其性能和功能至關重要,并且依賴于前面提到的生產經驗。
允許對“運行困難并且不可挽救的”產品不進行支持。 支持暫停這種產品,直到產品開發在支持準備階段和產品本身得到支持之后再修復該問題,從而節省每個人的時間。 根據您的背景,“運行困難并且不可挽救的”的含義可能會有所不同 - 這里的動態應該是相互理解的責任之一。 對其他組織的推遲可能會更為溫和,“我們認為使用這種技能的人有更多的時間”,或者限制在“這些人員將會因為過多的操作工作而沒有機會使用他們的工程技能。“在Google,直接撤銷此類產品支持的做法已成為一種制度。
?
將可靠性工作視為一個專門的角色
在谷歌,SRE和產品開發是獨立的組織。每個小組都有自己的重點、優先級和管理,而不需要對另一個小組發號施令。然而,當產品成功時,產品開發團隊將有效地資助新員工SRE的提升。這樣,產品開發與SRE團隊的成功息息相關,就像SREs與產品開發團隊的成功息息相關一樣。SRE也很幸運地得到了管理層的大力支持,這使得工程師團隊認可了“SRE”這一角色。盡管如此,你不需要有一個組織結構圖來做不同的事情,但是你需要一個不同的實踐社區。
不管你是使用組織結構圖還是使用非正式的機制,重要的是要認識到專業化會帶來挑戰。DevOps和SRE的實踐者可以從一個同伴社區中獲得支持和職業發展,以及一個用來獎勵他們獨特的技能和觀點的職業階梯。
值得注意的是,Google采用的組織結構以及上述一些激勵措施在某種程度上依賴于規模龐大的組織。 例如,如果您的20人創業公司只有一個(相對較小的)產品,那么允許運維退出支持沒有多大意義。 仍然可以采用DevOps風格的方法,但是,如果您能做的僅僅只是幫助它成長,那么改善操作性差的產品的能力就會受到損害。不過,對于如何滿足這些增長需求,與技術債務累積的速度相比,人們通常有比想象中更多的選擇。
?
何時可以替代
但是,當您的組織或產品增長超過一定規模時,您可以在支持哪些產品或如何確定支持優先級方面行使更大的自由度。 如果很明顯,對系統X的支持將比支持系統Y更快地發生,那么隱式條件可以發揮同樣的作用,選擇不支持服務的行為。
在谷歌,SRE與產品開發的強大合作關系已被證明至關重要:如果您的組織存在這種關系,那么撤回(或提供)支持的決定可以基于有關的客觀數據來比較運營特征,從而避免非生產性的交涉。
SRE與產品開發之間的富有成效的關系也有助于避免產品開發團隊在產品或功能準備就緒之前必須交付的組織反模式。相反,SRE可以與開發團隊合作,在維護負擔轉移到具有最多專業知識的人員之前改進產品。
?
爭取平等的尊重:職業與薪酬
最后,確保正確的職業激勵措施到位:我們希望我們的DevOps/SRE組織能夠像他們的產品開發伙伴一樣受到尊重。因此,每個團隊的成員應按大致相同的方法進行評級,并具有相同的薪酬激勵。
?
結論
在IT運維整體領域的許多方面,DevOps和SRE在實踐和理念上都非常接近。
DevOps和SRE都需要討論、管理支持、并從實際工作人員那里來獲得重大進展。 實施其中任何一個都是一段旅程,而不是一個快速解決方案:rename-and-shame(重命名和羞恥的)做法是空洞的,不太可能帶來收益。 鑒于它是對如何執行操作的更具見解性的實現,SRE對于如何在此過程中更早地更改您的工作實踐有更具體的建議,盡管需要進行特定的調整。DevOps關注的范圍更廣了,因此很難對其進行推理并將其轉化為具體的步驟,但恰恰是因為更廣泛的關注,可能會遇到較弱的初始阻力。
但是,每種方法的實踐者都使用許多相同的工具、相同的方法來改變管理,以及相同的基于數據的決策思維方式。最終,我們都面臨著同樣的問題:生產,讓它變得更好——不管我們被稱為什么。
對于那些有興趣進一步閱讀的人,以下建議可以幫助您更廣泛地了解目前正在進行的運維革命的文化,業務和技術基礎:
-
Site Reliability Engineering
-
Effective DevOps
-
The Phoenix Project
-
The Practice of Cloud System Administration: DevOps and SRE Practices for Web Services, Volume 2
-
Accelerate: The Science of Lean Software and DevOps
總結
以上是生活随笔為你收集整理的第一章 SRE与DevOps之间的联系的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021年「资料员」-通用基础及岗位技能
- 下一篇: 光伏并网柜保护监测