個推基於 Zipkin 的分佈式鏈路追蹤實踐


做者:個推應用平臺基礎架構高級研發工程師 阿飛
 
01業務背景
 
隨着微服務架構的流行,系統變得愈來愈複雜,單體的系統被拆成不少個模塊,各個模塊經過輕量級的通訊協議進行通信,相互協做,共同實現系統功能。
 
單體架構時,一個請求的調用鏈路很清晰,通常由負載均衡器將用戶請求轉發到後端服務,由後端服務進行業務處理,須要的數據從外部的存儲中獲取,處理完請求後,再經由負載均衡器返回給用戶。
 
而在微服務架構中,一個請求每每須要多個模塊共同協做處理,不一樣模塊可能還依賴於不一樣的外部存儲,各個模塊的實現技術還不盡相同,一個請求是如何在整個系統不一樣模塊間進行流轉,整個調用鏈上的各個模塊之間的調用關係如何,每一個微服務處理的時間長短,處理的結果是否正確,很難去進行追蹤,而這些信息對於整個系統運維、性能分析、故障追蹤都特別有幫助,也正由於此,纔有了各類分佈式鏈路追蹤的技術。
 
02分佈式鏈路追蹤現狀
 
分佈式鏈路追蹤的技術有不少,有開源的也有閉源的。開源的有Jaeger、PinPoint、Zipkin、SkyWalking、CAT等,閉源的有Google Dapper、淘寶的鷹眼Tracing、新浪的Watchman、美團的MTrace等。CNCF(Cloud Native Computing Foundation)爲了解決業界分佈式追蹤系統跨平臺兼容性問題,設計了trace的標準,提出了分佈式跟蹤系統產品的統一範式-OpenTracing,Zipkin也部分支持OpenTracing標準。
 
03選擇Zipkin的緣由
 
在實踐的過程當中,基於如下緣由選擇了Zipkin來進行鏈路追蹤:
• 開源,社區活躍
• 支持多種語言,Nodejs,Lua,Java都有開源實現,而咱們的服務主要是這三種語言實現的
• 提供查詢API,方便二次開發
 
04Zipkin的架構介紹
 
Zipkin的總體架構以下圖所示:
 

Zipkin的總體架構
(引用自Zipkin官網:https://zipkin.io/pages/architecture.html)
 
其中:
•  Instrumented client和Instrumented server須要集成在分佈式系統的具體服務中,採集跟蹤信息,調用Transport,把跟蹤信息發送給Zipkin的Server。
• Transport是Zipkin對外提供的接口,支持HTTP、Kafka、Scribe等通訊方式。
•  Zipkin即Zipkin server,主要包括四個模塊:
Collector: 用於接收各個應用服務傳輸的追蹤信息;
Storage:Zipkin的後端存儲,支持In-Memory、MySql、Elasticsearch和Cassandra;
API:提供對外的查詢接口;
UI:提供對外的Web界面。

Http Tracing的時序圖
(引用自Zipkin官網:https://zipkin.io/pages/architecture.html)
 
以上是Http Tracing的時序圖,用戶的請求/foo首先被Trace Instrumentationlan攔截,記錄下Tags,時間戳,同時在Header裏增長Trace信息,而後再流轉到後端服務進行處理,處理完成後,正常響應,Trace Instrumentationlan攔截響應,記錄處理延時後,將Response正常返回給調用方,同時異步地將Trace的Span發送給Zipkin Server。Span中的traceId是在整個調用鏈路上惟一的ID,用於惟一標識一條調用鏈。
 
05個推的Zipkin實踐
 
個推的微服務是基於Kubernetes和Docker進行部署的,每一個微服務對應於Kubernetes中的一組Pod。
在整個微服務體系中,API網關是基於Openresty開發的,主要使用Lua進行開發;後端服務主要使用Node.js和Java進行開發實現。在對接Zipkin時,不一樣的微服務採用不一樣的方式進行實現。
API網關主要經過增長網關插件(主要參考了Kong的Zipkin插件實現)來實現與Zipkin的對接;Node.js實現的服務主要使用了中間件實現與Zipkin的對接;Java服務使用了spring-cloud-sleuth來與Zipkin對接。 總體的架構以下圖所示:

個推基於Zipkin的分佈式鏈路追蹤系統的總體架構
 
其中,Zipkin也容器化部署在Kubernetes集羣中,簡化了Zipkin的搭建和部署。以下圖所示,經過Zipkin能夠很方便地追蹤請求的調用鏈路,整個調用鏈上各個服務的處理耗時,響應狀態,服務間的調用關係均可以方便地在Zipkin中進行查詢。Zipkin對於分析整個系統的性能瓶頸,定位故障也都有很大的幫助。

Zipkin的Web界面
 
06總結
 
Zipkin做爲一個分佈式鏈路追蹤系統,有着應用侵入較小、社區活躍度較高、支持多種語言等優點,通常基於開源的實現稍作修改就能夠實現與Zipkin的對接。所以個推在微服務架構中也引入了Zipkin,用Zipkin來追蹤微服務的調用關係,對微服務進行性能分析和故障診斷。將來,個推會基於Zipkin作二次開發,提供更爲友好的界面。
相關文章
相關標籤/搜索