為什么需要分布式鏈路追蹤
隨著互聯(lián)網(wǎng)架構(gòu)的擴(kuò)張,分布式系統(tǒng)變得日趨復(fù)雜,越來越多的組件開始走向分布式化,如微服務(wù)、消息收發(fā)、分布式數(shù)據(jù)庫、分布式緩存、分布式對象存儲、跨域調(diào)用,這些組件共同構(gòu)成了繁雜的分布式網(wǎng)絡(luò),那現(xiàn)在的問題是一個(gè)請求經(jīng)過了這些服務(wù)后其中出現(xiàn)了一個(gè)調(diào)用失敗的問題,只知道有異常,但具體的異常在哪個(gè)服務(wù)引起的就需要進(jìn)入每一個(gè)服務(wù)里面看日志,這樣的處理效率是非常低的
什么是分布式調(diào)用鏈
分布式調(diào)用鏈其實(shí)就是將一次分布式請求還原成調(diào)用鏈路。顯式的在后端查看一次分布式請求的調(diào)用情況,比如各個(gè)節(jié)點(diǎn)上的耗時(shí)、請求具體打到了哪臺機(jī)器上、每個(gè)服務(wù)節(jié)點(diǎn)的請求狀態(tài)等等
鏈路追蹤系統(tǒng)應(yīng)該具備的功能
根據(jù)前面的分析,我們已經(jīng)知道追蹤分布式調(diào)用鏈?zhǔn)墙鉀Q上述場景的一個(gè)可行方案,那分布式鏈路追蹤應(yīng)該具備哪些功能才能達(dá)到我們的要求呢?
1.快速定位
通過調(diào)用鏈跟蹤,一次請求的邏輯軌跡可以用完整清晰的展示出來。開發(fā)中可以在業(yè)務(wù)日志中添加調(diào)用鏈ID,可以通過調(diào)用鏈結(jié)合業(yè)務(wù)日志快速定位錯(cuò)誤信息
2.各個(gè)調(diào)用環(huán)節(jié)的性能分析
在調(diào)用鏈的各個(gè)環(huán)節(jié)分別添加調(diào)用時(shí)延,可以分析系統(tǒng)的性能瓶頸,進(jìn)行針對性的優(yōu)化。通過分析各個(gè)環(huán)節(jié)的平均時(shí)延,QPS等信息,可以找到系統(tǒng)的薄弱環(huán)節(jié),對一些模塊做調(diào)整,如數(shù)據(jù)冗余等
3.數(shù)據(jù)分析
調(diào)用鏈綁定業(yè)務(wù)后查看具體每條業(yè)務(wù)數(shù)據(jù)對應(yīng)的鏈路問題,可以得到用戶的行為路徑,經(jīng)過了哪些服務(wù)器上的哪個(gè)服務(wù),匯總分析應(yīng)用在很多業(yè)務(wù)場景
4.生成服務(wù)調(diào)用拓?fù)鋱D
通過可視化分布式系統(tǒng)的模塊和他們之間的相互聯(lián)系來理解系統(tǒng)拓?fù)洹|c(diǎn)擊某個(gè)節(jié)點(diǎn)會(huì)展示這個(gè)模塊的詳情,比如它當(dāng)前的狀態(tài)和請求數(shù)量
分布式系統(tǒng)調(diào)用過程
Opentracing協(xié)議
OpenTracing是一套分布式追蹤協(xié)議,與平臺,語言無關(guān),統(tǒng)一接口,方便開發(fā)接入不同的分布式追蹤系統(tǒng)。OpenTracing正在為全球的分布式追蹤,提供統(tǒng)一的概念和數(shù)據(jù)標(biāo)準(zhǔn)
一個(gè)完整的opentracing調(diào)用鏈包含 Trace + span + 無限極分類
Trace:追蹤對象,一個(gè)Trace代表了一個(gè)服務(wù)或者流程在系統(tǒng)中的執(zhí)行過程,如:test.com,redis,mysql等執(zhí)行過程。一個(gè)Trace由多個(gè)span組成
span:記錄Trace在執(zhí)行過程中的信息,如:查詢的sql,請求的HTTP地址,RPC調(diào)用,開始、結(jié)束、間隔時(shí)間等
無限極分類:服務(wù)與服務(wù)之間使用無限極分類的方式,通過HTTP頭部或者請求地址傳輸?shù)阶畹蛯樱瑥亩颜麄€(gè)調(diào)用鏈串起來
分布式追蹤系統(tǒng)Jaeger
Jaeger是Uber開發(fā)的一套分布式追蹤系統(tǒng),已在Uber大規(guī)模使用。并在2017-9-13 加入CNCF 開源組織。使用Jaeger可以非常直觀的展示整個(gè)分布式系統(tǒng)的調(diào)用鏈,由此可以很好發(fā)現(xiàn)和解決問題
分布式追蹤系統(tǒng)種類繁多,但是核心步驟有三個(gè):代碼埋點(diǎn),數(shù)據(jù)存儲和查詢展示。
APM的三大模塊分別是集中式日志系統(tǒng),集中式度量系統(tǒng)和分布式全鏈接追蹤系統(tǒng)。
而Jaeger屬于的就是追蹤系統(tǒng),度量系統(tǒng)我們則會(huì)使用prometheus,日志系統(tǒng)一般則是elk。
作用
分布式環(huán)境下信息傳播
分布式交易監(jiān)控
展示跨進(jìn)程調(diào)用鏈
性能優(yōu)化
定位問題
Jaeger組件
Agent
Agent是一個(gè)網(wǎng)絡(luò)守護(hù)進(jìn)程,監(jiān)聽通過UDP發(fā)送過來的Span,它會(huì)將其批量發(fā)送給collector。按照設(shè)計(jì),Agent要被部署到所有主機(jī)上,作為基礎(chǔ)設(shè)施。Agent將collector和客戶端之間的路由與發(fā)現(xiàn)機(jī)制抽象了出來。
Collector
Collector從Jaeger Agent接收Trace,并通過一個(gè)處理管道對其進(jìn)行處理。目前的管道會(huì)校驗(yàn)Trace、建立索引、執(zhí)行轉(zhuǎn)換并最終進(jìn)行存儲。存儲是一個(gè)可插入的組件,現(xiàn)在支持Cassandra和elasticsearch。
Query
Query服務(wù)會(huì)從存儲中檢索Trace并通過UI界面進(jìn)行展現(xiàn),該UI界面通過React技術(shù)實(shí)現(xiàn),其頁面UI如下圖所示,展現(xiàn)了一條Trace的詳細(xì)信息。
存儲
jaeger采集到的數(shù)據(jù)必須存儲到某個(gè)存儲引擎,目前支持Cassandra和elasticsearch
go-micro + opentracing + jaeger
jaeger 部署
快速部署 ------ All in one Docker image
all-in-one 是Uber官方打包好的鏡像,可以直接部署使用,但是只能用于測試環(huán)境,不能用于線上,因?yàn)樗褦?shù)據(jù)放入了內(nèi)存
docker run -d -e COLLECTOR_ZIPKIN_HTTP_PORT=9411 -p5775:5775/udp -p6831:6831/udp -p6832:6832/udp? -p5778:5778 -p16686:16686 -p14268:14268 -p9411:9411 jaegertracing/all-in-one:latest
打開瀏覽器訪問: http://localhost:16686
GO 代碼
go-micro client:https://gitee.com/mashuai666/micro-jaeger-client
go-micro server:?https://gitee.com/mashuai666/micro-jaeger-server
jaeger使用
go-micro 自帶的opentracing插件
打開瀏覽器訪問: http://localhost:16686?