分布式系統(tǒng)架構(gòu)6:鏈路追蹤

這是小卷對(duì)分布式系統(tǒng)架構(gòu)學(xué)習(xí)的第6篇文章始花,關(guān)于鏈路追蹤,之前寫(xiě)過(guò)traceId的相關(guān)內(nèi)容:https://juejin.cn/post/7135611432808218661恰力,不過(guò)之前寫(xiě)的太淺了鄙漏,且不成系統(tǒng)恃轩,只是簡(jiǎn)單的理解脆侮,今天來(lái)捋一下鏈路追蹤的理論

1.為什么需要鏈路追蹤

在復(fù)雜的分布式系統(tǒng)中,系統(tǒng)通常由多個(gè)獨(dú)立的服務(wù)組成泌辫,幾乎每一個(gè)前端請(qǐng)求都會(huì)形成一個(gè)復(fù)雜的分布式服務(wù)調(diào)用鏈路随夸。

鏈路追蹤1.png

這種復(fù)雜的系統(tǒng)會(huì)帶來(lái)一系列問(wèn)題:

1.如何快速定位問(wèn)題,判斷故障影響范圍震放?

2.如何梳理服務(wù)間的依賴關(guān)系宾毒?

鏈路追蹤的用途就是為了知道請(qǐng)求在系統(tǒng)中的流轉(zhuǎn)路徑,定位性能瓶頸殿遂,診斷故障等诈铛。

2.追蹤與跨度

要理解鏈路追蹤的原理乙各,先理解Trace追蹤 和 Span跨度兩個(gè)概念。

  • Trace(追蹤):一個(gè)完整的用戶請(qǐng)求流程幢竹,從用戶發(fā)起請(qǐng)求開(kāi)始耳峦,到請(qǐng)求結(jié)束。一個(gè)追蹤包含多個(gè) Span妨退。
  • Span(跨度):一種表示工作單元的結(jié)構(gòu),通常對(duì)應(yīng)著請(qǐng)求經(jīng)過(guò)的某個(gè)服務(wù)或者操作蜕企,每個(gè)Span包含以下信息:
    • Span ID:唯一標(biāo)識(shí)當(dāng)前Span
    • Trace ID:標(biāo)識(shí)屬于同一個(gè)Trace的所有Span
    • 父Span ID:如果當(dāng)前Span由另一個(gè)Span引發(fā)咬荷,則會(huì)記錄父Span ID
    • 時(shí)間戳、標(biāo)簽和日志

每一次Trace是由若干個(gè)有順序轻掩、有層級(jí)關(guān)系的Span組成的一棵追蹤樹(shù)結(jié)構(gòu)幸乒,圖片來(lái)源Dapper論文

鏈路追蹤2.png

3.鏈路追蹤的概念

廣義上,分布式鏈路追蹤系統(tǒng)可以分為三個(gè)部分:數(shù)據(jù)收集唇牧、數(shù)據(jù)存儲(chǔ)罕扎、數(shù)據(jù)展示

狹義上丐重,指鏈路追蹤的數(shù)據(jù)收集部分

比如:Spring Cloud Sleuth就屬于狹義的追蹤系統(tǒng)腔召,通常會(huì)搭配 Zipkin 作為數(shù)據(jù)展示,搭配 Elasticsearch 作為數(shù)據(jù)存儲(chǔ)來(lái)組合使用扮惦。

這里從Dapper論文的內(nèi)容總結(jié)下鏈路追蹤的設(shè)計(jì)目標(biāo)如下:

  • 低開(kāi)銷:追蹤系統(tǒng)對(duì)正在運(yùn)行的服務(wù)應(yīng)該具備很小的性能影響
  • 應(yīng)用層透明性:開(kāi)發(fā)人員無(wú)需關(guān)注追蹤系統(tǒng)臀蛛,作為業(yè)務(wù)組件,盡可能減少對(duì)業(yè)務(wù)系統(tǒng)的代碼侵入性崖蜜。使用時(shí)透明浊仆,減少開(kāi)發(fā)負(fù)擔(dān)。如果需要依賴開(kāi)發(fā)者配合才能使追蹤系統(tǒng)生效豫领,這樣是無(wú)法滿足追蹤系統(tǒng)“無(wú)所不在的部署”這個(gè)需求
  • 可擴(kuò)展性:支持分布式部署抡柿,具備良好的擴(kuò)展性,能支持的組件越多越好等恐,至少在接下來(lái)幾年內(nèi)能處理服務(wù)和集群的規(guī)模
  • 數(shù)據(jù)的快速分析:追蹤數(shù)據(jù)生成后的數(shù)據(jù)分析要快洲劣,分析維度盡可能多,理想情況下是一分鐘內(nèi)课蔬,數(shù)據(jù)的新鮮度能快速對(duì)生產(chǎn)異常做出反應(yīng)闪檬。

4.功能模塊

生產(chǎn)環(huán)境的鏈路追蹤系統(tǒng),主要分為4個(gè)大模塊:

4.1 埋點(diǎn)與生成日志

分客戶端埋點(diǎn)购笆、服務(wù)端埋點(diǎn)粗悯、以及客戶端和服務(wù)端雙向埋點(diǎn),埋點(diǎn)日志通常包含了traceId同欠、spanId样傍、調(diào)用的開(kāi)始時(shí)間横缔,協(xié)議類型、調(diào)用方ip和端口衫哥,請(qǐng)求的服務(wù)名茎刚、調(diào)用耗時(shí),調(diào)用結(jié)果撤逢,異常信息等

需要寫(xiě)log膛锭,高并發(fā)服務(wù)中,性能影響越重蚊荣,通常使用采樣+異步log的方式解決

4.2 收集和存儲(chǔ)日志

特點(diǎn)是需支持分布式日志采集方案初狰,一般還會(huì)用MQ作為緩沖

每個(gè)機(jī)器上有個(gè)daemon,這里的daemon指的后臺(tái)服務(wù)進(jìn)程互例,專門(mén)用于日志收集和Trace轉(zhuǎn)發(fā)奢入;

多級(jí)collector,類似pub/sub架構(gòu)媳叨,可以負(fù)載均衡腥光;

聚合數(shù)據(jù)進(jìn)行實(shí)時(shí)分析和離線存儲(chǔ);

離線分析 需將同一條調(diào)用鏈的日志匯總在一起糊秆;

4.3 分析和統(tǒng)計(jì)調(diào)用鏈數(shù)據(jù)

調(diào)用鏈跟蹤分析:把同一TraceID的Span收集起來(lái)武福,按時(shí)間排序就是timeline。把ParentID串起來(lái)就是調(diào)用棧痘番。

4.4數(shù)據(jù)展現(xiàn)以及決策支持

5.數(shù)據(jù)收集的三種實(shí)現(xiàn)方式

不論是狹義還是廣義的鏈路追蹤系統(tǒng)艘儒,都必須包含數(shù)據(jù)收集的工作,介紹三種主流的數(shù)據(jù)收集方式:

5.1基于日志的追蹤Log-based Tracing

思路是將 Trace夫偶、Span 等信息直接輸出到應(yīng)用日志中界睁,然后將日志歸集過(guò)程匯聚到一起,再?gòu)娜秩罩拘畔⒅蟹赐瞥鐾暾恼{(diào)用鏈拓?fù)潢P(guān)系兵拢;

日志追蹤對(duì)網(wǎng)絡(luò)消息完全沒(méi)有侵入性翻斟,對(duì)應(yīng)用程序只有很少量的侵入性,對(duì)性能的影響也非常低

缺點(diǎn):

  • 依賴日志歸集過(guò)程说铃,日志不求決對(duì)的一致和連續(xù)访惜,精準(zhǔn)性較低。
  • 業(yè)務(wù)服務(wù)的調(diào)度和日志歸集不是由同一個(gè)進(jìn)程同時(shí)完成的腻扇,存在日志延遲或丟失的問(wèn)題债热,從而產(chǎn)生追蹤失真的情況

5.2基于服務(wù)的追蹤

目前最常見(jiàn)的追蹤實(shí)現(xiàn)方式,如Zipkin幼苛、SkyWalking窒篱、Pinpoint 等主流追蹤系統(tǒng)都采用這種方式,其實(shí)現(xiàn)思路是:通過(guò)某些手段給目標(biāo)應(yīng)用注入追蹤探針(Probe),比如針對(duì) Java 應(yīng)用墙杯,一般就是通過(guò) Java Agent 注入的配并。

探針可以看作是目標(biāo)服務(wù)身上的小型微服務(wù)系統(tǒng),有服務(wù)注冊(cè)高镐、心跳檢測(cè)等功能溉旋,有專門(mén)的數(shù)據(jù)收集協(xié)議,可以把從目標(biāo)系統(tǒng)收集的服務(wù)調(diào)用信息嫉髓,通過(guò)HTTP 或者 RPC 請(qǐng)求观腊,發(fā)送給追蹤系統(tǒng)

該方式具備追蹤的精確性和穩(wěn)定性,缺點(diǎn)是消耗的資源更多算行,具備更強(qiáng)的侵入性

下圖是pinpoint的調(diào)用棧示例:

鏈路追蹤3.png

Pinpoint 本身就是比較重負(fù)載的系統(tǒng)(運(yùn)行它必須先維護(hù)一套 HBase)梧油,服務(wù)追蹤這方面國(guó)產(chǎn)開(kāi)源的Skywalking更加輕量化

5.3基于邊車代理的追蹤

·基于邊車代理的追蹤是服務(wù)網(wǎng)格的專屬方案,也是最理想的分布式追蹤模型纱意,對(duì)應(yīng)用完全透明婶溯,無(wú)論是日志還是服務(wù)本身鲸阔,都不會(huì)有任何變化偷霉;

邊車代理本身對(duì)應(yīng)用透明的工作原理,決定了它只能實(shí)現(xiàn)服務(wù)調(diào)用層面的追蹤褐筛,像前面 Pinpoint 截圖那樣的本地方法調(diào)用級(jí)別的追蹤診斷类少,邊車代理是做不到的。

6.鏈路追蹤協(xié)議

鏈路追蹤協(xié)議的發(fā)展歷史渔扎,2016 年 11 月硫狞,CNCF 技術(shù)委員會(huì)接受了 OpenTracing 作為基金會(huì)的第三個(gè)項(xiàng)目。OpenTracing 是一套與平臺(tái)無(wú)關(guān)晃痴、與廠商無(wú)關(guān)残吩、與語(yǔ)言無(wú)關(guān)的追蹤協(xié)議規(guī)范。

但是倘核,Google 卻在這個(gè)時(shí)候出來(lái)并提出了與 OpenTracing 目標(biāo)類似的 OpenCensus 規(guī)范泣侮,且得到了巨頭 Microsoft 的支持,這樣就形成了OpenTracing 和 OpenCensus兩大可觀測(cè)性的陣營(yíng)紧唱。

2019 年活尊,OpenTracing 和 OpenCensus 宣布握手言和,共同發(fā)布了可觀測(cè)性的終極解決方案OpenTelemetry漏益,并宣布會(huì)各自凍結(jié) OpenTracing 和 OpenCensus 的發(fā)展蛹锰。

6.1 OpenTracing

概述:OpenTracing是一個(gè)開(kāi)放的API規(guī)范,旨在通過(guò)提供一套統(tǒng)一的接口绰疤,幫助開(kāi)發(fā)人員能夠在其應(yīng)用中實(shí)現(xiàn)分布式追蹤

和一般的規(guī)范標(biāo)準(zhǔn)不同铜犬,Opentracing 不是傳輸協(xié)議,消息格式層面上的規(guī)范標(biāo)準(zhǔn),而是一種語(yǔ)言層面上的 API 標(biāo)準(zhǔn)翎苫。以 Go 語(yǔ)言為例权埠,只要某鏈路追蹤系統(tǒng)實(shí)現(xiàn)了 Opentracing 規(guī)定的接口(interface),符合Opentracing 定義的表現(xiàn)行為煎谍,那么就可以說(shuō)該應(yīng)用符合 Opentracing 標(biāo)準(zhǔn)攘蔽。

官網(wǎng):https://opentracing.io/

6.2 OpenCensus

OpenCensus為微服務(wù)和單體應(yīng)用提供可觀測(cè)性,通過(guò)追蹤請(qǐng)求在服務(wù)之間傳播并捕獲關(guān)鍵的時(shí)間序列指標(biāo)呐粘。其核心功能是從應(yīng)用程序中收集追蹤和指標(biāo)满俗,能夠在本地顯示并將其發(fā)送到任何分析工具(也稱為“后端”)

官網(wǎng):https://opencensus.io/

6.3 OpenTelemetry

官網(wǎng):https://opentelemetry.io/

OpenTelemetry 可以用于從應(yīng)用程序收集數(shù)據(jù)。它是一組工具作岖、API 和 SDK 集合唆垃,我們可以使用它們來(lái)檢測(cè)、生成痘儡、收集和導(dǎo)出遙測(cè)數(shù)據(jù)(指標(biāo)辕万、日志和追蹤),以幫助分析應(yīng)用的性能和行為沉删。具體的解釋為:

  • 一個(gè)可觀測(cè)性框架和工具包渐尿,旨在創(chuàng)建和管理遙測(cè)數(shù)據(jù),如追蹤矾瑰、指標(biāo)和日志砖茸。
  • 與供應(yīng)商和工具無(wú)關(guān),這意味著它可以與各種可觀測(cè)性后端一起使用殴穴,包括開(kāi)源工具如Jaeger和Prometheus凉夯,以及商業(yè)產(chǎn)品。
  • 不是像Jaeger采幌、Prometheus或其他商業(yè)供應(yīng)商那樣的可觀測(cè)性后端劲够。
  • 專注于遙測(cè)的生成、收集休傍、管理和導(dǎo)出征绎。OpenTelemetry的一個(gè)主要目標(biāo)是能夠輕松地在應(yīng)用程序或系統(tǒng)中插樁,無(wú)論它們使用何種語(yǔ)言尊残、基礎(chǔ)設(shè)施或運(yùn)行時(shí)環(huán)境炒瘸。遙測(cè)的數(shù)據(jù)存儲(chǔ)和可視化故意留給其他工具。

篇幅問(wèn)題就不繼續(xù)詳細(xì)介紹這三個(gè)協(xié)議了寝衫,感興趣的小伙伴們可以自行去官方了解顷扩。

總結(jié):今天講了鏈路追蹤的理論知識(shí),包括:追蹤與跨度的概念慰毅,一個(gè)追蹤系統(tǒng)的模塊劃分隘截,數(shù)據(jù)收集的3種方式,以及鏈路追蹤協(xié)議的發(fā)展。了解這些概念后再更容易去理解開(kāi)源的鏈路追蹤框架婶芭。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末东臀,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子犀农,更是在濱河造成了極大的恐慌惰赋,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件呵哨,死亡現(xiàn)場(chǎng)離奇詭異赁濒,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)孟害,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門(mén)拒炎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人挨务,你說(shuō)我怎么就攤上這事击你。” “怎么了谎柄?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵丁侄,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我谷誓,道長(zhǎng)绒障,這世上最難降的妖魔是什么吨凑? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任捍歪,我火速辦了婚禮,結(jié)果婚禮上鸵钝,老公的妹妹穿的比我還像新娘糙臼。我一直安慰自己,他們只是感情好恩商,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布变逃。 她就那樣靜靜地躺著,像睡著了一般怠堪。 火紅的嫁衣襯著肌膚如雪揽乱。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,763評(píng)論 1 307
  • 那天粟矿,我揣著相機(jī)與錄音凰棉,去河邊找鬼。 笑死陌粹,一個(gè)胖子當(dāng)著我的面吹牛撒犀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼或舞,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼荆姆!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起映凳,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤胆筒,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后诈豌,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體腐泻,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年队询,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了派桩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蚌斩,死狀恐怖铆惑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情送膳,我是刑警寧澤员魏,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站叠聋,受9級(jí)特大地震影響撕阎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜碌补,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一虏束、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧厦章,春花似錦镇匀、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至群发,卻和暖如春晰韵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背熟妓。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工雪猪, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人滑蚯。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓浪蹂,卻偏偏與公主長(zhǎng)得像抵栈,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子坤次,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

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