Uber分布式追蹤系統Jaeger使用介紹和案例


image

原文:Uber分布式追蹤系統Jaeger使用介紹和案例【PHP Hprose Go】

前言

  隨着公司的發展,業務不斷增加,模塊不斷拆分,系統間業務調用變得越復雜,對定位線上故障帶來很大困難。整個調用鏈不透明,猶如系統被蒙上一塊黑紗,當線上遇到故障時,整個技術部就陷入痛苦的漩渦。這時候分布式追蹤系統應運而生,如揭開了黑紗,讓陽光照進黑暗。

分布式系統調用過程

image

opentracing 協議

 opentracing是一套分布式追蹤協議,與平台,語言無關,統一接口,方便開發接入不同的分布式追蹤系統。

image

簡單理解opentracing

一個完整的opentracing調用鏈包含 Trace + span + 無限極分類

  • Trace:追蹤對象,一個Trace代表了一個服務或者流程在系統中的執行過程,如:test.com,redis,mysql等執行過程。一個Trace由多個span組成
  • span:記錄Trace在執行過程中的信息,如:查詢的sql,請求的HTTP地址,RPC調用,開始、結束、間隔時間等。
  • 無限極分類:服務與服務之間使用無限極分類的方式,通過HTTP頭部或者請求地址傳輸到最低層,從而把整個調用鏈串起來。

相關文檔

分布式追蹤系統Jaeger

Jaeger是Uber開發的一套分布式追蹤系統,已在Uber大規模使用。並在2017-9-13 加入CNCF 開源組織。使用Jaeger可以非常直觀的展示整個分布式系統的調用鏈,由此可以很好發現和解決問題:

image

作用

  • 分布式環境下信息傳播
  • 分布式交易監控
  • 展示跨進程調用鏈
  • 性能優化
  • 定位問題

特性

  • 使用udp傳輸數據,相對於HTTP,優點在於,不用擔心Jaeger服務宕機或者網絡傳輸有問題而影響正常的業務。缺點就是丟包,影響了整條調用鏈。
  • 數據通過Thrift進行序列化,和json對比
接口 Thrift/byte json/byte 節省
接口1 987 2396 約1.5倍
接口2 1212 2916 約1.4倍
接口3 12830 18893 約40%
接口4 17158 22465 約24%
接口5 11025 14282 約23%

 從中可以看出thrift相對json減少了不少空間。在我們采集公司接口的數據大小都集中在10~20k,所以使用thrift會更有優勢。

  • 采集策略

Jaeger 官方提供了多種采集策略,使用者可以按需選擇使用

  1. ConstSampler,全量采集
  2. ProbabilisticSampler ,概率采集,默認萬份之一
  3. RateLimitingSampler ,限速采集,每秒只能采集一定量的數據
  4. RemotelyControlledSampler ,一種動態采集策略,根據當前系統的訪問量調節采集策略
  1. Go
  2. Java
  3. node
  4. python

部署

快速部署 ------ All in one Docker image

 all-in-one 是Uber官方打包好的鏡像,可以直接部署使用,但是只能用於測試環境,不能用於線上,因為它把數據放入了內存。

 
        

    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 可以在瀏覽器查看 Jaeger的后台

官方提供的使用例子,需要go環境

go get github.com/uber/jaeger
cd $GOPATH/src/github.com/uber/jaeger
make install
cd examples/hotrod
go run ./main.go all

http://localhost:8080 瀏覽器打開查看

cassandra + docker 部署,單機模式

docker run -itd \
--name=cassandra -p9042:9042 \
-v /data/cassandra:/var/lib/cassandra \
cassandra

進入容器建立表空間

按照官方腳本整理了一份建表語句jaeger_tables,進入cassandra,執行語句即可創建所需的表。

keyspaces:jaeger_v1_dc

運行 jaeger-query

docker run -itd --network=bridge \
--name=jaeger-query \
-p16686:16686 \
jaegertracing/jaeger-query \
/go/bin/query-linux \
--span-storage.type=cassandra \
--cassandra.keyspace=jaeger_v1_dc \
--cassandra.servers={{ cassandra }}:9042 \
--query.static-files=/go/jaeger-ui/

運行 jaeger-collector

docker run -itd --network=bridge \
--name=jaeger-collector \
-p14267:14267 \
-p14268:14268 \
-p9411:9411 \
jaegertracing/jaeger-collector \
/go/bin/collector-linux \
--span-storage.type=cassandra \
--cassandra.keyspace=jaeger_v1_dc \
--cassandra.servers={{ cassandra }}:9042

運行 jaeger-agent

docker run \
-itd --network=bridge \
--name=jaeger-agent \
-p5775:5775/udp \
-p6831:6831/udp \
-p6832:6832/udp \
-p5778:5778/tcp \
jaegertracing/jaeger-agent \
/go/bin/agent-linux --collector.host-port={{ jaeger-collector }}:14267


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM