熊游泳 庾玲
摘要:目前湖南電信的部分業(yè)務(wù)系統(tǒng)是部署在各種分布式集群之上。一個業(yè)務(wù)請求有可能由多個服務(wù)節(jié)點(diǎn)配合完成,在這個業(yè)務(wù)調(diào)用鏈里,任意一個處理環(huán)節(jié)出現(xiàn)了問題,都會導(dǎo)致導(dǎo)致業(yè)務(wù)使用異常。湖南電信基于業(yè)界主流的業(yè)務(wù)調(diào)用鏈監(jiān)控技術(shù),完成了對計費(fèi),自動開通系統(tǒng)的關(guān)鍵業(yè)務(wù)流程的實(shí)時監(jiān)控,使IT運(yùn)營人員能及時準(zhǔn)確獲取業(yè)務(wù)流程全景信息,實(shí)現(xiàn)主動運(yùn)維,大幅提升了IT運(yùn)營水平。
關(guān)鍵詞:業(yè)務(wù)調(diào)用鏈;Java Instrumentation;分布式跟蹤
中圖分類號:TP391? ? ? ? 文獻(xiàn)標(biāo)識碼:A
文章編號:1009-3044(2020)32-0065-03
1 概述
湖南電信在2017年使用“平臺”加“應(yīng)用”的技術(shù)架構(gòu),按照“能力與界面分離”“數(shù)據(jù)與應(yīng)用分離”“能力可編排”“應(yīng)用水平彈性可擴(kuò)展的原則”,建設(shè)智慧運(yùn)營BSS系統(tǒng)。并根據(jù)“高內(nèi)聚,低耦合”原則,將原BSS系統(tǒng)拆分成18個能力服務(wù)中心。各服務(wù)中心通過能力開放平臺進(jìn)行跨中心能力調(diào)用。在新的技術(shù)架構(gòu)下,一個業(yè)務(wù)請求有可能由多個服務(wù)節(jié)點(diǎn)配合完成,在這個業(yè)務(wù)調(diào)用鏈里,任意一個處理環(huán)節(jié)出現(xiàn)了問題,都會導(dǎo)致業(yè)務(wù)使用異常。在業(yè)務(wù)異常發(fā)生前,如何迅速判定隱患并迅速解決,在業(yè)務(wù)異常發(fā)生時,如何迅速準(zhǔn)確地判斷故障點(diǎn),分析故障原因,成為湖南電信在IT運(yùn)營中亟待解決的問題。
湖南電信自2019年開始,積極學(xué)習(xí)探索業(yè)界主流的業(yè)務(wù)調(diào)用鏈監(jiān)控技術(shù),完成了對計費(fèi),自動開通及激活系統(tǒng)的停復(fù)機(jī)這個對客戶感知有重大影響的關(guān)鍵業(yè)務(wù)流程的實(shí)時監(jiān)控,使IT運(yùn)營人員能及時準(zhǔn)確地獲取停復(fù)機(jī)業(yè)務(wù)流程全景信息,實(shí)現(xiàn)被動運(yùn)維向主動運(yùn)維轉(zhuǎn)變,不但提升了IT運(yùn)營水平,而且改善了用戶感知。
2 分布式跟蹤概念的提出
Google在2010年發(fā)表了一篇名為“Dapper, a Large-Scale Distributed Systems Tracing Infrastructure”的論文,介紹了分布式跟蹤系統(tǒng)的設(shè)計和使用經(jīng)驗(yàn)。當(dāng)前業(yè)界主流的分布式跟蹤系統(tǒng),如Hydra(京東)、鷹眼Tracing(阿里)基本都是基于Google的這篇論文而開發(fā)的。
這些互聯(lián)網(wǎng)公司為了支撐不斷劇增的業(yè)務(wù)量,一般按照“高內(nèi)聚,低耦合”的原則拆分各類服務(wù),并通過大規(guī)模分布式集群部署。由于每一次的業(yè)務(wù)請求,均要跨越多個不同的服務(wù)節(jié)點(diǎn)經(jīng)過多次的服務(wù)調(diào)用來完成,所以通過服務(wù)跟蹤系統(tǒng)實(shí)時呈現(xiàn)服務(wù)復(fù)雜的調(diào)用鏈路,分析調(diào)優(yōu)鏈路性能,迅速發(fā)現(xiàn)診斷處理調(diào)用鏈路故障,就顯得尤為重要。
3 分布式跟蹤系統(tǒng)的設(shè)計目標(biāo)
分布式跟蹤系統(tǒng)的目的是為了將分布式系統(tǒng)中復(fù)雜的調(diào)用及運(yùn)行信息提供給開發(fā)和運(yùn)營人員。通常一個 web 查詢不僅會被分發(fā)給多個服務(wù)器,在每一臺服務(wù)器上完成各自的搜索工作之外,同時可能還會被發(fā)送給其他子系統(tǒng),進(jìn)行圖片查找和拼寫檢查等處理。處理一次搜索查詢,可能需要數(shù)十乃至上百臺機(jī)器,涉及多種服務(wù),其中任意一個部分發(fā)生性能問題都可能導(dǎo)致查詢超時甚至失敗。如果IT運(yùn)營人員單單只監(jiān)控查詢總耗時這一個指標(biāo)的話,往往會只知道出問題了,但是無法知道具體是哪個系統(tǒng)或哪個服務(wù)出問題以及為什么出問題。首先,IT運(yùn)營人員并不知道到底調(diào)用了哪些服務(wù);其次,可能不同的服務(wù)由不同的人員甚至不同的公司開發(fā)的,IT運(yùn)營甚至開發(fā)人員都無法了解每個服務(wù)的具體實(shí)現(xiàn)。
上面描述的場景就對分布式跟蹤系統(tǒng)提出了兩條最基本的要求:大范圍部署和持續(xù)的監(jiān)控。根據(jù)這些基本要求提出了四個具體的設(shè)計目標(biāo):
低消耗,高穩(wěn)定:只有較小的應(yīng)用性能影響 ,避免應(yīng)用開發(fā)人員抵觸;
低侵入:基本對應(yīng)用透明;
可擴(kuò)展性:能根據(jù)所監(jiān)控的系統(tǒng)數(shù)目的不斷增長,而動態(tài)擴(kuò)展;
快速分析:最好是在幾分鐘內(nèi)完成分析,讓IT運(yùn)營人員能迅速對性能異常做出反應(yīng)。
4 分布式跟蹤系統(tǒng)的關(guān)鍵技術(shù)
發(fā)生一次業(yè)務(wù)請求后,分布式服務(wù)跟蹤系統(tǒng)應(yīng)該記錄其所有調(diào)用的數(shù)據(jù)。圖1展現(xiàn)了一個包含 5 臺服務(wù)器的查詢服務(wù):
1)服務(wù)器 A(接受用戶請求的前端服務(wù)器);
2)服務(wù)器B和C(中間層服務(wù)器);
3)服務(wù)器D和E(后端服務(wù)器)。
前端服務(wù)器 A 接收到用戶發(fā)起的請求RequestX之后,會發(fā)送rpc1調(diào)用B,發(fā)送rpc2調(diào)用C。B執(zhí)行完畢后會立即返回結(jié)果, C會發(fā)送rpc3和rpc4 分別調(diào)用到后端服務(wù)器 D 和 E,并在接受DE的結(jié)果后,返回結(jié)果給 A,A 再回復(fù)用戶請求的結(jié)果。
如上圖所示,在分布式跟蹤系統(tǒng)中,能夠采用一顆RPC跟蹤樹的形式來展現(xiàn)業(yè)務(wù)調(diào)用關(guān)系。
4.1 跟蹤樹與span
span是RPC跟蹤樹中的節(jié)點(diǎn)。連接span的箭線表示span的父子關(guān)系。span中記載了span 的開始和結(jié)束時間、RPC 時間數(shù)據(jù)。圖2 描繪了跟蹤樹中5個span 之間的因果調(diào)用關(guān)系。
span 中都記載了一個可讀的span name、span id和 parent id,這樣就能重新構(gòu)建出分布式跟蹤過程中span的調(diào)用關(guān)系。沒有parent id 的 span被稱為 根span。一次特定跟蹤的所有相關(guān) span 會共享同一個通用的trace id 。
圖3 標(biāo)示了span id =5的那次 Helper.Call RPC的調(diào)用。RPC 庫中記錄下了 RPC 的計時數(shù)據(jù),span 的開始和結(jié)束時間。
每一次用戶請求, 跟蹤系統(tǒng)都生成唯一的TraceId,TraceId 在span間傳遞,將不同服務(wù)的日志重組還原出一個完整的調(diào)用鏈。 此外對于不同業(yè)務(wù)應(yīng)用可能還需要有特殊的信息記錄到日志中,所以調(diào)用鏈日志信息(Span)應(yīng)包含如下內(nèi)容。
4.2 Java Instrumentation
Java SE 5 引入了Instrumentation 功能,該功能使開發(fā)者可以創(chuàng)建一個相對獨(dú)立的agent,用來監(jiān)控和管理運(yùn)行在 JVM 上的程序,甚至可以更改應(yīng)用程序的Java class,從而使開發(fā)人員能夠?qū)崿F(xiàn)某些 AOP 的功能。Java SE 6之前,Instrument 需要在程序運(yùn)行前通過修改參數(shù)來設(shè)置代理類,JVM在初始化之時(在絕大多數(shù)的 Java 類庫被載入之前),instrumentation 的設(shè)置已經(jīng)啟動,并在JVM中設(shè)置了回調(diào)函數(shù),檢測特定類的加載情況,從而完成相應(yīng)的處理。在Java SE 6中,能夠在程序啟動后的運(yùn)行過程中動態(tài)地加載代理類,進(jìn)一步擴(kuò)展了instrumentation 的使用場景。
由于湖南電信幾乎所有的業(yè)務(wù)系統(tǒng)都是用Java開發(fā)的,因此在分布式跟蹤系統(tǒng)的開發(fā)過程中使用了Java Instrumentation特性,實(shí)現(xiàn)對現(xiàn)有業(yè)務(wù)系統(tǒng)低侵入以及對應(yīng)用透明的跟蹤及監(jiān)控。
5 “鷹眼”業(yè)務(wù)調(diào)用鏈監(jiān)控系統(tǒng)在湖南電信的應(yīng)用
湖南電信基于分布式跟蹤技術(shù)的業(yè)務(wù)調(diào)用鏈監(jiān)控系統(tǒng)叫“鷹眼”, 由采集端,實(shí)時分析端與數(shù)據(jù)提取轉(zhuǎn)換展示端三個大的部分組成。其中采集端通過JVM的基礎(chǔ)運(yùn)行機(jī)制,對業(yè)務(wù)數(shù)據(jù)進(jìn)行實(shí)時提取;實(shí)時分析端通過對采集而來的業(yè)務(wù)執(zhí)行數(shù)據(jù)流進(jìn)行流式分析,并依格式存儲業(yè)務(wù)分析后的數(shù)據(jù),調(diào)用鏈數(shù)據(jù)等;通過展示樹狀態(tài)調(diào)用鏈的信息,提供關(guān)鍵信息快速定位能力。僅需業(yè)務(wù)應(yīng)用人員提供對應(yīng)的代碼包結(jié)構(gòu),共同分析哪些包哪些類需要織入調(diào)用鏈中,輸出內(nèi)容為是系統(tǒng)及業(yè)務(wù)調(diào)用鏈工具的配置信息,對業(yè)務(wù)代碼本身不產(chǎn)生任何影響與入侵。系統(tǒng)總體部署架構(gòu)如圖5所示。
“鷹眼”利用了Java Instrumentation功能,在業(yè)務(wù)代碼運(yùn)行加載的階段,向業(yè)務(wù)源代碼編譯后的字節(jié)碼中注入鷹眼的業(yè)務(wù)邏輯,并輸出要監(jiān)控的業(yè)務(wù)數(shù)據(jù)或?qū)I(yè)務(wù)邏輯進(jìn)行增強(qiáng),其本質(zhì)就是變更業(yè)務(wù)代碼。其實(shí)現(xiàn)方式如圖6所示。
湖南電信”鷹眼”系統(tǒng)初期主要實(shí)現(xiàn)了對用戶感知影響巨大的停復(fù)機(jī)業(yè)務(wù)流程的業(yè)務(wù)調(diào)用鏈監(jiān)控。
停復(fù)機(jī)業(yè)務(wù)流程由計費(fèi)中心發(fā)起,計費(fèi)中心通過用戶的繳費(fèi)與扣費(fèi)動作,判斷是否需要觸發(fā)停機(jī),復(fù)機(jī)流程。滿足條件的用戶。計費(fèi)中心創(chuàng)建停復(fù)機(jī)工單、并插入到激活系統(tǒng)的工單接口表里,激活系統(tǒng)接收到計費(fèi)中心發(fā)送的工單后,根據(jù)工單業(yè)務(wù)類型、用戶信息,生成需要與網(wǎng)元系統(tǒng)交互的工單信息(子單),待網(wǎng)元系統(tǒng)子單都處理完畢后,停復(fù)機(jī)流程結(jié)束。停復(fù)機(jī)業(yè)務(wù)流程及業(yè)務(wù)監(jiān)控數(shù)據(jù)如圖7所示。
”鷹眼”系統(tǒng)第一次使我們實(shí)時準(zhǔn)確地掌握了停復(fù)機(jī)流程中每一個環(huán)節(jié)的業(yè)務(wù)運(yùn)行數(shù)據(jù),在停復(fù)機(jī)發(fā)生故障時能迅速準(zhǔn)確地判斷定位故障環(huán)節(jié),進(jìn)行故障處理,大幅度減少了故障處理時間。同時,通過對各環(huán)節(jié)積壓量進(jìn)行監(jiān)控,在異常時進(jìn)行及時告警,在影響用戶感知前及時處理解決,也大幅提升了用戶感知。
6 結(jié)論
為了滿足湖南電信新的分布式技術(shù)架構(gòu)下業(yè)務(wù)系統(tǒng)更精確更細(xì)粒度的監(jiān)控的需要,不斷提升IT運(yùn)營水平,我們積極探索與借鑒業(yè)界主流的基于分布式跟蹤的業(yè)務(wù)調(diào)用鏈監(jiān)控技術(shù),初步建成了“鷹眼”業(yè)務(wù)調(diào)用鏈監(jiān)控系統(tǒng),實(shí)現(xiàn)了對停復(fù)機(jī)關(guān)鍵業(yè)務(wù)流程的各環(huán)節(jié)的實(shí)時業(yè)務(wù)數(shù)據(jù)監(jiān)控。 使IT運(yùn)營人員及開發(fā)人員第一次及時準(zhǔn)確地獲取了業(yè)務(wù)流程全景信息,對于實(shí)現(xiàn)主動運(yùn)維、加速故障處理、改善用戶感知有著非常重大的作用和意義。
參考文獻(xiàn):
[1] Google. Dapper, a Large-Scale Distributed Systems Tracing Infrastructure.
【通聯(lián)編輯:王力】