天天看點

部署Zipkin分布式性能追蹤日志系統的操作記錄(npm安裝)

Zipkin是Twitter的一個開源項目,是一個緻力于收集Twitter所有服務的監控資料的分布式跟蹤系統,它提供了收集資料,和查詢資料兩大接口服務。

部署Zipkin環境的操作記錄:

部署Zipkin,比較麻煩的是前期環境的準備,隻有先把前期環境安裝好了,後面的部署就順利多了。(部署機ip為192.168.1.102)

一、環境準備: 

1)java環境安裝(Centos中yum方式安裝java)

-------------------------------------------------------------------------------------------

特别注意:現在安裝zipkin,必須使用java8(即java-1.8.0-openjdk)

[[email protected] ~]# java -version

openjdk version "1.8.0_111"

OpenJDK Runtime Environment (build 1.8.0_111-b15)

OpenJDK 64-Bit Server VM (build 25.111-b15, mixed mode)

最後别忘了添加jdk的環境變量

[[email protected] ~]# vim /etc/profile

......

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk.x86_64

export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

export PATH=$PATH:$JAVA_HOME/bin

[[email protected] ~]# source /etc/profile

--------------------------------------------------------------------------------------------

2)npm環境安裝

随同NodeJS一起安裝的包管理工具

這個國内目前知道的隻有淘寶有。

[[email protected] ~]# alias npm="npm --registry=https://registry.npm.taobao.org --disturl=https://npm.taobao.org/mirrors/node"

3)node環境安裝(版本:V5.5.0)

[[email protected] ~]# yum install npm -y

[[email protected] ~]# git clone https://github.com/creationix/nvm.git /usr/local/nvm

[[email protected] ~]# source /usr/local/nvm/install.sh

[[email protected] ~]# nvm --version

[[email protected] ~]# nvm install v5.5.0

-----------------------------------------------------------------

出現如下報錯:

[[email protected] nvm]# nvm install v5.5.0

-bash: nvm_has: command not found

-bash: nvm_has: command not found

nvm needs curl or wget to proceed.

解決辦法:

在目前使用者家目錄的.bash_profile檔案中添加如下内容

[[email protected] ~]# cat /root/.bash_profile

.....

export NVM_DIR="/usr/local/nvm"

[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm

[[email protected] ~]# source /root/.bash_profile

然後再次執行下面指令就不會出現上面報錯了:

[[email protected] ~]# nvm install v5.5.0

-----------------------------------------------------------------

二、Zipkin安裝部署:(zipkin項目的git位址:https://github.com/twitter/zipkin)

[[email protected] ~]# wget -O zipkin.jar 'https://search.maven.org/remote_content?g=io.zipkin.java&a=zipkin-server&v=LATEST&c=exec'

其為一個spring boot 工程,直接運作jar

[[email protected] ~]# nohup java -jar zipkin.jar &               //回車,放到背景去執行

[[email protected] ~]# lsof -i:9411

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

java 8440 root 33u IPv6 64454 0t0 TCP *:9411 (LISTEN)

zipkin通路:

由于zipkin部署機192.168.1.102是一台虛拟機,沒有外網ip。

是以通過它的主控端(113.10.77.99/192.168.1.17)的NAT轉發進行通路。

即通路主控端的9411端口轉發到192.168.1.102的9411端口

在主控端192.168.1.17上的操作:(由于是單機,是以是192.168.1.102/32)

[[email protected] ~]# iptables -t nat -A PREROUTING -p tcp -m tcp --dport 9411 -j DNAT --to-destination 192.168.1.102:9411

[[email protected] ~]# iptables -t nat -A POSTROUTING -d 192.168.1.102/32 -p tcp -m tcp --sport 9411 -j SNAT --to-source 192.168.1.17

[[email protected] ~]# iptables -t filter -A INPUT -p tcp -m state --state NEW -m tcp --dport 9411 -j ACCEPT

[[email protected] ~]# service iptables save

[[email protected] ~]# service iptables restart

可以檢視iptables防火牆配置檔案:

[[email protected] ~]# cat /etc/sysconfig/iptables

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37

# Generated by iptables-save v1.4.21 on Wed Dec 7 20:10:51 2016

*raw

:PREROUTING ACCEPT [5603:1412953]

:OUTPUT ACCEPT [5269:1369985]

COMMIT

# Completed on Wed Dec 7 20:10:51 2016

# Generated by iptables-save v1.4.21 on Wed Dec 7 20:10:51 2016

*mangle

:PREROUTING ACCEPT [5603:1412953]

:INPUT ACCEPT [5379:1395017]

:FORWARD ACCEPT [144:21528]

:OUTPUT ACCEPT [5269:1369985]

:POSTROUTING ACCEPT [5413:1391513]

COMMIT

# Completed on Wed Dec 7 20:10:51 2016

# Generated by iptables-save v1.4.21 on Wed Dec 7 20:10:51 2016

*nat

:PREROUTING ACCEPT [62:4444]

:INPUT ACCEPT [14:760]

:OUTPUT ACCEPT [1:60]

:POSTROUTING ACCEPT [1:60]

-A PREROUTING -p tcp -m tcp --dport 9411 -j DNAT --to-destination 192.168.1.102:9411

-A POSTROUTING -d 192.168.1.102

/32

-p tcp -m tcp --sport 9411 -j SNAT --to-

source

192.168.1.17

COMMIT

# Completed on Wed Dec 7 20:10:51 2016

# Generated by iptables-save v1.4.21 on Wed Dec 7 20:10:51 2016

*filter

:INPUT ACCEPT [7:3550]

:FORWARD ACCEPT [17:3786]

:OUTPUT ACCEPT [45:5785]

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

-A INPUT -p icmp -j ACCEPT

-A INPUT -i lo -j ACCEPT

-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

-A INPUT -p tcp -m state --state NEW -m tcp --dport 9411 -j ACCEPT

COMMIT

# Completed on Wed Dec 7 20:10:51 2016

然後在谷歌浏覽器裡通路http://113.10.77.99:9411/,即可看到zipkin的web頁面了

部署Zipkin分布式性能追蹤日志系統的操作記錄(npm安裝)

三、Zipkin功能解說

zipkin作用

全鍊路追蹤工具(根據依賴關系)

檢視每個接口、每個service的執行速度(定位問題發生點或者尋找性能瓶頸)

zipkin工作原理

創造一些追蹤辨別符(tracingId,spanId,parentId),最終将一個request的流程樹建構出來

zipkin架構

部署Zipkin分布式性能追蹤日志系統的操作記錄(npm安裝)

其中:

Collector接收各service傳輸的資料;

Cassandra作為Storage的一種,也可以是mysql等,預設存儲在記憶體中,配置cassandra可以參考這裡;

Query負責查詢Storage中存儲的資料,提供簡單的JSON API擷取資料,主要提供給web UI使用;

Web 提供簡單的web界面;

zipkin分布式跟蹤系統的目的:

zipkin為分布式鍊路調用監控系統,聚合各業務系統調用延遲資料,達到鍊路調用監控跟蹤;

zipkin通過采集跟蹤資料可以幫助開發者深入了解在分布式系統中某一個特定的請求時如何執行的;

假如我們現在有一個使用者請求逾時,我們就可以将這個逾時的請求調用鍊展示在UI當中;我們可以很快度的定位到導緻響應很慢的服務究竟是什麼。如果對這個服務細節也很很清晰,那麼我們還可以定位是服務中的哪個問題導緻逾時;

zipkin系統讓開發者可通過一個Web前端輕松的收集和分析資料,例如使用者每次請求服務的處理時間等,可友善的監測系統中存在的瓶頸。

例如下圖:

在複雜的調用鍊路中假設存在一條調用鍊路響應緩慢,如何定位其中延遲高的服務呢?

1)日志:通過分析調用鍊路上的每個服務日志得到結果

2)zipkin:使用zipkin的web UI可以一眼看出延遲高的服務

部署Zipkin分布式性能追蹤日志系統的操作記錄(npm安裝)

各業務系統在彼此調用時,将特定的跟蹤消息傳遞至zipkin,zipkin在收集到跟蹤資訊後将其聚合處理、存儲、展示等,使用者可通過web UI友善 

獲得網絡延遲、調用鍊路、系統依賴等等。

部署Zipkin分布式性能追蹤日志系統的操作記錄(npm安裝)

transport作用:收集被trace的services的spans,并将它們轉化為zipkin common Span,之後把這些Spans傳遞的存儲層。

有三種主要的transport:

      HTTP(預設)

           通過http headers來傳遞追蹤資訊

           header中的key

                X-B3-TraceId: 64 encoded bits(id被encode為hex Strings)

                X-B3-SpanId: 64 encoded bits

                X-B3-ParentSpanId: 64 encoded bits

                X-B3-Sampled: Boolean (either “1” or “0”)(下面的調用是否進行采樣)

                X-B3-Flags: a Long

               Scribe

               Kafka

zipkin基礎架構(4個元件:collector、storage、search、webUI)

collector

        作用:zipkin collector會對一個到來的被trace的資料(span)進行驗證、存儲并設定索引。

storage

        in-memory(預設)

              僅用于測試,因為采集資料不會持久化

              預設使用這個存儲,若要使用其他存儲,檢視:

              https://github.com/openzipkin/zipkin/tree/master/zipkin-server

              https://github.com/openzipkin/zipkin-dependencies

       JDBC (mysql)

             如果采集資料量很大的話,查詢速度會比較慢

       Cassandra

             zipkin最初始内建的存儲(擴充性好、schema靈活)

             This store requires a spark job to aggregate dependency links

       Elasticsearch

             This store requires a spark job to aggregate dependency links

             被設計用于大規模

             存儲形式為json

search

webUI

zipkin核心資料結構

            Annotation(用途:用于定位一個request的開始和結束,cs/sr/ss/cr含有額外的資訊,比如說時間點)

                   cs:Client Start,表示用戶端發起請求

                          一個span的開始

                   sr:Server Receive,表示服務端收到請求

                   ss:Server Send,表示服務端完成處理,并将結果發送給用戶端

                   cr:Client Received,表示用戶端擷取到服務端傳回資訊

                         一個span的結束

                         當這個annotation被記錄了,這個RPC也被認為完成了

          BinaryAnnotation(用途:提供一些額外資訊,一般已key-value對出現)

          Span:一個請求(包含一組Annotation和BinaryAnnotation);它是基本工作單元,一次鍊路調用(可以是RPC,DB等沒有特定的限制)建立一個span,通過一個64位ID辨別它。

                  span通過還有其他的資料,例如描述資訊,時間戳,key-value對的(Annotation)tag資訊,parent-id等,其中parent-id 

                  可以表示span調用鍊路來源,通俗的了解span就是一次請求資訊

          Trace:類似于樹結構的Span集合,表示一條調用鍊路,存在唯一辨別

                  Traces are built by collecting all Spans that share a traceId

                  通過traceId、spanId和parentId,被收集到的span會彙聚成一個tree,進而提供出一個request的整體流程。(這也是zipkin的工作原理)

注意:時間點計算

sr-cs:網絡延遲

ss-sr:邏輯處理時間

cr-cs:整個流程時間

Trace identifiers

         含義:通過下邊3個Id,對資料進行重組

         三個Id(64位 long型資料)

               TraceId

                     The overall ID of the trace.

                     Every span in a trace will share this ID.

              SpanId

                     The ID for a particular span.

                     This may or may not be the same as the trace id.

              ParentId

                     This is an optional ID that will only be present on child spans.

                     That is the span without a parent id is considered the root of the trace.

zipkin工作流程圖(完整的調用鍊路)

部署Zipkin分布式性能追蹤日志系統的操作記錄(npm安裝)

上圖說明:X和A可以相等

上圖表示一請求鍊路,一條鍊路通過Trace Id唯一辨別,Span辨別發起的請求資訊,各span通過parent id關聯起來;

父子span關系:

部署Zipkin分布式性能追蹤日志系統的操作記錄(npm安裝)

說明:parentId==null,表示該span就是root span。

整個鍊路的依賴關系如下:

部署Zipkin分布式性能追蹤日志系統的操作記錄(npm安裝)

完成鍊路調用的記錄後,如何來計算調用的延遲呢,這就需要利用

Annotation

資訊:

部署Zipkin分布式性能追蹤日志系統的操作記錄(npm安裝)

總結兩點:

1)使用zipkin,必須使用java8

2)在生産環境,不會對每個請求都進行采樣追蹤(降低trace對整個服務的性能損耗)

-------------------------------------------------------------------

還可以考慮使用下面的架構:

部署Zipkin分布式性能追蹤日志系統的操作記錄(npm安裝)

kafka是使用zookeeper來管理的(kafka在Zookeeper中注冊的位址)

在zipkin網頁上選擇要看的項目後,點選Find Traces檢視

https://blog.csdn.net/konglongaa/article/details/58016398

繼續閱讀