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