一個小小的故障就可能造成巨大的負面影響,因此穩定性工作複雜卻又至關重要。本文將通過故障預防、修複、復盤來講解該如何建設一個穩定性體系。 來到阿裡後,我的工作內容一直都是商品中心的穩定性,這份工作對於我個人在技術和經驗上的成長提升是無比巨大的。在我看來,穩定性是一個極為複雜的工作,對人的能力考驗... ...
一個小小的故障就可能造成巨大的負面影響,因此穩定性工作複雜卻又至關重要。本文將通過故障預防、修複、復盤來講解該如何建設一個穩定性體系。
來到阿裡後,我的工作內容一直都是商品中心的穩定性,這份工作對於我個人在技術和經驗上的成長提升是無比巨大的。在我看來,穩定性是一個極為複雜的工作,對人的能力考驗極大,本文希望和大家一起瞭解:
-
穩定性是做什麼的?
-
穩定性到底怎麼做?
-
做好穩定性,需要什麼樣的能力?
-
怎麼從穩定性零散的事情中創造價值?
一、什麼是穩定性
1、穩定性的定義
在我看來,穩定性工作是指日常保障系統安全生產的同時,利用技術手段以及規範開發流程,使系統在不斷的業務迭代中熵增達到最小化的一種工作。作為一家互聯網公司,穩定性工作本質上就是保障安全生產。一個故障,就可能會造成很大的負面影響,舉例幾個之前有過耳聞的故障:
-
某故障使下單阻塞,導致某線下業務受到很大影響;
-
很多年前春節時訂正數據,由於腳本問題,導致部分訂單被確認收貨;
-
由於arguments版本不一致,同時進行了無灰度的操作,導致某業務大範圍宕機;
由此可見,集團內部的故障,輕則影響用戶體驗、商家體驗,重則對人民財產造成重大損失;因此,保障安全生產是企業發展的頭等大事。
2、穩定性崗位的工作內容
穩定性的事情看上去可能比較散,但結合我自己的思考,我將穩定性的價值體系劃分為幾個方面:
1)日常穩定性
① 業務保障
大促保障、業務日常的答疑等等,通過這些事情,穩定性同學會與業務同學配合,從底層性能、技術層面,更好地推動業務向前發展。日常的答疑工作是穩定性同學投入時間最多的內容之一,很多問題都會第一時間流入到穩定性同學手中:
-
技術問題:應用架構不瞭解,或由於系統穩定性問題導致上游出現限流、超時等;
-
大促問題:很多關於大促的問題,大促跨域合作的橫向事宜等;
-
業務問題:日常碰到的影響業務體驗的問題,比如某些業務出現了阻塞或者數據錯誤等。
對於體量較大、較為核心的團隊,一天涌入的問題是很多的,我們的思考和處理方案如下:
-
技術支持:所有問題的入口,首先通過答疑群接觸到的就是技術支持同學,這部分能cover大部分的問題;
-
每周答疑:技術支持並不深入瞭解底層業務和代碼,對於他們無法處理的問題,會流轉到每周答疑同學身上,由商品域的同學每周輪換,負責答疑和發佈。
2)大促 & 活動保障
穩定性另一個核心就是負責大促和重保活動。每一次大促,上到業務,下到中台、基礎設施,都需要抽出人力進行保障,每個域的穩定性同學則是其中的中堅力量。下麵我著重從流程和內容上講一下大促保障手段,可能不同同學面臨的場景不同,但整個理論應該是相通的:
① 保障流程
-
大促準備
活動開始前開始進行一系列準備工作,如入口流量、各應用容量的評估,預案、規則的梳理,建站壓測等。
-
全鏈路加固
這個階段會根據正式期的流量模型進行頻繁的壓測來找出系統問題,建立相關的監控防線,壓測會一直持續到正式期開始。
-
作戰保障
從壓測期間發現的具體問題出發,逐個解決,並制定相關的作戰手冊等,完善大促保障機制。
-
大促預熱
這個階段一般在大促正式期前幾天開始,一般會執行一些清理和重啟的任務,混部擴容以及一些提前執行的預案、預熱任務等也會啟動。
-
大促保障
正式進入保障期,核心作戰時間保障活動,盯盤,發現問題及時播報;峰值結束後,需要關註相關預案及資源是否下線。
② 工作內容
大促穩定性保障的工作比較複雜,在這裡先放一張圖,讓沒有參與過大促的同學來點體感:
雖然看起來簡單,但真實的保障過程遠比這些事情更多,面臨的壓力也比想象的大很多,即使在大促日漸常態化的今天,參與大促保障、經歷阿裡千萬級複雜流量模型洗禮仍然是提高個人能力的最佳方式。
3)優化專項 & 鏈路治理
保障業務不斷發展時,由於系統不斷的迭代,必然會導致熵增,原來可能較為穩定的鏈路,會因為迭代而不斷腐化。同時,如618、雙11等大型活動,也不斷挑戰系統的極限。一句話來總結:業務發展(系統變更)不斷的挑戰著我們系統的穩定性,我們需要持續不斷的進行性能優化,保障系統的高可用,來適應越來越龐大的業務。不同的優化專項,在不同的場景下做法可能也不同,風險也會比日常的需求高很多。
① 產生變更
隨著業務不斷的迭代,不可避免地會發生變更,如更新代碼、發佈配置或做運維層面的變更等,而這些變更則可能引入一些未知的問題,這些問題可能會瞬間暴露出來,或積壓一段時間後噴涌式的爆發,一般來說,後者產生的影響可能會更大一些。
② 發現問題
故障定級經常會講提前發現,如果能夠提前發現故障,不僅能降低或者避免因故障帶來的損失,也能將故障等級縮小。那麼,如何主動發現由變更產生的問題?這一部分則要依賴穩定性建設時比較重要的一環 — 監控告警:
-
我們在上線業務代碼前,根據自己判斷出的可能產生問題的點,輸出的業務日誌告警。
-
容器與中間件性能相關的全景監控大盤。
-
線上與離線等數據對賬相關的大盤。
當然,監控不可能百分之百覆蓋到所有的問題,也有很多問題會從其他側反饋過來,此時就要盤點出自己的監控體系中到底還有哪些疏漏,並逐漸完善。
③ 解決問題
大致為高可用問題和數據一致性問題兩類,針對不同場景有不同的解決方法,高可用問題大家可能比較熟悉了,優化起來目標也比較明確,技術難度有高有低,不詳細展開討論。
4)成本縮減
大部分的性能優化,提升系統的性能僅僅是一方面,另一個作用則是通過性能優化提高的性能壓縮技術成本。同時,效能提升也是與穩定性同學有關的一件事情,通過制定更好的開發規範以及流程,來幫助同學們提高開發體驗和工作效率,也可以將更多的時間投入在業務發展上,來進一步促進業務發展,從而形成一個良性迴圈。在我個人看來,我將成本劃分為兩類:
① 效能提升 — 人力成本
人力成本受開發效率影響,效率越高,一個需求需要的人力成本就越低;影響人力成本的原因有很多,解決方案這裡不繼續展開,簡單列舉幾個會影響到人力成本的因素:
-
軟體複雜度
不合理的架構設計,以及擁有很長時間歷史包袱的應用,由於其代碼的複雜度越來越高,會讓開發人員的開發效率明顯降低,要定時對應用中的代碼進行重構,增加可讀性。
-
測試 & 回歸
作為開發過程中的重要一環,為了降低故障頻率,自測往往占據了比開發更長的時間,因此提升自測的效率和準確度尤為重要。
-
工作流程
不合理的流程也會拖慢工作進度,如工作分配不合理,責任互相推諉等;對工作職責的細分沒有明確的定義,或者對於問題的推進沒有嚴格的流程和產品化的工具,是這個問題發生的核心原因。
② 資源管控 — 技術成本
技術成本主要分為兩類:
-
計算成本
以記憶體運算為主,如容器、計算型中間件、外部平臺等,往往流量越高則產生的計算成本越高,因此管控計算成本可以從鏈路、性能優化上入手,讓同等流量下所需要的算力降低。
-
存儲成本
DB等偏重於存儲的中間件,存儲的數據越多,占用的磁碟空間越大,存儲成本則越高,因此管控存儲成本可以從數據治理入手。
計算成本與存儲成本並不是完全分離開的,舉例緩存,空間存儲等中間件,往往是計算(讀寫操作)與存儲並存,那核算成本的方式以長板為主。
在成本縮減中,技術成本占的比例是最高的,如何幫助縮減掉業務增長時瘋狂擴張的成本,也是穩定性同學的一個重要課題。
5)數據治理
與數倉領域的同學不同,穩定性同學很少會對數據質量去做管理,這裡提到的數據治理,主要是指治理一些會影響到穩定性情況的一些數據。比如,某業務發品時,由於邏輯沒有對齊,有些情況下雖然發品成功,但是會認為發品失敗,會不斷進行發佈重試,一直失敗一直重試,也沒有設置重覆上線,導致同樣一個商品最多發了上百萬次,使線上某核心鏈路查詢貨商關係時大量full gc。
一句話總結:由於鏈路不合理、黑灰產、外部胡亂操作或線上問題產出的阻塞鏈路、擴大成本的大數據內容,都算作線上不合理的數據治理範圍,每年固定的時段,穩定性同學會統一對這些數據做一次治理,降低成本,提升鏈路穩定性。
3、一個穩定性同學需要的能力
來打個比方,業務同學好比前線打仗的韓信,攻占地盤,為公司創造業務價值,而穩定性的同學則是維護大後方的蕭何,為前線的同學提供保障,維持系統的穩定運行。如果業務發展不好,則公司無法維持好經營,但是如果前方斷糧,系統的性能和穩定不足以承載這麼大的業務體量,那麼無論業務再怎麼發展,都是白費功夫。保證系統穩定安全的運行,是穩定性同學最重要的工作。穩定性的工作強度很大,同時對人的心、腦、體考驗也極大。它需要多元能力:
1)合格的技術能力
衡量一個穩定性同學是否能cover住垂直域穩定性工作的第一個重要指標,就是他的技術能力,對於技術能力要求的細節。日常要保持一直學習的心態,養兵千日,用兵一時,不能臨時抱佛腳。在此我不做過多描述,這裡只放一張關於java基礎核心能力的圖供大家感受一下:
2)臨危不亂的心理素質和強大的身體素質
從事穩定性工作,不論與你是否有關,相關業務是否瞭解,遇到的所有問題及故障永遠都是第一處理人,因此見到的問題故障會比一般同學多出很多,同時集團對於故障處理的要求非常嚴格,這時候就需要你有強大的心理素質。身體素質自然不用多說,如果說穩定性是業務發展的“1”,那麼強壯的身體則是穩定性同學需要的那個“1”。
3)熟能生巧
如果說技術能力是排查問題需要首要條件,那麼熟練度則檢驗了一個穩定性同學是否足夠老成;一個問題新人定位&處理可能需要幾個小時,但是成熟的穩定性同學憑藉經驗和工具可能瞬間定位到問題的根因,確定解決方法。
4)拉通 & 人際交往能力
穩定性同學大多都會參與到橫向任務,如大促保障、跨域穩定性專項等事情中來,因此,優秀的人際交往、協調,拉通的能力,也是穩定性同學需要擁有的,與其他團隊緊密協作、積極配合,也會為自己和團隊留下較好的口碑,以後推進其他事情也可以事半功倍。
二、穩定性體系建設
1、防線建設
1)架構設計
穩定性工作本身偏向於底層技術,對於小、中公司而言,穩定性同學的定義更偏向於“技術架構師”的角色,所以底層技術架構上的設計是穩定性防線建設的一部分,簡單舉幾個例子:
① 容量評估
什麼情況下需要進行容量評估?我理解有以下兩種場景:
-
新發應用
應用建立之初,需要根據預估上游的流量,計算容器、中間件的吞吐率,在計算結果的基礎上加上一些兜底的機器後,給出應用所需的容量。
-
業務變化較大
當上游或者應用內部有較大的流量或性能變化時,要調整之前的容量,如大促期上線下線,或業務鏈路有重大迭代變更時。
容量評估是架構設計中比較重要的一環,容量太多會浪費成本,容量太少則會對線上可用性產生影響。
② 部署架構 & 容災
在分散式系統大行其道的今天,容災的場景基本在集團每個應用中都可以見到,比如集團的多單元部署,現在比較常見的架構主要是由中心A地(中心 + 混部集群)和單元B地(單元 + 混部集群)兩個比較大的單元構成的,也就是所謂的“兩地”,流量從入口端進行轉發。
容災的重要性不言而喻,如果單純在一地做集群化,若遇到天災人禍等不可避免的物理損失,將會導致服務不可用,事實上也經常出現某單元由於網路運營商的問題導致服務掛掉的情況,這個時候就可以通過從入口處切換跨地調用來解決。
雖然多地部署的理論比較簡單,但是部署架構的一個重點在於將流量按照不同的作用去劃分分組,如上圖中的讀、寫流量分組是分離的,且讀、寫按照不同的上游業務也有單獨拆分分組,這樣就可以保證不會因為上游某一個大業務出問題導致整個集群不可用的場景出現。
當然,每個應用所面臨的場景是不同的,那麼如何部署、如何容災,也是這個垂直域穩定性同學需要考慮的問題。
③ 數據一致性保證
當今的分散式系統,設計時絕大多數都會碰到非同步鏈路,不管是業務上需要非同步的去處理數據,還是中間件的數據同步機制,如果涉及到非同步那就有可能會出現數據一致性問題,這與高可用問題分別是兩個方向,但是他們兩個本質上一樣重要,甚至數據一致性出現問題產生的影響、恢復的難度要遠大於高可用問題。
所以,在系統架構設計之初,就要做好數據一致性的保障措施,完善對賬機制,並通過建立的防線發現存量和增量的問題。每個域面臨的數據一致性問題場景不同,對於偏數據存儲的部門,往往無法完全釐清模型與模型、數據與業務之間的關係,因此防線總會有疏漏,而一旦數據出現問題,往往是最難解決的:
-
歷史數據提取困難,如果沒有數據留痕平臺,只能通過數據離線表拉取,會導致數據可能有一定誤差,如果故障時間線拉的很長,數據的提取會更加困難。
-
複雜的業務邏輯,往往讓人不知道該如何回滾數據,一旦回滾邏輯出現錯誤將直接導致二次故障。
整個數據一致性問題是一個非常大的專題,這裡只是讓大家稍微有一些體感,想要聊透這個問題需要很長的篇幅,在這裡先放一張之前總結的資損防控方法圖,供大家參考:
2)監控體系
我認為監控體系的建立是穩定性防線體系建設中最重要,也是難度最大的一環,線上的系統每天都處於不斷的變化中,這種變化既來自自身的應用迭代,也來自上游業務的不斷調整,隨著時間的發展,業務的複雜度會變的越來越高,這時候就需要一個非常完善的監控機制,能幫我們快速預防和發現線上問題,如果沒有一個好的監控體系,那麼維護系統穩定性根本無從談起。
雖然說起來簡單,但是要實際建立一個完善的監控體系卻是一個非常之難的事情,即使現有的監控體系非常完善,但是隨著時間的不斷推移,現有的監控必然會隨之腐化,重新完善整套監控體系需要投入很大的人力成本(比如人員流動後,原有監控的運行體系沒有交接,可能需要重新編寫等)。
如何去建立以及維護一套完整的監控體系,其中的方法比較細節,在此列舉幾個我認為比較關鍵的內容:
① 監控覆蓋面
覆蓋面是評判體系是否足夠優秀的第一個標準,對於業務特別複雜的介面,覆蓋面越大,發現問題的概率就越高,但是對於歷史包袱較重或業務比較複雜的系統,覆蓋面做到百分百是不可能的,這裡我從增量和存量兩個角度討論一下如何提高監控覆蓋面:
-
存量
梳理業務模型,盤點所有鏈路,優先從重要鏈路,例如從能影響線上流程或導致資損的鏈路開始,存量的監控盤點是一個持續不斷的過程,隨著時間的推移,我們的努力會使監控鏈路不斷完善。
-
增量
相較於存量,增量則更好處理一些,新業務上線時是否需要監控,可以通過CR或群體評審來決定。
其中,可能有的存量問題鏈路較難發現,或短時間內影響面較小,導致無人關註,或者一直梳理不出來,等到某一天問題積壓爆發,這個問題在重存儲的系統中非常明顯,我們正在討論一種解決方案:數據聚合分析,即從數據共性角度,判斷出非法數據,進而判斷出非法鏈路。
② 降噪 & 健康度
降噪是在監控中最讓人頭疼的一環,估計很多同學都有過體會,大多數情況下,線上告警出的問題並不會影響線上穩定性,這種告警一旦過多,容易讓人逐漸放鬆警惕,當真正出現重大故障時往往不能第一時間發現。告警的有效性,就是我們常說的“監控健康度”。
很多成熟的監控產品,會將監控健康度作為一個重要的指標,當監控的告警有效性很低時,會停用監控先進行維護,關於如何進行監控降噪提高健康度,我個人經驗有如下幾點:
-
提高維護效率
一個複雜的系統往往有很多的監控,每種監控可能都處理不同的業務,如果全部依賴穩定性同學進行處理,顯然是不可行的,應當將監控按不同的業務維度分發給團隊內的同學,避免出現一個人處理一大批監控,最終處理不過來導致告警積壓,告警效率降低。
-
及時降噪
明確分工之後,一旦監控發現告警,對應的負責人要及時處理,一般來說,需要人為check的監控告警積壓數量不能超過20條,一旦超過就會極大的降低維護人員的工作效率,這種情況下要及時溝通,聯繫團隊內其他同學安排時間協助排查;當發現需要降噪的數據時,要及時更新過濾規則,保證監控正常迭代。
③ 定時統計 & 復盤
團隊內部要針對現有的監控進行定期盤點,健康度過低的監控要及時分析原因,並判斷是否可以繼續啟用,不合理的監控關掉,避免混淆視聽和增加監控成本。
3)流程規範
在日常中,相信大家不難發現,一些大故障,往往都有幾個共性:
-
一把梭
絕大多數大故障的特性,這種問題常發生於配置推送類的操作,比如很多同學為了圖快,直接通過預案直接推送配置,或代碼中有推送配置等,也有在變更發佈中,沒有認真評估好變更的風險,灰度批次較少導致大故障,換句話說,灰度的批次和時間越長,導致大故障的概率就越低。
-
疏忽大意
發佈時沒有關註系統核心指標,雖然說灰度可以避免絕大多數的重大故障,但有些重大問題如果在灰度沒有及時發現,等接近全部完成時爆發出來的話,本質上和“一把梭”沒有任何的區別,這種情況常見於很多小流量應用中,即使一批機器也能扛起全部的流量,如果前面幾批都掛掉了,除非看大盤,否則不會有任何的感知,但是最後一批發完之後,就直接報大故障了。
因此,嚴格的流程規範,會幫助我們及時發現和避免很多本不應該有的故障,當前阿裡集團的安全生產團隊已經將常見的幾乎所有變更流程都進行了管控,內部如Aone、ChangeFree等平臺已經進行了嚴格的平臺化的規範,只要遵循線上正常的發佈流程並加以防範,基本上不會出現特別大的故障,簡單說一下我認為比較關鍵的幾個流程:
-
Code Review
CR想必大家都做過,但是不應該只局限於“Code”,任何會線上上產生變化的變更,都應該有人Review,但是這一步過度依賴人為,雖然有一些代碼靜態分析的工具,但是由於業務場景的複雜性,這一步雖然不能完全做到100%的準確,但是仍可能發現一些風險和規避一些低端的問題,同時,有經驗的同學可以從底層代碼優化和建模的角度,降低應用的熵增速度。
-
測試回歸
靠人工的check無法達到太高的準確度,那麼就需要靠平時測試同學積累起來的測試用例進行回歸,測試用例需要平時不斷的維護、根據業務變化不停的迭代,才能保證回歸的準確性;同時,測試回歸也是與測試同學進行對焦,從不同的視角上去發現問題,這也是集團要求發佈變更前必須經歷的一個階段。
-
嚴格審批
審批本身也是起到一個“知會”的作用,例如在大促期,緊急變更需要審批到大隊長,也就是這個意思,老闆和橫向PM具有更廣闊的視角,需要讓他們判斷變更的風險性以及當前是否有必要進行變更。
-
卡點 & 灰度
上述的每個階段,都必須通過產品化進行卡點,如果不通過則不能發佈。
每個應用根據自己不同的情況都會有不同的卡點,不同的應用可能有自己的卡點平臺,這些也可以通過對接Aone集成進去;至於灰度發佈,大家都很熟悉了,這裡就不展開討論了。
4)混沌工程
建立完自認為完美的防線之後,肯定需要校驗可用率,但是總不能通過等著線上出問題來檢驗防線是否生效,這樣成本就太高了,此時就需要引入混沌工程,相信大家應該都很瞭解混沌工程了,那麼就在這裡貼一下相關的定義:
混沌工程,是一種提高技術架構彈性能力的複雜技術手段。Chaos工程經過實驗可以確保系統的可用性。混沌工程旨在將故障扼殺在襁褓之中,也就是在故障造成中斷之前將它們識別出來。通過主動製造故障,測試系統在各種壓力下的行為,識別並修複故障問題,避免造成嚴重後果。
混沌工程在阿裡集團內部的體現為故障演練,基本不需要部門內部自行操作,比較出名的有每年集團都會舉辦的紅藍演練,以及日常經常發生的生產突襲、斷網演練等。
故障註入的平臺,演練時一般使用集團內部比較出名的MonkeyKing,具體的使用方法這裡不表,市面上有很多開源的混沌工程平臺,原理都是類似的。
① 問題分類
針對不同種類的問題,有不同的註入和恢復機制 ,不詳細展開了,上一張分類比較好的大圖:
② 演練機制
整個故障演練機制分為四個部分,基本上也是所有混沌工程的思路:
-
準備
可以在這一階段做一些故障演練前的準備工作,保障我們的系統以及監控在故障演練之前是處於一個穩定的狀態,比如說在執行演練前自動檢查一下機器的狀態,應用的狀態,甚至說故障演練的agent是否已經部署到了對應的機器上等等。
-
執行
在執行階段可以選擇你需要的故障場景,mk2裡面支持像不同的應用註入故障,也支持同時像一個目標機器下發多個故障,故障的場景也不局限於mk平臺提供的故障能力,用戶自己開發的故障能力也可以集成進來。
-
驗證
檢查階段就是進行故障執行後的一些狀態檢查,檢查的範圍包括了系統本身的一些指標,比如我是CPU滿載,那麼CPU是否真的滿載了。
-
恢復
我們希望每個故障場景都是可以有相應的恢復手段的,如果故障註入後,開發人員沒有辦法在一定時間內處理故障,那麼平臺本身一定要保障故障是可以恢復的。
2、快恢機制
即使防線建設做的再好,但是人難免會有疏漏,不存在能百分之百攔截故障的防線,如果故障已經發生,那麼當前的重點就應該是快速止損並恢復。
從發現、處理到復盤,阿裡集團有一套完整的SOP,整個處理流程非常的規範,同時,阿裡集團對於高可用故障恢復的時間要求非常高,一般來說是1-5-10,即一分鐘發現,五分鐘止血,十分鐘恢復,不過肯定不是所有的故障都能嚴格達到這個高標準,但是處理速度當然是越快越好,避免故障升級。
那麼下麵就從定位、止血、恢復這三個階段來講述一下快恢中具體要做的事情:
1)快速定位
很多同學第一次面對問題或者故障時,往往頭腦空白不知從何查起,如果碰到大故障時,很多主管在後面圍觀,心情則會更加緊張,進一步拖慢了查問題的時間,那麼如何對線上的故障和問題進行快速定位呢?
首先,在定位問題之前,要快速的確認是不是屬於本域的問題,很多時候問題的表象看似出自於自己的應用,但實則可能是上下游、中間件或者硬體問題引起的,如果方向錯誤,可能會拖延故障的處理時間,放大線上影響和故障等級,那麼如何快速定位,我認為可以從變更的角度去入手思考:
本域是否發生過變更?這個是最核心的判斷因素之一。
如果沒有,那很大可能跟本域的關係不大,請註意,這個變更不僅僅是通常理解上的代碼發佈、配置推送、數據操作等,而是所有可能會對線上的運行環境產生影響的操作,如代碼中的配置推送,上下線或置換容器等;當然,並不是說沒有變更就完全沒關係,有些情況也有例外,舉幾個常見的例子:
-
屬於定時任務、延時執行等變更後一段時間才運行的鏈路。
-
由於流量評估不准,平時流量較少,但某一時間段峰值流量突然劇增的鏈路。
-
上線前測試不足或上線後流量較少,業務覆蓋面不全的鏈路,可能由於突然的冷門流量導致報錯。
本質上來說,這些情況產生的錯誤還是由於“變更”引起的,只不過是變更生效的時間被延後了。
如果發現存在變更,那麼要結合大盤,判斷故障的時間線是否與變更的時間線吻合或相差不大,如果是的話那麼就八九不離十了。
在定位到產生問題的域後,如果不是自己的問題,那麼可以儘量協助排查,如果是域內產生的問題,那麼就要著手開始定位根因,這個時候就是考驗穩定性同學的基本功和經驗了,同時也要結合集團給出的一些比較好的產品化工具,例如:
① 監控大盤
常見的監控系統有很多,一些開源的監控大盤讓我們面對大多數問題時基本不需要去機器上命令行排查了,對於不同的場景,用對了監控可以事半功倍。
阿裡內部有各種各樣的大盤,可以讓集團的同學在處理問題時的速度更快,同樣部分開源的大盤也非常強大,至於如何做產品選型,大家可以自行評估,思路大概就是如下幾種大盤:
-
硬體 & 中間件指標大盤
從容器硬體水位、中間件(RPC、緩存、DB...)水位等偏重於技術指標的大盤中,通過時間線定位出問題的大致方向和時間線。
-
鏈路追蹤大盤
以傳輸協議、介面作為維度,找出相關的鏈路和trace,具體問題具體排查。
-
流量調度系統
偏重於單機大盤的系統,可以從秒級維度查出單台容器的性能指標,並可以實現流量調度,將有問題的容器流量摘除。
② 分散式日誌系統
對於一些代碼層面或業務層面的報錯,單純通過大盤進行深度定位是不現實的,究其根因還是要到底層去查日誌報錯堆棧,這個時候就需要用到分散式日誌系統了,通過分散式日誌系統採集的信息,可以配置相應的大盤,或直接搜索錯誤堆棧,進行細節上的排查。
2)快速止血 & 恢復
之前將問題劃分為高可用以及數據問題,那麼也按照這個分類來講一下對應的止血 & 恢復策略:
① 高可用問題
止血與恢覆在高可用問題上,大多數情況是相關聯的,止血即恢復,如:
-
某系統變更導致應用夯死,回滾重啟的同時,系統恢復正常,達到了止血和恢復效果。
-
推送某開關,導致業務鏈路阻塞,回滾開關後,鏈路恢復正常。
-
由於網路服務商原因,導致某地域的機房網路重傳率過高,通過切流其他單元達到了恢復止血。
同時,相信大家都接觸過高可用問題,對於這類問題的快恢也有一定的瞭解,限於篇幅原因這裡就不再一一描述不同高可用問題的恢復策略了,直接在這裡引用和拓展一下之前總結過的高可用問題快恢六招:
-
切流:遇到天災人禍等不可避免的地域性故障,應對單元維度,機房維度,機器維度切流;業務層面上要提前佈防,通過集團提供的diamond、switch等配置中心進行代碼熔斷。
-
擴容:流量暴增時對集群進行擴容,適用於流量超出預期的場景。
-
限流:介面限流可以從入口層面保護絕大部分流量,熱點限流可以保障流程中涉及的中間件或者下游不被打掛。
-
回滾:較為直接的止血方式,回滾前需先機房隔離或切容災,防止回滾時間較長升級故障。
-
降級:若是鏈路弱依賴,先降級再排查。
-
重啟:應對記憶體溢出,fullgc連接數滿等。
② 數據問題
數據問題與高可用問題有非常大的差異,高可用問題恢復起來較為簡單,通常有比較明確的策略,但數據問題則不同,我將其分為兩類:
-
數據計算錯誤:由於線上邏輯問題導致數據計算錯誤,進而阻斷鏈路或產生臟數據。
-
數據存儲錯誤:持久化與非持久化的數據存儲內容與期望值出現偏離,如商品價格落庫錯誤、緩存數據錯誤等,導致鏈路上讀到的都是臟數據,產生數據不一致或資損問題。
其中,數據計算錯誤的恢復策略較為簡單,可以直接通過熔斷、切流等機制關閉增量問題來源來進行恢復止血,數據問題真正的難點在於存儲錯誤,非持久化的數據存儲,如緩存,可以通過熔斷增量問題入口,清除存量數據來解決,但是一旦持久化的數據臟掉且量級非常大的話,從數據的提取到數據的回滾都非常的困難:
-
數據提取
-
量級大:在很多情況下,回滾數據需要提取非常大量的數據,提取速度很慢。
-
複雜程度高:模型比較複雜的系統,提取數據時需要非常複雜的過濾規則,且經常出現提取到一半時發現過濾規則有問題的情況,這時候之前提取的數據就無用了,進一步加長恢復的時間。
-
數據實時性:如果沒有數據留痕系統,那麼提取數據最常見的方式就是從ODPS中撈取,即天表或小時表,但是這兩種表都會有數據延遲,即從產出數據表的時刻起,到當前的時刻為止,如果數據發生過變化,那麼離線表中是無法獲取到的,也就是從離線表中拿到的是臟數據,會導致一批數據回滾不准,產生二次故障。
-
數據回滾
-
風險高:提取出的數據如果不准,回滾將直接出現二次故障,進一步加大數據回滾的難度。
-
性能問題:當回滾的數據量過大,需要一個產品化程度比較高的數據訂正平臺做控速、灰度控制、失敗重試以及進度管控,否則訂正速度一旦過快,可能直接擊穿鏈路節點。
因此,數據存儲問題或我們常見的資損問題,往往主要關註的不是恢復時間,而是主動發現率、止血時間、資損金額等,因為要快速恢復量級很大的數據存儲問題是不現實的,往往都是依賴人為提取數據以及手動恢復,事實上針對數據存儲問題,也沒有系統能做到通用化的數據回滾策略,因為每個業務、每個系統的提取數據,回滾數據的邏輯基本都是不同的,如果依賴平臺通用邏輯回滾,那麼二次故障的概率會非常高,所以說,對於數據存儲問題,要做到第一時間通過熔斷、切流等機制止血後,在優先保證數據絕對正確的情況下,再進行回滾恢復,不能盲目的追求恢復時間。
3、反哺
1)復盤 & Action 跟進
每一次故障都是血的教訓,但是以我的視角來看,發生故障並不完全是一件壞事,因為應用系統是人造就的,是人就一定會犯錯,所以系統也不可能保證百分之百的強壯,有問題則證明系統、流程還有不足,才能推動我們不斷的向前進步,這也是我們每一次故障之後要進行復盤的原因,犯了錯並不怕,重要的是如何改正。
集團對於故障的復盤有一套嚴格的執行流程,大概如下圖所示:
具體詳細的復盤流程不詳細展開,談談我認為復盤這個節點比較重要的幾個問題:
① 三省吾身
無論是自己,亦或是團隊其他同學導致的故障,一定要問自己幾個問題:
-
為什麼:背景是什麼,故障是怎麼發生的?根因是什麼?為什麼當時沒發現?
-
“我”:
-
就是我:這個故障是我導致的,我當時怎麼處理的這個問題?恢復的快不快?還有沒有可以改進的地方了?
-
如果是我:他這次產生的故障,如果放在我身上,我會不會跟他做一樣的事情?如果要我來恢復,我應該怎麼做?
-
下一步:這次的故障暴露了什麼問題?是代碼bug還是流程問題導致的?我可以給團隊提什麼樣的建議來解決這個問題?
-
動手去做:確定解法,我可不可以幫助團隊同學去做完這件事情,會對我自己有多少成長?
② Action 落實
很多時候,我們都只局限在“這一次”的故障中,而不會去思考“每一次”。在我看來,Action真正的作用,不只是為了單純的解決這一次的問題,而是要我們舉一反三,從根因上思考,系統中是否還存在與這次故障相同的問題?我們要如何分類的去解決,這樣才能真正的將這一次故障的效應和Action發揮最大的作用。
2)穩定性分享
除了穩定性的技術建設,文化宣導也是基礎建設的一部分。
除了故障方面,穩定性同學所做的底層優化專項等偏向於技術層面的工作,也可以在團隊內部或跨部門做分享,建立工程師文化,培養技術興趣,以及擴大部門和團隊在集團中的影響力,以我所在的商品團隊舉例,每月都會舉行一次“工程師之夜”的分享會,包含技術、業務模型等比較有代表性的工作成果,同時團隊內部優秀的同學也會經常跨域去做技術分享。
三、後記
穩定性工作遠比文章里的內容要複雜的多,每一個單點拉出來,都能形成一篇文章去介紹,限於篇幅問題,無法將穩定性所有的內容表達出來,這裡將我過去幾個月的思考和大家分享,歡迎一起交流評論。最後,也向所有從事穩定性工作的同學致敬,希望各位都能在其中獲得自己想要的成長和收穫。
參考資料
-
面向失敗的設計-故障與攻防演練錘煉容災應急能力
https://developer.aliyun.com/article/726337
-
知乎:什麼是混沌工程?Answer:亞馬遜雲科技
https://www.zhihu.com/question/308294657
-
天啟回歸提效與精準測試
https://developer.aliyun.com/topic/n-cases?id=115120
本文來自博客園,作者:古道輕風,轉載請註明原文鏈接:https://www.cnblogs.com/88223100/p/How-to-Improve-Vertical-Domain-Stability.html