這是小卷對(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)用鏈路随夸。
這種復(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論文
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)用棧示例:
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)源的鏈路追蹤框架婶芭。