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