分布式鏈路追蹤,一文幫你掌握它!
隨著互聯(lián)網(wǎng)的快速發(fā)展,諸如云計算、微服務、開源工具和基于容器交付等技術,使得應用程序在日益復雜的環(huán)境中更加分散,因此,追蹤請求在分布式系統(tǒng)中鏈路變得至關重要。
那么,什么是分布式追蹤?它又是如何工作的呢?本文我們將深入進行分析。
什么是分布式追蹤?
分布式追蹤(Distributed Tracing)是一種用于監(jiān)控和診斷分布式應用程序性能的技術。在分布式系統(tǒng)中,服務通常會被拆分成多個微服務,它們可能運行在不同的服務器或容器中,并通過網(wǎng)絡相互通信。分布式追蹤通過跟蹤和記錄請求在整個系統(tǒng)中的傳播路徑和性能數(shù)據(jù),幫助開發(fā)人員和運維團隊分析服務之間的調(diào)用關系、排查性能瓶頸和故障。
通常,分布式追蹤系統(tǒng)會生成唯一標識每個請求的 TraceId,并記錄每個服務處理請求的時間、耗時、調(diào)用鏈路等信息。這些數(shù)據(jù)可以用于生成可視化的調(diào)用圖,幫助開發(fā)者理解系統(tǒng)內(nèi)部各個服務之間的依賴關系和性能狀況。如下圖為一個簡要的分布式系統(tǒng)追蹤網(wǎng):
為什么需要分布式追蹤?
在單體應用程序時代,掌握系統(tǒng)中發(fā)生的情況相對簡單,然而,分布式系統(tǒng)通常由多個獨立的微服務組成,這些服務之間通過網(wǎng)絡進行通信,服務的數(shù)量和相互依賴關系的增加使得問題的定位和解決變得更加復雜,這些復雜性給內(nèi)部協(xié)作帶來了巨大的挑戰(zhàn),同時也大大增加了問題排查的難度和成本。
因此,急需一種手段,能夠在分布式系統(tǒng)中進行全鏈路追蹤,所以分布式追蹤就誕生了。
分布式追蹤對于監(jiān)視、調(diào)試和優(yōu)化分布式軟件架構(如微服務)至關重要,尤其是在動態(tài)微服務架構中,它通過收集和分析與請求觸及的每個服務的每次交互的數(shù)據(jù)來追蹤單個請求。
分布式追蹤還可以幫助團隊更快地了解每個微服務的執(zhí)行情況,這種理解有助于他們快速解決問題,提高客戶滿意度,確保穩(wěn)定的收入,并為團隊保留創(chuàng)新時間。通過這種方式,企業(yè)可以充分利用現(xiàn)代應用程序環(huán)境提供的優(yōu)勢,同時最大限度地減少其固有的復雜性也可能帶來的挑戰(zhàn)。
分布式追蹤有哪些類型?
分布式追蹤系統(tǒng)主要有以下幾種類型:
(1) 基于采樣的追蹤
采樣方式又可以細分三種,其詳情如下:
- 全量采樣(Full Tracing):對所有請求進行追蹤記錄。這種方式可以提供最全面的數(shù)據(jù),但可能會帶來較高的性能開銷和存儲需求。
- 隨機采樣(Random Sampling):隨機選擇部分請求進行追蹤。可以通過設置采樣率(如10%)來控制追蹤的請求比例,減少開銷。
- 基于策略的采樣(Policy-based Sampling):根據(jù)特定的規(guī)則或策略進行采樣,如對特定類型的請求、特定用戶或特定時間段的請求進行追蹤。
(2) 基于調(diào)用鏈的追蹤
基于調(diào)用鏈也可以分為兩種方式,其詳情如下:
- 端到端追蹤(End-to-End Tracing):從請求的入口到最終響應的整個過程中,對所有涉及的服務和組件進行追蹤。
- 局部追蹤(Local Tracing):只對某個服務或組件的內(nèi)部調(diào)用進行追蹤,適用于關注特定服務性能的場景。
(3) 基于日志的追蹤
- 日志增強型追蹤(Log-enhanced Tracing):在現(xiàn)有的日志系統(tǒng)中添加追蹤信息,通過日志來還原請求的調(diào)用鏈路和性能數(shù)據(jù)。
- 獨立追蹤系統(tǒng)(Standalone Tracing System):使用專門的追蹤系統(tǒng)和工具來收集和分析追蹤數(shù)據(jù),如Jaeger、Zipkin等。
(4) 基于事件的追蹤
- 同步事件追蹤(Synchronous Event Tracing):對同步調(diào)用鏈進行追蹤,適用于傳統(tǒng)的同步HTTP請求場景。
- 異步事件追蹤(Asynchronous Event Tracing):對異步調(diào)用鏈進行追蹤,適用于基于消息隊列、異步任務等場景。
分布式追蹤的原理
分布式追蹤的工作原理涉及多個組件和步驟,我們通過以下 7個主要流程進行分析:
(1) 唯一標識
在分布式追蹤中,一般都會存在兩個重要的唯一標識:Trace ID 和 Span ID。
- Trace ID:每個請求被分配一個唯一的 Trace ID,用于標識整個請求的生命周期。
- Span ID:每個服務在處理請求時,會生成一個 Span ID,用于標識該服務的處理單元,一個 Trace ID下可以包含多個 Span。
(2) 追蹤上下文傳遞
當一個請求從一個服務傳遞到另一個服務時,Trace ID 和 Span ID 會放置在請求頭中傳遞,以確保追蹤上下文在整個調(diào)用鏈中保持一致。
例如,在 HTTP請求中,追蹤信息可以通過特定的 HTTP頭(如 X-B3-TraceId, X-B3-SpanId 等)傳遞。
(3) 生成和記錄Span
每個服務在接收到請求時,會生成一個 Span,記錄該請求的開始時間、結束時間、處理時長、調(diào)用的下游服務等信息。Span 還可以包含標簽(tags)和日志(logs),用于記錄額外的上下文信息,如請求參數(shù)、錯誤信息等。
(4) 數(shù)據(jù)收集和傳輸
每個服務會將生成的 Span 數(shù)據(jù)發(fā)送到集中式追蹤收集器(Collector),可以通過多種方式傳輸數(shù)據(jù),如 HTTP、gRPC 等。數(shù)據(jù)收集器接收到 Span 數(shù)據(jù)后,會對其進行處理、存儲和聚合。
(5) 數(shù)據(jù)存儲
收集到的追蹤數(shù)據(jù)通常會存儲在分布式存儲系統(tǒng)中,如 Elasticsearch、Cassandra、Jaeger內(nèi)置存儲等,以支持高效的查詢和分析。
(66) 數(shù)據(jù)分析和可視化
通過追蹤系統(tǒng)的用戶界面或可視化工具,用戶可以查詢和分析追蹤數(shù)據(jù),生成調(diào)用圖、時間線圖等,直觀地展示請求的路徑和各個服務的性能。常見的可視化工具包括 Jaeger UI、Zipkin UI 等,它們提供了豐富的過濾、搜索和分析功能。
(7) 集成和擴展
分布式追蹤系統(tǒng)通常提供多種 SDK 和集成工具,支持在不同的編程語言和框架中嵌入追蹤代碼。還可以與其他監(jiān)控和日志系統(tǒng)集成,形成統(tǒng)一的可觀測性平臺,如與 Prometheus、Grafana、ELK 等工具集成。
通過上述步驟,分布式追蹤系統(tǒng)能夠全面地跟蹤和分析請求在分布式系統(tǒng)中的傳播路徑和性能,幫助開發(fā)者和運維人員深入理解系統(tǒng)的行為和性能,以下為一張簡要的追蹤原理圖:
分布式追蹤的挑戰(zhàn)
盡管分布式追蹤為企業(yè)提供了許多優(yōu)勢,但在實現(xiàn)和維護過程中面臨一些挑戰(zhàn),包括技術復雜性、性能開銷、數(shù)據(jù)管理等方面,以下是一些主要的挑戰(zhàn):
(1) 性能開銷
追蹤數(shù)據(jù)的收集、傳輸和存儲會帶來額外的性能開銷,特別是在高并發(fā)和大規(guī)模系統(tǒng)中,這種開銷可能會影響系統(tǒng)的整體性能。
(2) 數(shù)據(jù)量大
分布式系統(tǒng)中的每個請求可能涉及多個服務,每個服務都會生成追蹤數(shù)據(jù),導致數(shù)據(jù)量非常龐大。有效地存儲、管理和查詢這些數(shù)據(jù)是一項重大挑戰(zhàn)。
(3) 全鏈路追蹤的難度
確保追蹤上下文在整個調(diào)用鏈中傳遞一致性是一個復雜的問題,尤其是在跨語言、跨平臺和跨團隊的系統(tǒng)中。任何一個環(huán)節(jié)出現(xiàn)問題,都會導致追蹤數(shù)據(jù)的不完整或不準確。
(4) 采樣策略的選擇
在高流量系統(tǒng)中,不可能對每個請求都進行追蹤,需要選擇合適的采樣策略來平衡追蹤數(shù)據(jù)的代表性和系統(tǒng)的性能開銷。制定和調(diào)整采樣策略需要對系統(tǒng)有深入的了解。
(5) 可視化和分析
大量的追蹤數(shù)據(jù)需要有效的可視化和分析工具來幫助開發(fā)者和運維人員理解系統(tǒng)的行為和性能。設計和實現(xiàn)高效的可視化工具是一個挑戰(zhàn)。
(6) 數(shù)據(jù)一致性和可靠性
確保追蹤數(shù)據(jù)的準確性和一致性,避免數(shù)據(jù)丟失或錯誤,尤其是在系統(tǒng)發(fā)生故障或網(wǎng)絡不穩(wěn)定的情況下。
(7) 跨團隊協(xié)作
實現(xiàn)和維護分布式追蹤需要開發(fā)、運維、安全等多個團隊的協(xié)作。不同團隊之間的溝通和協(xié)調(diào)是一個重要的挑戰(zhàn)。
(8) 隱私和安全
追蹤數(shù)據(jù)可能包含敏感信息,確保數(shù)據(jù)的隱私和安全是必須的。需要采取適當?shù)拇胧﹣肀Wo數(shù)據(jù)不被未經(jīng)授權的訪問和泄露。
(9) 適應多樣化技術棧
現(xiàn)代分布式系統(tǒng)通常使用多種編程語言、框架和平臺。需要支持多樣化技術棧的追蹤工具和標準,以確保在不同環(huán)境中的一致性和兼容性。
(10) 成本管理
存儲和處理大量追蹤數(shù)據(jù)可能帶來高昂的成本。需要有效的成本管理策略,如數(shù)據(jù)壓縮、歸檔和自動刪除過期數(shù)據(jù)等。通過識別和應對這些挑戰(zhàn),可以更好地實現(xiàn)和維護分布式追蹤系統(tǒng),從而充分發(fā)揮其在性能監(jiān)控和故障診斷中的優(yōu)勢。
分布式追蹤工具
對于分布式追蹤工具,市面上主要有三類:自研,開源,商業(yè)版。以下是一些常用的分布式追蹤工具:
(1) Zipkin
Zipkin是 Twitter基于 Java語言開發(fā)的開源分布式追蹤系統(tǒng),支持多種語言和框架,易于集成。Zipkin提供簡單的用戶界面,用于查看和分析追蹤數(shù)據(jù),支持多種存儲后端,如 MySQL、Elasticsearch等。
(2) SkyWalking
SkyWalking 是一個開源的應用性能監(jiān)控和分布式追蹤系統(tǒng),由國內(nèi) Apache基金會成員吳晟創(chuàng)立。它支持多種語言,包括Java、C#、Go等,能夠監(jiān)控和追蹤分布式系統(tǒng)中的調(diào)用鏈路。
(3) Pinpoint
Pinpoint是由韓國 Naver開源的分布式追蹤系統(tǒng),專注于 Java和 PHP應用的監(jiān)控和追蹤,它能夠詳細記錄服務的調(diào)用鏈路和性能數(shù)據(jù),幫助開發(fā)者優(yōu)化系統(tǒng)性能。
Pinpoint 提供直觀的界面,方便用戶分析和定位問題,支持自定義插件,方便集成到不同的系統(tǒng)中。適用于需要詳細調(diào)用鏈路和性能數(shù)據(jù)的 Java和 PHP應用。
(4) CAT
CAT(Central Application Tracking)是由國內(nèi)知名互聯(lián)網(wǎng)公司美團點評開源的分布式追蹤和監(jiān)控系統(tǒng),專注于應用性能監(jiān)控和故障排查,它能夠?qū)崟r收集和分析系統(tǒng)中的調(diào)用鏈路和性能數(shù)據(jù)。
CAT能夠?qū)崟r收集和分析系統(tǒng)中的調(diào)用鏈路和性能數(shù)據(jù),支持Java、C++、Node.js等多種語言,提供強大的可視化界面,幫助用戶深入分析系統(tǒng)性能。適用于需要實時監(jiān)控和故障排查的分布式系統(tǒng)。
(5) 其他
另外還有一些國外比較流行(可能在國內(nèi)不常用)的追蹤工具,比如:Jaeger,OpenTelemetry,AWS X-Ray,Azure Application Insights,Google Cloud Trace,Elastic APM等。
總結
本文分析了什么是分布式追蹤?為什么需要分布式追蹤以及分布式追蹤如何工作的,其實,分布式追蹤就是讓錯綜復雜的分布式系統(tǒng)調(diào)用變得透明化和可視化。
有了分布式追蹤,我們才能更好的掌握服務之間的調(diào)用關系,及時監(jiān)控服務器的各項指標,當出現(xiàn)故障時可以快死定位,因此,分布式追蹤是分布式系統(tǒng)中不可或缺的一項技術,在國內(nèi)的中大型互聯(lián)網(wǎng)公司,都有一個專門的部門在維護著這樣的服務,足以可見其重要性。