前言
傳統(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ù)弓颈,閱讀更多的新知識。