分布式鏈路追蹤

前言

傳統(tǒng)的單體服務(wù)通過日志和性能監(jiān)控為我們的系統(tǒng)提供了良好的觀測手段熄阻,隨著服務(wù)之間的交互越來越多斋竞,越來越復(fù)雜,這種“各自為政”的策略將使我們看不到整體的關(guān)聯(lián)性秃殉。為了提高系統(tǒng)的可見性觀察坝初,分布式鏈路追蹤被提了出來,并迅速發(fā)展钾军。

背景

分布式體系的構(gòu)建是以“拆”為核心鳄袍,其目標(biāo)是職責(zé)分明、高度自治吏恭。不同的模塊甚至?xí)刹煌膱F(tuán)隊負(fù)責(zé)拗小,用不同的語言編寫。當(dāng)我們想要組合這些服務(wù)砸泛,對外提供統(tǒng)一功能時十籍,我們還需要考慮它的一個可觀察性。比如唇礁,請求里的服務(wù)依賴有哪些勾栗,各個節(jié)點(diǎn)的耗時是怎么樣的,瓶頸在哪里等盏筐。

像這種涉及上下文請求围俘、端到端的流向監(jiān)控便是分布式鏈路追蹤了。當(dāng)我們的系統(tǒng)出現(xiàn)瓶頸或者故障時,就能根據(jù)收集到的信息快速定位問題界牡、解決問題簿寂。這也是它的價值所在。

不過宿亡,在面對一個復(fù)雜的系統(tǒng)時常遂,分布式鏈路追蹤考慮的點(diǎn)就有很多了,主要有以下幾點(diǎn):

  • 透明性:各個模塊可能是由不同語言編寫挽荠,我們需要考慮接入成本克胳,最好是無需改動什么,便可以完成接入圈匆。
  • 可靠性:上下文的數(shù)據(jù)收集是 24 小時持續(xù)進(jìn)行的漠另,分布式鏈路追蹤需要考慮穩(wěn)定性及規(guī)模拓展。
  • 獨(dú)立性:監(jiān)控是輔助行為跃赚,即使鏈路追蹤繁忙或失敗笆搓,也不當(dāng)影響業(yè)務(wù)的運(yùn)行。

當(dāng)然纬傲,最核心的設(shè)計還是在于如何將各個節(jié)點(diǎn)的統(tǒng)計信息串聯(lián)起來满败,并進(jìn)行分析展示。

解決方案

從大的層面來講嘹锁,分布式追蹤其實(shí)跟日志收集優(yōu)點(diǎn)類似葫录。比如需要在每個節(jié)點(diǎn)記錄性能數(shù)據(jù),然后由專門的收集組件將數(shù)據(jù)發(fā)送到核心組件领猾。核心組件將數(shù)據(jù)進(jìn)行存儲并進(jìn)行一個關(guān)聯(lián)關(guān)系的添加米同,畢竟一條完整的鏈路數(shù)據(jù)是來源于各個服務(wù)的。當(dāng)數(shù)據(jù)分析完后摔竿,我們就可以在 Dashboard 里搜索結(jié)果了面粮。

像現(xiàn)在主流的分布式鏈路追蹤產(chǎn)品:Jaeger 就是這么設(shè)計的。不過继低,Jaeger 也是受 Google 的 Dapper 啟發(fā)設(shè)計的熬苍。Dapper 是最早的跟分布式鏈路有關(guān)的實(shí)施產(chǎn)品,并有一篇論文: Dapper, a Large-Scale Distributed Systems Tracing Infrastructure 袁翁,算是分布式鏈路追蹤系統(tǒng)的鼻祖了柴底,有興趣的小伙伴們可以自行搜索查看。

當(dāng)分布式鏈路的產(chǎn)品越來越多時粱胜,統(tǒng)一標(biāo)準(zhǔn)便成了很多人的心聲柄驻,畢竟兼容處理也是很麻煩的。后面 CNCF(云原生計算基金會)推出了 OpenTracing 項目焙压。OpenTracing 是與平臺廠商無關(guān)的鏈路解決方案鸿脓。它并不提供具體的實(shí)現(xiàn)代碼抑钟,僅僅只是制定規(guī)范,讓接入它的人能有個一致的協(xié)議野哭。

當(dāng)前根據(jù)這個標(biāo)準(zhǔn)實(shí)現(xiàn)的產(chǎn)品比較多在塔,像剛剛提及的 Jaeger,還有 Apache 的 Skywalking 等拨黔。今天我們來詳細(xì)看下 OpenTracing 的總體設(shè)計蛔溃,以及它的實(shí)現(xiàn)產(chǎn)品:Jaeger∪鼐裕或許以后我們也可以根據(jù) OpenTracing 標(biāo)準(zhǔn)來實(shí)現(xiàn)一款屬于自己的分布式鏈路追蹤產(chǎn)品城榛。

概念

Trace & Span

在廣義上來講揪利,我們將某一次請求的完整鏈路抽象成了 Trace 概念态兴。一個 Trace 就代表了一次流程的執(zhí)行過程。它實(shí)際上就是一個有向無環(huán)圖:

[圖片上傳失敗...(image-911300-1649041240605)]

為了能清晰的描述鏈路里的上下文請求疟位,我們將這些關(guān)鍵路徑抽象為了一個個的 Span瞻润,每個 Span 是一個基本單元,具有操作名稱甜刻、操作的開始绍撞、持續(xù)時間。通過各個 Span 的嵌套和排序得院,我們就可以建立起因果關(guān)系模型了傻铣。

[圖片上傳失敗...(image-e372f6-1649041240605)]

這種模型能讓我們更好的理解服務(wù)的層次關(guān)系、執(zhí)行的上下文時間等祥绞,有助于我們快速的發(fā)現(xiàn)系統(tǒng)的調(diào)用情況非洲。

[圖片上傳失敗...(image-66eda2-1649041240605)]

其中,Span 除了上面的基本屬性蜕径,還擁有其他關(guān)聯(lián)的特性字段:

  • Span Tag两踏,Span 標(biāo)簽集合。
  • Span Log兜喻,屬于一組 Span 的日志集合
  • SpanContext:Span 上下文對象梦染,用來描述與其他 Span 的關(guān)系,有 ChildOf(父子) 和 FollowsFrom(跟隨)朴皆。SpanContext 的信息添加和獲取分別是通過 Injected 和 Extracted 某個 Carrier (載體)來實(shí)現(xiàn)的帕识。

功能模塊

當(dāng)數(shù)據(jù)模型出來后,我們就可以定義接口了遂铡。當(dāng)然肮疗,由于 OpenTracing 并不負(fù)責(zé)具體的實(shí)現(xiàn),所以這里的接口更多是一種功能模塊的描述忧便,然后通過類似偽代碼的形式來公開族吻。此處并不具體描述這些接口的傳參帽借、返回格式,主要來看看有哪些功能模塊超歌。

首先是跨進(jìn)程的邊界信息傳遞砍艾。在這里,我們會涉及到 Span 的創(chuàng)建巍举,SpanContext 的 carrier(載體)注入(Inject)脆荷,以及從 carrier(載體)的提取(Extract)懊悯。關(guān)于邊界的信息傳遞蜓谋,我們可以通過埋點(diǎn)來統(tǒng)一處理,比如 Request 和 Response 的攔截器機(jī)制炭分。

接著是 Span 生命周期的管理桃焕,上面創(chuàng)建出 Span 后,我們就需要有一個明確的完成時間來結(jié)束 Span捧毛。當(dāng)然观堂,如果 Span 需要有什么特性標(biāo)注,那么我們也可以在這個功能模塊里實(shí)現(xiàn)呀忧,比如 Span 的 Tag 設(shè)置师痕。

最后是 SpanContext,由于 SpanContext 關(guān)聯(lián)了上下文而账,所以它比較關(guān)鍵胰坟,在 OpenTracing 里它更多的是一個概念,具體需要哪些功能可以由開發(fā)者自己實(shí)現(xiàn)一套泞辐。只要包含了上面的 Inject(注入)和 Extract(提缺屎帷)即可。

Jaeger

上面的標(biāo)準(zhǔn)為我們定義了功能模塊及模型接口铛碑。那么我們圍繞這些結(jié)構(gòu)和 API 也就能實(shí)現(xiàn)具體的產(chǎn)品了狠裹。Uber 出品的 Jaeger 就是其中的一個。它主要實(shí)現(xiàn)了 OpenTracing 并提供以下功能:

  • 分布式上下文傳播
  • 分布式事務(wù)監(jiān)控
  • 結(jié)構(gòu)化的根本原因分析
  • 服務(wù)依賴關(guān)系分析
  • 性能分析汽烦、延遲分析

在進(jìn)行具體實(shí)現(xiàn)的時候涛菠,Jaeger 為了能提供更好的拓展性,進(jìn)行了組件的拆分撇吞,每個組件都支持單獨(dú)部署俗冻,這也符合了微服務(wù)的設(shè)計理念。主要的組件如下:

  • jaeger-client:Jaeger 客戶端牍颈,根據(jù) OpenTracing 的標(biāo)準(zhǔn)實(shí)現(xiàn)了對應(yīng)的 API迄薄。例如當(dāng)發(fā)生 RPC 等跨服務(wù)調(diào)用時,此時會觸發(fā) client 的 span 創(chuàng)建煮岁,并確定好 SpanContext 關(guān)系讥蔽。
  • jaeger-agent:本地存儲 client 的 Span 信息涣易,隨后會將數(shù)據(jù)批量的上傳到 Jaeger Collector。
  • jaeger-collector:存儲 agent 傳來的數(shù)據(jù)冶伞,會為其建立索引并轉(zhuǎn)換新症。
  • jaeger-query:jaeger 的 dashboard 數(shù)據(jù)展示。

它的總體架構(gòu)圖如下:
[圖片上傳失敗...(image-3cc8fd-1649041240605)]

最終响禽,我們將看到如下的查詢 UI:

[圖片上傳失敗...(image-1358fa-1649041240605)]

[圖片上傳失敗...(image-dfc027-1649041240605)]

可以看到徒爹,服務(wù)依賴、耗時分析等 Jaeger 都幫我們通過 web UI 呈現(xiàn)出來了芋类!

總結(jié)

本文主要介紹了分布式鏈路追蹤的標(biāo)準(zhǔn)規(guī)范:OpenTracing 以及它的實(shí)現(xiàn):Jaeger隆嗅。事實(shí)證明,在越復(fù)雜的系統(tǒng)里侯繁,我們越要盡可能的利用這些出色的組件胖喳,對其監(jiān)控起來。只有提高系統(tǒng)的可見性巫击,我們才不至于在問題出現(xiàn)的時候手忙腳亂禀晓。

參考


感興趣的朋友可以搜一搜公眾號「 閱新技術(shù) 」,關(guān)注更多的推送文章坝锰。
可以的話,就順便點(diǎn)個贊重付、留個言顷级、分享下,感謝各位支持确垫!
閱新技術(shù)弓颈,閱讀更多的新知識。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末删掀,一起剝皮案震驚了整個濱河市翔冀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌披泪,老刑警劉巖纤子,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異款票,居然都是意外死亡控硼,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門艾少,熙熙樓的掌柜王于貴愁眉苦臉地迎上來卡乾,“玉大人,你說我怎么就攤上這事缚够♂7粒” “怎么了鹦赎?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長误堡。 經(jīng)常有香客問我钙姊,道長,這世上最難降的妖魔是什么埂伦? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任煞额,我火速辦了婚禮,結(jié)果婚禮上沾谜,老公的妹妹穿的比我還像新娘膊毁。我一直安慰自己,他們只是感情好基跑,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布婚温。 她就那樣靜靜地躺著,像睡著了一般媳否。 火紅的嫁衣襯著肌膚如雪栅螟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天篱竭,我揣著相機(jī)與錄音力图,去河邊找鬼。 笑死掺逼,一個胖子當(dāng)著我的面吹牛吃媒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吕喘,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼赘那,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了氯质?” 一聲冷哼從身側(cè)響起募舟,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎闻察,沒想到半個月后拱礁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蜓陌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年觅彰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钮热。...
    茶點(diǎn)故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡填抬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出隧期,到底是詐尸還是另有隱情飒责,我是刑警寧澤赘娄,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站宏蛉,受9級特大地震影響遣臼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜拾并,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一揍堰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧嗅义,春花似錦屏歹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至褪那,卻和暖如春幽纷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背博敬。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工友浸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人冶忱。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓尾菇,卻偏偏與公主長得像,于是被迫代替她去往敵國和親囚枪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容