陳根
關(guān)鍵詞:分布式系統(tǒng);可觀測性;可視化;鏈路追蹤
1概述
隨著社會生產(chǎn)力的進(jìn)步,社會分工細(xì)化,新的職業(yè)出現(xiàn),新的商業(yè)模式誕生,為滿足人們的生產(chǎn)生活需求,信息系統(tǒng)的建設(shè)方式和架構(gòu)也在與時俱進(jìn),信息系統(tǒng)處理越來越多的數(shù)據(jù),處理速度也越來越快,同時要滿足頻繁多變的業(yè)務(wù)需求,分布式系統(tǒng)逐步浮出水面。本文不討論分布式系統(tǒng)建設(shè)方案,重點(diǎn)就分布式系統(tǒng)的可觀測建設(shè)展開論述。
2可觀測基礎(chǔ)能力建設(shè)
分布式系統(tǒng)不同于傳統(tǒng)的單體系統(tǒng)或者M(jìn)IS系統(tǒng),由于其業(yè)務(wù)量龐大、系統(tǒng)架構(gòu)復(fù)雜、組件關(guān)聯(lián)密切,為運(yùn)維帶來極大挑戰(zhàn)。當(dāng)出現(xiàn)異常時,告警能力、故障根源分析判斷能力、故障快速處置能力就顯得非常重要,其中基礎(chǔ)能力從監(jiān)控?cái)?shù)據(jù)的采集、匯聚、異常監(jiān)測和告警等階段進(jìn)行闡述。
2.1采集能力
分布式系統(tǒng)的模型建設(shè)是先決條件,從分布式系統(tǒng)的特點(diǎn)來講,往往采用容器化部署,使用Kubernetes作為容器編排工具,可以按照Deployment-Pod-container的結(jié)構(gòu)來設(shè)計(jì)。模型建設(shè)后,通過各類數(shù)據(jù)采集器獲取模型實(shí)例的運(yùn)行狀態(tài)和配置數(shù)據(jù),此時需按照統(tǒng)一的規(guī)范來完成。數(shù)據(jù)采集分為3種類型,分別是指標(biāo)數(shù)據(jù)采集、日志數(shù)據(jù)采集、其他類數(shù)據(jù)采集。
2.1.1指標(biāo)數(shù)據(jù)采集
對于操作系統(tǒng)以及運(yùn)行在操作系統(tǒng)上的數(shù)據(jù)庫、中間件等基礎(chǔ)軟件,通常采集其CPU、內(nèi)存、文件系統(tǒng)、磁盤10、網(wǎng)絡(luò)吞吐量等使用情況數(shù)據(jù)。操作系統(tǒng)、數(shù)據(jù)庫等IT基礎(chǔ)設(shè)施的指標(biāo)建議通過操作系統(tǒng)文件如/proc/stat等采集,避免使用操作系統(tǒng)命令,以減少對源系統(tǒng)的資源消耗。
對于應(yīng)用系統(tǒng)來說,根據(jù)Google SRE指南,包括TPS、成功率、響應(yīng)時間、交易量、錯誤率等黃金指標(biāo),數(shù)字化模型建設(shè)好后的各個模型實(shí)例都可以參考這些指標(biāo),采用key-value鍵值對方式以json格式上報。
采集容器指標(biāo)可通過多種框架實(shí)現(xiàn).如sidecar模式或demonset模式,也有多種開源框架支持,如Istio等,一般采用Prometheus進(jìn)行容器指標(biāo)數(shù)據(jù)的采集。
應(yīng)用指標(biāo)也有2種實(shí)現(xiàn)方式,一是通過應(yīng)用系統(tǒng)計(jì)算好指標(biāo),通過API和Socket供數(shù)。二是監(jiān)控系統(tǒng)采集應(yīng)用輸出的日志經(jīng)過約定的規(guī)則計(jì)算。指標(biāo)數(shù)據(jù)需覆蓋各地域、站點(diǎn)、單元(租戶)、集群、容器等維度,采集數(shù)據(jù)應(yīng)攜帶必要的元數(shù)據(jù)信息,包括站點(diǎn)、單兀、IP、應(yīng)用ID、集群ID等,以供后續(xù)的匯聚計(jì)算和故障定位使用。
2.1.2日志數(shù)據(jù)采集
日志包括普通文本日志、操作系統(tǒng)日志、Tracing日志等,利用文件采集器讀取日志數(shù)據(jù),逐行讀取。Tracing日志也可以通過寫臨時文件的方式進(jìn)行采集,最好是采用遠(yuǎn)程日志方式,類似指標(biāo)采集的方案供數(shù)、時效性更高,如采用log4j的RemoteLogging功能,配置SocketAppender寫到遠(yuǎn)程服務(wù)器。
2.1.3其他數(shù)據(jù)采集
以上2種模式是主動數(shù)據(jù)采集,為了滿足其他場景需要,采集框架應(yīng)該建立通用數(shù)據(jù)上報接口供其他應(yīng)用或者組件調(diào)用。分布式系統(tǒng)的應(yīng)用與組件應(yīng)提供可用性探測接口,用于監(jiān)測其可用性。
以上3種采集功能建設(shè)的同時,還應(yīng)關(guān)注非功能性要求,以降低對源系統(tǒng)或者組件的影響。采集器需具備熱加載能力,其行為可被靈活定義和配置,包括日志路徑、采集頻率、數(shù)據(jù)報送發(fā)送頻率等,同時控制對CPU、網(wǎng)絡(luò)IO等資源的消耗。采集器應(yīng)具備限流能力,流量過大應(yīng)進(jìn)行限流,避免影響源應(yīng)用,可以設(shè)置一定的采樣頻率(50%和10%等),以降低網(wǎng)絡(luò)帶寬消耗,不能因?yàn)椴杉鳟惓;蛘邤?shù)據(jù)鏈路異?;蛘吡髁勘l(fā)而影響源端應(yīng)用和業(yè)務(wù)。采集數(shù)據(jù)上報使用星型結(jié)構(gòu),如圖1所示,葉子節(jié)點(diǎn)部署在被采集服務(wù)器上,匯聚節(jié)點(diǎn)負(fù)責(zé)集中所轄的葉子節(jié)點(diǎn)的數(shù)據(jù),上報至核心節(jié)點(diǎn)進(jìn)行匯總計(jì)算和存儲。匯聚節(jié)點(diǎn)支持橫向擴(kuò)展,采集器與匯聚節(jié)點(diǎn)建立控制通信機(jī)制以感知匯聚節(jié)點(diǎn)的動態(tài)變化,靈活選擇需要上報的匯聚節(jié)點(diǎn)。可借助ribbon組件或者自研算法實(shí)現(xiàn)負(fù)載均衡策略。
2.2匯聚計(jì)算和異常監(jiān)測
數(shù)據(jù)采集到匯聚節(jié)點(diǎn)后,根據(jù)不同數(shù)據(jù)類型采用不同計(jì)算法方法進(jìn)行異常監(jiān)測和計(jì)算。指標(biāo)數(shù)據(jù)較規(guī)整,尋找異常點(diǎn)比較方便,適合直接進(jìn)行程序計(jì)算,使用Java,Python,Golang等都可以對其進(jìn)行簡單編碼、實(shí)現(xiàn)流式計(jì)算模式。同時,也能對接通用算法,如單指標(biāo)異常監(jiān)測、基線算法等。以計(jì)算CPU使用率是否超過閾值為例,程序開辟隊(duì)列保存接收到的KV鍵值對(Tx為采集間隔),T1時刻讀取隊(duì)列中的Ⅳ個數(shù)值來計(jì)算平均值、峰值、中位數(shù)等,T2日寸刻再讀取隊(duì)列中的Ⅳ個數(shù)字進(jìn)行計(jì)算。T1,T2,N(滑動窗口)可根據(jù)應(yīng)用系統(tǒng)的業(yè)務(wù)特點(diǎn)、交易量等設(shè)定,』7v越小越靈敏,越大越遲鈍。如果是聯(lián)機(jī)系統(tǒng),適當(dāng)減少T1,T2間隔,縮小Ⅳ。當(dāng)T1*N*T2時,步進(jìn)式增量計(jì)算,每次計(jì)算的數(shù)據(jù)都是新鮮數(shù)據(jù)。具體如圖2所示。
以上內(nèi)容也可以采用通用的開源解決方案(如Zabbix,Prometheus等)實(shí)現(xiàn)。
除了直接計(jì)算,對于時效性有一定容忍度的指標(biāo),如數(shù)據(jù)庫表空間、業(yè)務(wù)序號、當(dāng)日累計(jì)交易量等,可引入趨勢預(yù)測算法來計(jì)算,以獲得更好的監(jiān)控表現(xiàn),進(jìn)而提前發(fā)現(xiàn)異常,及日寸介入處置。
聯(lián)機(jī)系統(tǒng)監(jiān)控往往和業(yè)務(wù)模式有很大關(guān)系,參與交易的角色和渠道等因素都屬于監(jiān)控的范圍,因業(yè)務(wù)需要可設(shè)計(jì)多維度靈活可配置的監(jiān)控模型來支持。通??梢允褂靡韵?種方案。
2.2.1預(yù)置模型的設(shè)計(jì)和實(shí)現(xiàn)
對于每筆交易,根據(jù)交易要素拆分成多個KV鍵值對,交易的成功失敗結(jié)果也保存到每個KV鍵值對。用戶根據(jù)實(shí)際需要,在管理頁面端配置需要監(jiān)控的交易角色、渠道等交易因素(維度),監(jiān)控程序按照配置統(tǒng)計(jì)這些因素組成的維度的交易量、成功率等。
比如,配置A,B,C,D四個維度作為監(jiān)控項(xiàng),監(jiān)控程序?qū)γ抗P交易的A,B,C,D四個維度都進(jìn)行統(tǒng)計(jì),形成統(tǒng)計(jì)結(jié)果KV鍵值對,Key可以設(shè)置為A,B,C,D,根據(jù)不同取值統(tǒng)計(jì)匯總,并按照一定的時間周期判斷是否超閾值,進(jìn)而產(chǎn)生告警。設(shè)計(jì)維度配置時,按照一定的邏輯順序組合,四因素的Key值緩存在內(nèi)存中,以快速匹配,進(jìn)而提升計(jì)算效率。具體如圖3所示。
2.2.2動態(tài)計(jì)算模型的設(shè)計(jì)和實(shí)現(xiàn)
相較于預(yù)置模型,動態(tài)計(jì)算就更復(fù)雜。對交易做降維處理,減少計(jì)算量。對于N維的交易來講,全維度動態(tài)計(jì)算是海量的,也帶來一些沒有價值的估算。降維計(jì)算有助于減少干擾,聚焦在有意義的數(shù)據(jù)上。具體流程如下。
(1)計(jì)算Ⅳ維中所有一維數(shù)據(jù)的指標(biāo)(TPS、成功率、響應(yīng)時間、交易量)。
(2)從中尋找指標(biāo)最差的維度Dx。
(3)以維度Dx為基點(diǎn),統(tǒng)計(jì)其他參與交易的角色指標(biāo),并找出可疑組合。
(4)列出組合供用戶選擇。
(5)告警收斂。
往往一個異常會產(chǎn)生多個報警,這時需要借助一些收斂算法壓縮告警量,以減少干擾,快速定位問題。基于CMDB的關(guān)聯(lián)關(guān)系,將同一個CI的告警歸集到一個主要告警上,同時將與之關(guān)聯(lián)的上游CI告警進(jìn)行關(guān)聯(lián),以“組告警”的方式呈現(xiàn)給用戶。在IT基礎(chǔ)設(shè)施發(fā)生故障時,這種收斂算法能起到很好的效果。以某臺物理機(jī)故障為例,監(jiān)控系統(tǒng)產(chǎn)生諸多告警:硬件管理平臺監(jiān)測到硬件故障產(chǎn)生的告警、連通性監(jiān)測發(fā)現(xiàn)物理服務(wù)器不可達(dá)告警、虛擬化平臺或者容器管理平臺發(fā)現(xiàn)虛擬機(jī)宕機(jī)或者容器下線的告警、分布式系統(tǒng)自身的服務(wù)調(diào)用發(fā)現(xiàn)某服務(wù)不可用的告警、交易監(jiān)控系統(tǒng)發(fā)現(xiàn)瞬時的交易成功率下降后者交易響應(yīng)時間變長的告警。這些告警都和物理機(jī)異常相關(guān)。告警收斂算法設(shè)定一定的時間(因分布式系統(tǒng)對基礎(chǔ)設(shè)施異常的敏感度不同,通過測試可以得出這個值),如3分鐘內(nèi),那么相關(guān)的告警都可以收斂到此物理服務(wù)器宕機(jī)的告警上,前提是在CMDB中建立相關(guān)的關(guān)系,即物理機(jī)與虛擬化服務(wù)器的關(guān)系、物理機(jī)與容器的關(guān)系、容器與邏輯服務(wù)的關(guān)系、交易和邏輯服務(wù)的關(guān)系(通過鏈路日志關(guān)聯(lián))[1]。
經(jīng)過測算,此類收斂模型的有效率可達(dá)50%以上,大大降低了對信息的干擾,并可在可視化圖表上直接顯示異常點(diǎn)。
在Tracing日志中根據(jù)Tracingid形成鏈路,相同鏈路產(chǎn)生的告警也可以歸集到一起,并結(jié)合CMDB關(guān)聯(lián)到CI上,以收斂到較小的范圍。
3可視化能力建設(shè)
從分布式系統(tǒng)采集的運(yùn)行數(shù)據(jù),經(jīng)過采集匯聚和異常監(jiān)測計(jì)算,得到了分布式系統(tǒng)的運(yùn)行狀態(tài)數(shù)據(jù)以及可能的異常點(diǎn),通過系統(tǒng)整合和集成,建立分層次、縱向關(guān)聯(lián)的多視角觀測平臺,集中展示分布式系統(tǒng)的運(yùn)行信息,從多個維度建立可視化展示配置視圖、關(guān)注性能的指標(biāo)視圖、排查分析的日志視圖以及鏈路視圖等。具體如圖4所示。
配置視圖。用于展示分布式系統(tǒng)的配置數(shù)據(jù)及關(guān)聯(lián)關(guān)系,包括服務(wù)器與操作系統(tǒng)配置、應(yīng)用與容器、分布式數(shù)據(jù)庫以及其他組件等。
指標(biāo)視圖。用于展示分布式系統(tǒng)的應(yīng)用及依賴服務(wù)/組件的指標(biāo)類數(shù)據(jù),指標(biāo)視圖提供固定格式的數(shù)據(jù),通過定制儀表盤方式實(shí)現(xiàn)個性化changing展示。
日志視圖和鏈路視圖。用于展示分布式系統(tǒng)的文本日志,包括系統(tǒng)日志、應(yīng)用日志、數(shù)據(jù)庫日志,以及相關(guān)的服務(wù)與組件的文本日志,提供常規(guī)的基于時間、節(jié)點(diǎn)、文件名、關(guān)鍵字等條件的搜索功能,并提供基于spl語法的高級查詢功能。通過日志時間,所屬的文件、進(jìn)程、容器等與鏈路日志進(jìn)行關(guān)聯(lián),以查詢tracelD的單筆鏈路數(shù)據(jù)、指定時間和節(jié)點(diǎn)范圍的鏈路數(shù)據(jù)清單[2]。
3.1全局健康視圖
將分布式系統(tǒng)的SLA設(shè)定核心監(jiān)控指標(biāo)作為全局健康視圖的主要展示數(shù)據(jù),健康視圖簡明扼要地顯示系統(tǒng)的狀態(tài),其具有高度的概括性,如全局交易成功率、資源可用率、全局交易響應(yīng)時間等,若指標(biāo)出現(xiàn)異常,則標(biāo)記為紅色,并結(jié)合其他的視圖進(jìn)行下鉆分析,找到引發(fā)異常的根源。
可建立“應(yīng)用全局性能指標(biāo)”,以應(yīng)用為中心,將Tracing,Metric,Log多維數(shù)據(jù)進(jìn)行融合,從而基于業(yè)務(wù)視角,統(tǒng)一性能評價標(biāo)準(zhǔn),主動發(fā)現(xiàn)性能瓶頸、快速感知故障、高效故障恢復(fù),保障應(yīng)用系統(tǒng)連續(xù)穩(wěn)定。
3.2部署架構(gòu)視圖
綜合性視圖,將IT基礎(chǔ)設(shè)施到分布式系統(tǒng)的各個組件進(jìn)行全面展示。構(gòu)建此視圖時,可以自底向上展示網(wǎng)絡(luò)、服務(wù)器、容器、邏輯服務(wù)、交易的數(shù)據(jù),每個節(jié)點(diǎn)可顯示更為詳細(xì)的具體運(yùn)行數(shù)據(jù)。當(dāng)出現(xiàn)故障時,部署架構(gòu)視圖以紅、橙、黃等顏色進(jìn)行警示,打開故障點(diǎn)后即可進(jìn)入故障排查視圖。
3.3故障排查視圖
直接顯示故障內(nèi)容,一般是告警或者收斂后的組合告警,視圖展示關(guān)聯(lián)該故障節(jié)點(diǎn)的交易運(yùn)行情況和IT基礎(chǔ)設(shè)施的情況,以及鏈路視圖等,可根據(jù)展示的內(nèi)容和故障染色等進(jìn)一步打開故障點(diǎn)以分析故障。
分布式系統(tǒng)可觀測性建設(shè)是一項(xiàng)系統(tǒng)性、綜合性工程,其核心在于采集和匯聚計(jì)算上,利用成熟的異常監(jiān)測算法可以定位到一些故障點(diǎn),結(jié)合分布式系統(tǒng)建模以及告警收斂算法,將異常點(diǎn)與應(yīng)用、IT基礎(chǔ)設(shè)施的運(yùn)行日志關(guān)聯(lián)起來.可有效幫助開發(fā)和運(yùn)維人員全面掌握生產(chǎn)運(yùn)行信息,快速定位故障和解決問題,從而確保分布式系統(tǒng)高效穩(wěn)定運(yùn)行。