阿裏妹導讀:雙11的完美收官,2684億的銷售奇跡及順滑極致的客戶體驗讓雙11背後的技術再次被推到風頭浪尖。而雙11技術熱點話題,不得不提集團核心係統100%上雲這一技術創舉。
作為集團上雲的底座產品,ECS承擔了集團上雲基礎設施的重任,對如何保障集團上雲的極致穩定性及性能需求,彈性計算管控團隊做了長期的探索與實踐,竹澗作為SRE參與了這場“革命”,接下來他將分享ECS管控SRE在落地穩定性體係建設中的探索及背後的思考。
SRE是什麽?
SRE(Site Reliability Engineering)即網站可靠性工程,提及SRE很多人會聯想到運維工程師、係統工程師,其實不然,SRE本質上仍然是軟件工程師,下麵我們從SRE的發展曆史展開來進行介紹。
SRE最早在十多年前Google提出並應用,近幾年逐步在國內外TOP互聯網公司都開始廣泛應用。據筆者了解業界SRE落地成功的權威有Google、Netflix等,前者締造了SRE,並奠定了其權威的地位,而後者將SRE的實踐做到了極致,據官方曝露的信息,Netflix僅有的個位數的Core SRE支持了190個國家、數億用戶、數萬微服務實例業務規模的運維。
近幾年隨著DevOps的發展,SRE開始被大家熟知,國內的一線互聯網公司如BAT、美團也都逐步從組織架構、招聘上均有體現。以阿裏為例,不同的BU均有設置SRE團隊,然而在不同的部門,SRE的職責劃分卻不盡相同,那麽SRE究竟在做什麽?
SRE的職責
SRE主要負責Google所有核心業務係統的可用性、性能、容量相關的事情,根據《Site Reliability Engineering 》一書提及的內容,筆者做簡單匯總,Google SRE的工作主要包括但不限於如下:
而在國內,非常多的SRE部門與傳統運維部門職責類似,本質來說負責的是互聯網服務背後的技術運維工作。區別於傳統的運維SRE,如何在業務研發團隊落地SRE,我們做了一年多的探索與實踐,筆者認為業務團隊SRE的核心是:以軟件工程的方法論重新定義研發運維,驅動並賦能業務演進。下文將重點介紹彈性計算落地SRE的一些實踐及背後的思考。
一、為何要成立SRE?
麵臨的挑戰
ECS作為阿裏雲最核心的雲產品,對內承擔了集團上雲、雲產品On ECS的重任,是阿裏雲經濟體的基礎設施;對外作為亞洲最大的雲計算廠商,服務著遍布全球的大中小客戶(包括各種專有域、專有雲),而ECS管控作為核心調度大腦,重要性不言而喻。
隨著集團上雲、雲產品On ECS的進程加速,ECS的OpenAPI調用量達到了數億/日,ECS峰值創建量達到了 百萬/日,ECS管控調度係統在容量規模、極致性能、高可用性等方麵,麵臨著一係列挑戰:
SRE應運而生
如何在保障業務高速發展的同時,構建係統高可用的穩定性體係,同時在性能與容量上支撐業務未來3-5年的發展是團隊麵臨的重大挑戰。在SRE團隊成立之前ECS管控團隊是按照業務域進行的團隊劃分如實例、存儲、鏡像、網絡、體驗、ESS、ROS等。而在上述組織架構下研發團隊可以在垂直領域做到精深,但團隊整體會缺少頂層的視角,很難從局部看到整體,進而看到全局。
康維定律指出 “設計係統的架構受製於產生這些設計的組織的溝通結構”,簡單來說可以理解為:組織架構=係統架構,當我們係統穩定性體係需要跨業務團隊的頂層視角來構建的時候,最好的保障就是組織架構的落地,ECS SRE團隊應運而生。
二、SRE做了什麽?
前文簡單介紹了Google SRE團隊的職責包括容量規劃、分布式係統監控、負載均衡、服務容錯、on-call、故障應急、業務協同支持等,同時也簡單描述了國內偏係統運維的SRE團隊。而ECS SRE落地的探索過程中,吸取業界優秀經驗的同時也結合ECS團隊的業務及團隊特色形成了一套獨有的方法論及實踐體係。對於此,筆者的觀點是:沒有放之四海而皆準的標準,需要我們不斷探索的是與“當下、業務、團隊“契合的方案,古語謂之“天時、地利、人和”。
下文將整體上介紹ECS SRE團隊在穩定性體係建設上所做的一些事情。
< ECS SRE體係大圖 >
2.1 容量與性能
前文提到ECS的OpenAPI調用量達到數億/日,ECS創建峰值達到了百萬/日,在此背景下,管控服務的容量與性能麵臨嚴峻問題,比如數據庫容量麵臨枯竭、服務長尾請求頻現等。隨著集團上雲、雲產品On ECS的演進需求,以及整個雲原生大環境的高歌猛進,未雨綢繆已然變成了迫在眉睫。
以ECS管控核心的工作流引擎為例,在我們業務體量快速增長的背景下,工作流任務單表一個月的數據就達到了3T ,這意味即使是頂配數據庫也無法支撐業務數月的發展。除了工作流,核心的訂單、訂購、資源表均麵臨相同問題,如何在業務高速發展的同時,保障業務延續性是我們麵臨的頭號問題。
為了解決當下的容量與性能問題,同時麵向未來擴展,我們針對ECS自研的基礎組建包括工作流引擎、冪等框架、緩存框架、數據清理框架等進行了升級改造,為了後續可以賦能給其它雲產品或者團隊使用,所有的基礎組件全部通過二方包標準輸出。
★ 基礎組件升級:通過對ECS管控自研的業務基礎組件進行架構升級來應對業務未來的規模化發展。
★ 性能優化:多維度的性能調優策略來提升管控整體服務的性能指標。
2.2 全鏈路穩定性治理
穩定性體係化建設是我們在過去一年摸索中最重要的一環,對此筆者的心得是:穩定性治理一定要有全鏈路頂層視野,從上至下進行細分。下文將簡單介紹一下ECS管控穩定性治理體係。
1)數據庫穩定性治理
數據庫是應用的核心命脈,對於ECS管控來說,所有的核心業務全部跑在RDS之上,如果數據庫發生故障,對應用的損害無論從管控麵或者數據麵都是致命的。所以,SRE做的第一件事情就是守住核心命脈,對數據庫穩定性進行全麵的治理。
首先,我們先來看一下ECS管控在規模化業務下,數據庫麵臨的問題:
對於數據庫的問題我們的策略是數據庫 業務兩手抓,單純優化數據庫或者業務調優效果都不是最佳的。比如典型的數據庫大表問題,占用空間大,查詢慢,如果單純從數據庫層麵進行空間擴容,索引優化可以解決短期問題,當業務規模足夠大的時候,數據庫優化一定會麵臨瓶頸,這個時候需要業務調優雙管齊下。
下麵簡單介紹一下優化思路:
下圖是ECS在數據庫穩定性治理上的幾個探索。
2)監控預警治理
預警對於問題與故障的發現至關重要,尤其在規模化的分布式係統中,精準而及時的監控可以幫助研發人員第一時間發現問題,減少甚至避免故障的發生。而無效、冗餘、不精確的低質量報警不僅耗時耗力,影響SRE on-call人員幸福感,同時也嚴重影響故障診斷。ECS管控預警質量不高的因素主要包括:
針對上述情況,我們的策略是針對預警進行體係化整理,實現預警的真實性、準確性、精確性、高質量。我們的打法大概分了以下幾個步驟:
3)故障診斷
關於故障恢複我們有一個1-5-10的理想模型,意思是1分鍾發現問題,5分鍾定位問題,10分鍾恢複問題。1分鍾發現問題依賴於前文提到的高質量的監控預警體係,5分鍾定位問題則依賴於係統的故障診斷能力,如何基於已有的預警信息實現故障快速診斷麵臨一係列挑戰:
在故障診斷體係的建設上,我們初步劃分三個階段:
4)全鏈路SLO
沒有100%可靠的係統,對於終端用戶而言99.999%和100%的可用性沒有本質區別。我們的目標是通過持續迭代優化保障用戶99.999%的可用性服務體驗,而現狀是終端用戶發起的行為會經過一係列中間係統,任意一個係統可靠性出現問題都會影響客戶體驗。而全鏈路各個節點的穩定性如何衡量是我們麵臨的問題,對此我們開始了全鏈路SLO體係建設,主要策略如下:
5)資源一致性治理
根據分布式係統CAP原理,一致性(Consistency)、可用性(Availability)、分區容錯性(Partition tolerance)無法同時滿足。ECS管控作為規模化的分布式係統麵臨同樣的問題:資源一致性問題,具體表現在ECS、磁盤、帶寬等在ECS管控、訂單、計量等多個係統存在數據不一致問題。
分布式係統為了保障係統可用性,通常會犧牲部分數據實時一致性,轉而通過最終一致性來解決。
針對ECS的技術架構及業務特性,我們對保障資源一致性的策略如下:
2.3 SRE流程體係建設
ECS在 近百人並行研發& 核心應用每日發布&全年數千餘次發布 的背景下,可以做到故障率每年下降的關鍵因素之一,就是有一套相對完善的研發與變更流程保障。下文將簡單介紹ECS SRE在研發與變更流程體係上所做的的一些探索。
★ 研發流程:整個軟件生命周期研發流程規範升級。
1)設計流程與規範
從軟件工程角度來看,越早引入問題帶來的人力消耗和經濟損失就越小。沒有被良好設計的係統後續在維護階段投入的成本要遠高於前期設計的投入。為了把控設計質量我們在設計流程與規範上做了如下探索:
2)CodeReview升級
之前ECS的CodeReview主要在GitLab平台,其主要問題是gitlab與阿裏內部持續集成相關組件集成不夠穩定、另外無法設置準入卡點,Aone CodeReview平台很好的解決了與Aone實驗室的集成問題,並且提供了代碼合入的卡點配置功能,另外我們定義了一套ECS管控的CodeReview流程,如下所示:
3)全鏈路CI標準化
我們將ECS管控所有核心應用按照標準模式統一遷移至標準CI平台,大幅提升CI成功率,減少頻繁人工幹預造成的人力損耗。我們的方案如下:
4)全鏈路日常/隔離環境打通
ECS部署環境複雜度極高,具體表現在部署架構複雜、部署工具多樣、依賴多(幾乎依賴了集團和阿裏雲所有的核心中間件及應用),在近百人並行研發的模式下 穩定可靠的全鏈路日常環境是研發效能與質量的基礎保障。
全鏈路日常環境的改造無法一蹴而就,我們當前等構建路徑大致如下:
5)預發環境使用規範
預發環境與生產環境使用相同的數據庫,很容易出現預發測試影響生產服務穩定性的問題。在預發與生產無法數據隔離的情況下,我們的短期方案是通過標準化流程來提升預發布代碼質量,盡可能減少或規避此類問題發生。
6)FVT發布準入
每天淩晨通過運行基於OpenAPI的功能性測試用例集,來驗證預發布代碼的穩定性,是日常發布準入最後一道防線,FVT 100%通過率極大保障了ECS核心管控每日發布的成功率。
7)無人值守發布的探索
當前發布模式是發布前一天晚上值班同學基於Develop分支拉取release發布分支部署預發,發布當天觀察FVT 成功率100%通過後通過Aone進行分批發布,每批暫停觀察業務監控、預警、錯誤日誌,在該模式下核心應用每日發布大概占用0.5人/日。為了進一步提升人效,我們在自動化發布流程上進行來一些探索:
★ 變更流程:通過規範變更流程、接入GOC強管控、變更白屏化及變更自動化來提升變更效率,同時保障變更質量。
1)管控規範流程定義
通過約束現有的管控變更行為如熱升級、配置變更、DDL變更、約束配置變更、數據訂正、黑屏操作等實現所有變更可監控、可灰度、可回滾。
2)強管控接入
通過對接集團強管控,來保障所有變更可追溯、可評審。(也期望可以通過平台對接強管控消除人肉提變更的繁瑣)
3)變更白屏化
整合ECS全鏈資源、管控、診斷、性能、運維、可視化及老嫦娥運維能力,打造統一、安全、高效的彈性計算統一運維平台。
4)變更自動化
自動化一切需要人工幹預的繁瑣事項。
2.4 穩定性運營體係
穩定性體係的建設中,基礎組件的容量性能優化、全鏈路穩定性體係建設、研發與變更流程的升級是其安身立命的基礎,而若想細水長流則離不開文化的建立以及持續的運營。下麵是ECS SRE在穩定性運營體係上做的一些探索。
★ on-call輪值:on-call 在Google SRE的模式是 7*24小時輪值,負責生產係統的監控預警處理,緊急故障救火等。
SRE本質仍然是軟件工程師,在ECS管控團隊,SRE每個同學在負責研發的同時也要處理線上預警、應對緊急故障以及參與到疑難雜症的排查等日常繁瑣的工作,為了保障SRE同學核心研發工作不被打斷,我們開始嚐試使用on-call輪值機製。
1)on-call的職責
2)新人如何快速加入on-call
★ 如何做故障複盤?
故障複盤機製針對產生故障或者影響內部穩定性的問題進行事後複盤,在ECS內部我們將影響生產穩定性的問題統一定義為“內部故障”,我們的觀點是 所有“內部故障” 都可能轉化為真實的故障,應該被給予足夠的重視度。為此我們內部與集團故障團隊也進行了多次的溝通合作,在內部故障的複盤與管理模式上進行了一些探索,下麵將介紹故障複盤的一些基本理念及ECS管控在故障複盤上的一些實踐。
故障複盤不是為了指責或者懲罰,而是為了發現故障表象背後深層次的技術與管理問題。
1)故障複盤的方式
2)故障複盤文檔庫
故障複盤總結是我們重要的知識資產,我們內部針對每一次故障複盤進行了深刻的總結,形成內部知識庫 《Learn From Failure》
★ 穩定性日常運營
穩定性本身是一個產品,需要日常持續的運營,在ECS管控主要模式有穩定性日報與雙周報。
三、我認知的SRE
前文概要性介紹了ECS SRE過去的一些實踐經驗,筆者自18年開始以SRE的角色參與到ECS穩定性治理與研發工作,下文將談一下自己這一年時間實踐SRE的一些感悟,一家之言,供參考。
3.1 關於SRE的幾個認知誤區
1) SRE 就是運維
SRE不止於運維,確實部分公司的SRE崗位工作內容與傳統的運維或者係統工程師相近,但 主流或者說未來的SRE是一個技能綜合性崗位,不僅需要運維能力,也需要軟件工程能力、技術架構能力、編碼能力、以及項目管理與團隊協作能力。
2) SRE 不需要懂業務
脫離了業務的架構是沒有靈魂的!不懂業務的SRE是不合格的SRE,SRE要參與的技術與運維架構的優化與未來規劃,同時也要協同業務團隊完成故障排查,疑難雜症的處理,這些工作沒有對業務的理解是無法很好的完成的(甚至無法完成)。
3.2 SRE能力模型
前麵在“SRE=運維”的誤區解答中,簡單說明了SRE崗位對技術全麵性的需求,下麵筆者試著給出一個未來SRE能力模型,僅供參考。
1) 技術能力
a.研發能力
業務團隊的SRE首先要具備研發能力,以彈性計算SRE為例,我們會負責業務公共基礎組件比如工作流框架、冪等框架、緩存框架、數據清理框架等業務中間件的研發,研發能力是基礎。
b.運維能力
SRE是運維在DevOps發展進程中進化而來,無論是手動運維,抑或自動化運維,都需要SRE具備全麵的運維能力。在彈性計算團隊,SRE負責了生產環境(網絡、服務器、數據庫、中間件等)的穩定性保障工作,在日常on-call與故障應急工作中,運維能力必不可少。
c.架構能力
SRE不僅要關注業務當前的穩定性與性能,同時要以未來視角對業務進行容量與性能的規劃,這一切都建立在對業務係統架構熟知,並具備優秀架構設計能力的基礎之上。作為彈性計算的SRE,有一項重要工作就是對技術架構作為未來規劃,並提供可執行的Roadmap。
d.工程能力
這裏的工程能力主要指軟件工程的落地能力以及反向工程能力,首先SRE必須具備軟件工程的思維,具備大型軟件工程的可落地能力。另外,SRE核心的日常工作之一是穩定性問題以及疑難雜症的處理,反向工程能力在分布式係統規模化下的異常問題排查起到關鍵作用,尤其在處理陌生問題方麵。
2) 軟技能
a.業務能力
不懂業務的SRE是不合格的SRE。尤其是業務團隊的SRE,隻有在熟悉業務技術架構、發展狀況、甚至是業務模塊細節的情況下,才能更好的開展諸如架構規劃、故障排查工作。以彈性計算SRE為例,必須要熟悉當前彈性計算的業務大圖以及後續的發展規劃,甚至是核心模塊的業務邏輯也必須做到心中有數。
b.溝通能力
作為一名工程師,毫無疑問溝通能力核心的軟技能之一。對於SRE來言,需要參與的大部分工作都是跨團隊甚至是跨BU的,溝通能力顯得尤為重要。在彈性計算團隊,作為SRE對內我們要與多個業務兄弟團隊緊密溝通協作,保障業務穩定性;對外,要與集團統一的研發平台、基礎運維、監控平台、中間件、網絡平台等多方團隊進行核合作,甚至會走向一線直接麵對外部客戶,此時談溝通能力與溝通技巧再重要也不為過。
c.團隊協作
SRE要非常重視團隊協作,尤其在故障應急上,要協作多方團隊,緊密合作,降低故障MTTR。而在日常工作中,SRE要積極協同業務團隊以及外部依賴團隊,主導並推動穩定性相關工作的落地。
d.項目管理
SRE的工作技術複雜度和事務繁瑣度更高,加上日常的on-call和Firefighting,如何保障所有工作可以有條不紊的健康運作,從團隊角度看,項目管理非常重要;從個人角度看,時間管理極具價值。仍然以筆者所在的彈性計算SRE團隊為例,為了保障穩定性體係的快速落地,在過去一年我們進行了多個小型項目的攻堅,效果甚佳。當前我們正在以虛擬組織、長期項目的方式進行管理運作。
3)思維模式
前麵提到了SRE要具備的兩項軟技能包括團隊協作、及工程能力,與此同時需要SRE人員從思維模式上進行轉變升華,比如逆向思維、合作意識、同理心、隨機應變。
3.3 SRE核心理念
以下是筆者自己的從業心得,個人認為的SRE核心理念:
3.4 SRE精神
舍我其誰,SRE要有強烈的責任意識與使命感,作為穩定性的守護者,在團隊協作過程中,要做到無界擔當,一杆到底。
寫在最後
在信息爆炸的時代,技術的發展可謂日新月異,技術人不僅要保持對技術對熱情,也要具備思考力,沒有放之四海皆準的方案,隻有因地製宜、因時製宜的方案。無論如何,從現在開始行動,前路慢慢,上下求索。
最後,歡迎有技(入)術(坑)想法的同學私信聯係,聯係郵箱:zeqiang.yzq@alibaba-inc.com。
本文到此結束,希望對大家有所幫助呢。
评论
谷歌留痕
回复你好你好好的话说
谷歌留痕
回复哈哈哈回家试试