深入了解分布式鏈路追蹤利器--Jaeger:原理與應(yīng)用
共 4858字,需瀏覽 10分鐘
·
2024-07-01 17:03
1、簡介
1.1 Jaeger是什么
Jaeger 是受到 Dapper 和 OpenZipkin 啟發(fā)的由 Uber Technologies 作為開源發(fā)布的分布式跟蹤系統(tǒng),兼容 OpenTracing 以及 Zipkin 追蹤格式,目前已成為 CNCF 基金會的開源項目。其前端采用React語言實現(xiàn),后端采用GO語言實現(xiàn),適用于進行鏈路追蹤,分布式跟蹤消息傳遞,分布式事務(wù)監(jiān)控、問題分析、服務(wù)依賴性分析、性能優(yōu)化等場景。
Jaeger 主要包括以下三部分:
tracer:在廣義上,一個trace代表了一個事務(wù)或者流程在(分布式)系統(tǒng)中的執(zhí)行過程。trace 是多個 span組成的一個有向無環(huán)圖(DAG),每一個span代表trace中被命名并計時的連續(xù)性的執(zhí)行片段。每一個 Trace 會有一個獨有的 Trace ID,假設(shè)服務(wù)調(diào)用關(guān)系為 a->b->c->d,請求從 a 開始發(fā)起。那么 a 負責(zé)生成 traceId,并在調(diào)用 b 的時候把 traceId 傳遞給 b,以此類推,traceId 會從 a 層層傳遞到 d。
span: 是鏈路追蹤工具的邏輯工作單元,可以是一個微服務(wù)中的 service,也可以是一次方法調(diào)用,甚至一個簡單的代碼塊調(diào)用。具有請求名稱、請求開始時間、請求持續(xù)時間。每一個 Span 會有一個獨有的 Span ID。Span 會被嵌套并排序以展示服務(wù)間的關(guān)系。
Span Context:含額外 Trace 信息的數(shù)據(jù)結(jié)構(gòu),span context 可以包含 Trace ID、Span ID,以及其他任何需要向下游服務(wù)傳遞的 Trace 信息。
總而言之,Trace表示對一次請求完整調(diào)用鏈的跟蹤,而將兩個服務(wù)例如上面的服務(wù)A和服務(wù)B的請求/響應(yīng)過程叫做一次Span,trace是通過span來體現(xiàn)的, 通過一句話總結(jié),我們可以將一次trace,看成是span的有向圖,而這個有向圖的邊即為span。而分布式跟蹤系統(tǒng)要做的,就是記錄每次發(fā)送和接受動作的標(biāo)識符和時間戳,將一次請求涉及到的所有服務(wù)串聯(lián)起來,只有這樣才能搞清楚一次請求的完整調(diào)用鏈。
1.2 分布式鏈路追蹤相關(guān)術(shù)語
(1)APM
隨著微服務(wù)架構(gòu)的流行,一次請求往往需要涉及到多個服務(wù),因此服務(wù)性能監(jiān)控和排查就變得更復(fù)雜:
不同的服務(wù)可能由不同的團隊開發(fā)、甚至可能使用不同的編程語言來實現(xiàn);
服務(wù)有可能布在了幾千臺服務(wù)器,橫跨多個不同的數(shù)據(jù)中心。
因此,就需要一些可以幫助理解系統(tǒng)行為、用于分析性能問題的工具,以便發(fā)生故障的時候,能夠快速定位和解決問題,這就是APM系統(tǒng),全稱是(Application Performance Management tools,應(yīng)用程序性能管理工具)。AMP最早是谷歌公開的論文提到的 Google Dapper。Dapper是Google生產(chǎn)環(huán)境下的分布式跟蹤系統(tǒng),自從Dapper發(fā)展成為一流的監(jiān)控系統(tǒng)之后,給google的開發(fā)者和運維團隊幫了大忙,所以谷歌公開論文分享了Dapper。
(2)鏈路追蹤
在傳統(tǒng)的單體程序中,遇到問題時,我們可以通過函數(shù)間的調(diào)用棧來查看函數(shù)間的調(diào)用關(guān)系。但是在分布式的架構(gòu)中,一個請求可能會導(dǎo)致多個不同網(wǎng)絡(luò)的服務(wù)調(diào)用,這給我們調(diào)試問題帶來了困難。Jaeger可以簡單理解為微服務(wù)的函數(shù)調(diào)用棧,其記錄了一個請求的各種調(diào)用關(guān)系,以便于我們分析問題。
(3)OpenTracing
為了解決不同的分布式追蹤系統(tǒng) API 不兼容的問題,誕生了 OpenTracing 規(guī)范。OpenTracing 是一個輕量級的標(biāo)準(zhǔn)化層,它位于應(yīng)用程序/類庫和追蹤或日志分析程序之間。
一句話總結(jié),OpenTracing是一套標(biāo)準(zhǔn),它通過提供平臺無關(guān)、廠商無關(guān)的API,使得開發(fā)人員能夠方便的添加(或更換)追蹤系統(tǒng)的實現(xiàn)。OpenTracing提供了用于運營支撐系統(tǒng)的和針對特定平臺的輔助程序庫。程序庫的具體信息請參考詳細的規(guī)范。OpenTracing 已進入 CNCF,正在為全球的分布式追蹤,提供統(tǒng)一的概念和數(shù)據(jù)標(biāo)準(zhǔn)。
注意 1:OpenTracing現(xiàn)在已經(jīng)成為過去式了,現(xiàn)在的APM世界,由一種叫做OpenTelemetry的規(guī)范所統(tǒng)治,具體詳情參見《OpenTelemetry概述》。
1.3 Jaeger和其他常用分布式鏈路追蹤工具對比
市面上關(guān)于分布式鏈路追蹤工具的產(chǎn)品很多,除了 Uber 的 Jaeger 和 Twitter 的 Zipkin,目前 SkyWalking 使用者也比較多,下面從多個維度對比下常用分布式鏈路追蹤工具的能力。
2、Jaeger架構(gòu)設(shè)計
2.1 Jaeger架構(gòu)
Jaeger 主要由以下幾個組件構(gòu)成:
Tracing SDK: 用于實現(xiàn)分布式鏈路追蹤的軟件開發(fā)工具包。這些 SDK 通常是針對特定編程語言或框架的,旨在幫助開發(fā)人員在應(yīng)用程序中集成分布式追蹤功能。這些 SDK 提供了一組 API 和工具,使開發(fā)人員能夠在應(yīng)用程序代碼中插入相關(guān)的追蹤代碼,從而捕獲應(yīng)用程序的請求路徑、性能指標(biāo)和其他有關(guān)信息。通過在代碼中插入追蹤代碼,應(yīng)用程序的不同組件和服務(wù)之間的交互將被追蹤,從而形成完整的請求鏈路。
JaegerCollector: 接收traces,通過處理管道運行它們進行validation和清理/豐富,并將其存儲在存儲后端。Jaeger內(nèi)置了對多個存儲后端的支持,以及用于實現(xiàn)自定義存儲插件的可擴展插件框架。
DB: 后端存儲組件,支持內(nèi)存、Cassandra、Elasticsearch、Kafka 的存儲方式。
Jaeger Query: 用于接收查詢請求,從數(shù)據(jù)庫檢索數(shù)據(jù)并通過 UI 展示。
Jaeger UI: 使用 React 編寫,用于 UI 界面展示。
在Jaeger架構(gòu)設(shè)計中,Jaeger Collector組件從被跟蹤的應(yīng)用程序接收數(shù)據(jù),并將其直接寫入存儲。存儲必須能夠同時處理平均流量和峰值流量。Jaeger Collector使用內(nèi)存隊列來平滑短期流量峰值,但如果存儲無法跟上,持續(xù)的流量峰值可能會導(dǎo)致數(shù)據(jù)丟失。
注意 1:這是Jaeger最新穩(wěn)定版本1.47的架構(gòu)圖,我們在比較老的jaeger版本的架構(gòu)圖中經(jīng)常會看到j(luò)aeger-agent組件,其在應(yīng)用程序和后端收集器之間起到中間代理的作用,但是由于Jaeger 客戶端庫已被棄用,并且 OpenTelemetry SDK 正在逐步取消對 Jaeger Thrift 格式的支持,因此現(xiàn)在版本不再需要或推薦使用jaeger-agent 。
2.2 Jaeger采樣率
分布式追蹤系統(tǒng)本身也會造成一定的性能低損耗,如果完整記錄每次請求,對于生產(chǎn)環(huán)境可能會有極大的性能損耗,一般需要進行采樣設(shè)置。
當(dāng)前支持四種采樣率設(shè)置:
固定采樣(sampler.type=const)sampler.param=1 全采樣, sampler.param=0 不采樣;
按百分比采樣(sampler.type=probabilistic)sampler.param=0.1 則隨機采十分之一的樣本;
采樣速度限制(sampler.type=ratelimiting)sampler.param=2.0 每秒采樣兩個traces;
動態(tài)獲取采樣率 (sampler.type=remote) ,允許根據(jù)特定條件動態(tài)地決定是否采集某個請求的追蹤數(shù)據(jù),以減少性能開銷并確保系統(tǒng)的穩(wěn)定性。
3、Jaeger部署方式
Jaeger 的部署方式主要有以下幾種:
all-in-one 部署:適用于快速體驗 Jaeger ,所有追蹤數(shù)據(jù)存儲在內(nèi)存中,不適用于生產(chǎn)環(huán)境。
Kubernetes 部署:通過在集群獨立部署 Jaeger 各組件 manifest 完成,定制化程度高,可使用已有的 Elasticsearch、Kafka 服務(wù),適用于生產(chǎn)環(huán)境。
OpenTelemetry 部署:適用于使用 OpenTelemetry API 的部署方式。
3.1 在 Kubernetes 集群中,作為 Istio 組件部署 Jaeger
部署 Istio 組件時,默認是沒有部署 Jaeger,需要手動額外部署。
(1)修改Istio配置確認 trace 采樣率。
采樣配置有幾種策略可以配置,可以設(shè)置Tracing全部/部分/隨機。
kubectl -n istio-system get cm jaeger-sampling-configuration -o yaml...sampling: '{"default_strategy":{"param":1,"type":"probabilistic"}}' # 表示隨機采樣,但是比例是100%
(2)部署Jaeger
執(zhí)行 kubectl apply -f samples/addons/jaeger.yaml 來安裝 Jaeger,此時會在 istio-system 的命名空間中部署 Jaeger。
[]jaeger-collector-85b686d849-cmv9h 1/1 Running 0 99djaeger-operator-868d5f975d-5prhx 1/1 Running 0 27djaeger-query-7cff7c84f4-k7bs8 2/2 Running 0 167m
注意 1:推薦使用 jaeger-operator 部署 Jaeger 組件。
(3) 訪問 Jaeger Dashboard。
其中 <ip> 是該宿主機的 IP 地址,方便外部直接根據(jù)該 IP 訪問,瀏覽器輸入:http://<IP>:30693,可直接訪問 Jaeger Dashboard。
[]jaeger-query NodePort 10.233.41.95 <none> 16686:30693/TCP,16685:30363/TCP 500d
鏈接:https://www.cnblogs.com/zhangmingcheng/p/17602568.html
(版權(quán)歸原作者所有,侵刪)
