天天看點

分布式鍊路追蹤 Skywalking

1. Skywalking 概述

1.1 什麼是APM系統

APM (Application Performance Management)即應用性能管理系統,是對企業系統即時監控以實作對應用程式性能管理和故障管理的系統化的解決方案,應用性能管理,主要針對企業的關鍵業務應用進行監測、優化,提高企業應用的可靠性和品質,保證使用者得到良好的服務,降低 IT 總擁有成本

APM 系統是可以幫助了解系統行為,用于分析性能問題的工具,以便發生故障的時候,能夠快速定位和解決問題

1.2 分布式鍊路追蹤

随着分布式系統和微服務架構的出現,一次使用者的請求會經過多個系統,不同服務之間的調用關系十分複雜,任何一個系統出錯都可能影響整個請求的處理結果。以往的監控系統往往隻能知道單個系統的健康狀況、一次請求的成功失敗,無法快速定位失敗的根本原因。

分布式鍊路追蹤 Skywalking

除此之外,複雜的分布式系統也面臨這下面這些問題:

  • 性能分析:一個服務依賴很多服務,被依賴的服務也依賴了其他服務。如果某個接口耗時突然變長了,那未必是直接調用的下遊服務慢了,也可能是下遊的下遊慢了造成的,如何快速定位耗時變長的根本原因呢?
  • 鍊路梳理:需求疊代很快,系統之間調用關系變化頻繁,靠人工很難梳理清楚系統鍊路拓撲(系統之間的調用關系)。

為了解決這些問題,Google 推出了一個分布式鍊路跟蹤系統Dapper,之後各個網際網路公司都參照Dapper 的思想推出了自己的分布式鍊路跟蹤系統,而這些系統就是分布式系統下的APM系統。

1.3 什麼是OpenTracing?

分布式鍊路跟蹤最先由Google在Dapper論文中提出,而OpenTracing通過提供平台無關、廠商無關的API,使得開發人員能夠友善的添加(或更換)追蹤系統的實作。

下圖是一個分布式調用的例子,用戶端發起請求,請求首先到達負載均衡器,接着經過認證服務,訂單服務,然後請求資源,最後傳回結果。

分布式鍊路追蹤 Skywalking

雖然這種圖對于看清各元件的組合關系是很有用的,但是存在下面兩個問題:

  • 它不能很好顯示元件的調用時間,是串行調用還是并行調用,如果展現更複雜的調用關系,會更加複雜,甚至無法畫出這樣的圖。
  • 這種圖也無法顯示調用間的時間間隔以及是否通過定時調用來啟動調用。

一種更有效的展現一個調用過程的圖:

分布式鍊路追蹤 Skywalking

基于OpenTracing我們就可以很輕松的建構出上面這幅圖。

1.4 主流的開源APM産品

PinPoint

Pinpoint是由一個南韓團隊實作并開源,針對Java編寫的大規模分布式系統設計,通過JavaAgent的機制做位元組代碼植入,實作加入traceid和擷取性能資料的目的,對應用代碼零侵入。

官方網站:https://github.com/naver/pinpoint

分布式鍊路追蹤 Skywalking

Skywalking

SkyWalking是apache基金會下面的一個開源APM項目,為微服務架構和雲原生架構系統設計。它通過探針自動收集所需的名額,并進行分布式追蹤。通過這些調用鍊路以及名額,Skywalking APM會感覺應用間關系和服務間關系,并進行相應的名額統計。Skywalking支援鍊路追蹤和監控應用元件基本涵蓋主流架構和容器,如國産RPC Dubbo和motan等,國際化的spring boot,spring cloud。

官方網站: http://skywalking.apache.org/

Zipkin

Zipkin是由Twitter開源,是分布式鍊路調用監控系統,聚合各業務系統調用延遲資料,達到鍊路調用監控跟蹤。Zipkin基于Google的Dapper論文實作,主要完成資料的收集、存儲、搜尋與界面展示。

官方網址:https://zipkin.io

分布式鍊路追蹤 Skywalking

CAT

CAT是由大衆點評開源的項目,基于Java開發的實時應用監控平台,包括實時應用監控,業務監控,可以提供十幾張報表展示。

官方網站:https://github.com/dianping/cat

2. 什麼是 Skywalking

2.1 Skywalking 概述

官方解釋:Skywalking是一個可觀測性分析平台(Observability Analysis Platform簡稱OAP)和應用性能管理系統(Application Performance Management簡稱APM)。提供分布式鍊路追蹤、服務網格(Service Mesh)遙測分析、度量(Metric)聚合和可視化一體化解決方案。

下面是Skywalking的幾大特點:

  • 多語言自動探針,Java,.NET Core和Node.JS。
  • 多種監控手段,語言探針和service mesh。
  • 輕量高效。不需要額外搭建大資料平台。
  • 輕量高效。不需要額外搭建大資料平台。
  • 支援告警。
  • 優秀的可視化效果。

Skywalking 整體架構如下:

分布式鍊路追蹤 Skywalking

Skywalking提供Tracing和Metrics資料的擷取和聚合

Metric的特點是,它是可累加的:他們具有原子性,每個都是一個邏輯計量單元,或者一個時間段内的柱狀圖。例如:隊列的目前深度可以被定義為一個計量單元,在寫入或讀取時被更新統計;輸入HTTP請求的數量可以被定義為一個計數器,用于簡單累加;請求的執行時間可以被定義為一個柱狀圖,在指定時間片上更新和統計彙總

Tracing的最大特點就是,它在單次請求的範圍内,處理資訊。任何的資料、中繼資料資訊都被綁定到系統中的單個事務上。例如:一次調用遠端服務的RPC執行過程;一次實際的SQL查詢語句;一次HTTP請求的業務性ID。

總結: Metric主要用來進行資料的統計,比如HTTP請求數的計算。Tracing主要包含了某一次請求的鍊路資料。

詳細的内容可以檢視Skywalking開發者吳晟翻譯的文章,

Metrics, tracing 和 logging 的關系:http://blog.oneapm.com/apm-tech/811.html

整體架構包含如下三個組成部分:

  1. 探針(agent)負責進行資料的采集,包含了 Tracing 和 Metrics 的資料,agent 會被安裝到服務所在的伺服器上,以友善資料的擷取
  2. 可觀測分析平台 OAP(Observability Analysis Platform),接收探針發送的資料,并在記憶體中使用分析引擎(Analysis Core)進行資料的整合運算,然後将資料存儲到對應的存儲媒體上,比如:ElasticSearch、Mysql 資料庫、H2 資料庫等。同時 OAP 還使用查詢引擎(Query Core)提供 Http 查詢接口
  3. Skywalking 提供單獨的 UI 進行資料的檢視,此時 UI 會調用 OAP 提供的接口,擷取對應的資料然後進行展示

2.2 Skywalking 優勢

Skywalking相比較其他的分布式鍊路監控工具,具有以下特點:

  • 社群相當活躍。Skywalking已經進入apache孵化,目前的start數已經超過11K,最新版本6.5.0已經釋出。開發者是國人,可以直接和項目發起人交流進行問題的解決。
  • Skywalking支援Java,.NET Core和Node.JS語言。相對于其他平台:比如Pinpoint支援Java和PHP,具有較大的優勢。
  • 探針無傾入性。對比CAT具有傾入性的探針,優勢較大。不修改原有項目一行代碼就可以進行內建。
  • 探針性能優秀。有網友對Pinpoint和Skywalking進行過測試,由于Pinpoint收集的資料過多,是以對性能損耗較大,而Skywalking探針性能十分出色。
  • 支援元件較多。特别是對Rpc架構的支援,這是其他架構所不具備的。Skywalking對Dubbo、gRpc等有原生的支援,甚至連小衆的motan和sofarpc都支援。

2.3 Skywalking 主要概念介紹

使用如下案例來進行Skywalking主要概念的介紹,Skywalking主要概念包含:

  • 服務(Service)
  • 端點(Endpoint)
  • 執行個體(Instance)
分布式鍊路追蹤 Skywalking

上圖中,我們編寫了使用者服務,這是一個web項目,在生産中部署了兩個節點:192.168.1.100和192.168.1.101。

  • 使用者服務就是Skywalking的服務(Service),使用者服務其實就是一個獨立的應用(Application),在6.0之後的Skywalking将應用更名為服務(Service)。
  • 使用者服務對外提供的HTTP接口/usr/queryAll就是一個端點,端點就是對外提供的接口。
  • 192.168.1.100和192.168.1.101這兩個相同服務部署的節點就是執行個體,執行個體指同一服務可以部署多個。

3. 環境搭建

接下來我們在虛拟機CentOS中搭建Skywalking的可觀測性分析平台OAP環境。Skywalking預設使用H2記憶體中進行資料的存儲,我們可以替換存儲源為ElasticSearch保證其查詢的高效及可用性。

具體的安裝步驟可以在Skywalking的官方github上找到:https://github.com/apache/skywalking/blob/master/docs/en/setup/README.md

我們不用 Skywalking 預設的 H2 記憶體資料庫存儲,我們用 ElasticSearch

3.1 安裝 ElasticSearch

1). 建立目錄

mkdir /usr/local/skywalking
           

建議将虛拟機記憶體設定為 3G并且将 CPU 設定為2核,防止資源不足

2).将資源目錄中的elasticsearch和skywalking安裝包上傳到虛拟機/usr/local/skywalking目錄下。

elasticsearch-6.4.0.tar.gz —elasticsearch 6.4的安裝包,Skywalking對es版本号有一定要求,最好使用6.3.2以上版本,如果是7.x版本需要額外進行配置。

這裡我們選擇 Skywalking 的版本: apache-skywalking-apm-6.5.0.tar.gz - 放到 /usr/local/skywalking 路徑下

3). 首先安裝elasticsearch,将壓縮包解壓。

tar -zxvf ./elasticsearch-6.4.0.tar.gz
           

修改Linux系統的限制配置,将檔案建立數修改為65536個。

  1. 修改系統中允許應用最多建立多少檔案等的限制權限。Linux預設來說,一般限制應用最多建立的檔案是65535個。但是ES至少需要65536的檔案建立數的權限。
  2. 修改系統中允許使用者啟動的程序開啟多少個線程。預設的Linux限制root使用者開啟的程序可以開啟任意數量的線程,其他使用者開啟的程序可以開啟1024個線程。必須修改限制數為4096+。因為ES至少需要4096的線程池預備。
vi /etc/security/limits.conf
           

#新增如下内容在limits.conf檔案中

es soft nofile 65536
es hard nofile 65536
es soft nproc 4096
es hard nproc 4096
           

修改系統控制權限,ElasticSearch需要開辟一個65536位元組以上空間的虛拟記憶體。Linux預設不允許任何使用者和應用程式直接開辟這麼大的虛拟記憶體。

vi  /etc/sysctl.conf
           
新增如下内容在 sysctl.conf 檔案中,目前使用者擁有的記憶體權限大小
vm.max_map_count=2621444
           
讓系統控制權限配置生效
sysctl -p
           

建一個使用者,用于ElasticSearch啟動。

ES在5.x版本之後,強制要求在linux中不能使用root使用者啟動ES程序。是以必須使用其他使用者啟動ES程序才可以。
//建立使用者
useradd  es

//修改上述使用者的密碼
passwd es

//修改 elasticsearch 目錄的擁有者
chown -R es elasticsearch-6.4.0
           

使用 es 使用者啟動 elasticsearch

(這裡前提是你的 環境有Jhttava 環境,我本地是安裝了 Java 8 的)

分布式鍊路追蹤 Skywalking
//切換使用者
su es
到 ElasticSearch 的bin 目錄下
cd bin/
//背景啟動
./elasticsearch -d
           

預設ElasticSearch是不支援跨域通路的,是以在不修改配置檔案的情況下我們隻能從虛拟機内部進行通路測試ElasticSearch是否安裝成功,使用curl指令通路9200端口:

如果顯示如下資訊,就證明 ElasticSearch 安裝成功:

{
  "name" : "t1NeDBq",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "Lp6-FW3EQz20rw2C-2NCyw",
  "version" : {
    "number" : "6.4.0",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "595516e",
    "build_date" : "2018-08-17T23:18:47.308994Z",
    "build_snapshot" : false,
    "lucene_version" : "7.4.0",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

           

3.2 安裝 Skywalking

分為兩個步驟

  • 安裝 Bckend 後端服務
  • 安裝 UI

首先切換到 root 使用者,切換到目錄下,解壓 Skywalking 壓縮包

切換到root 使用者
su root
切換到 skywalking 目錄
cd /usr/local/skywalking
解壓壓縮包
tar zxvf apache-skywalking-apm-6.5.0.tar.gz 
           

修改Skywalking存儲的資料源配置:

cd apache-skywalking-apm-bin
vi config/application.yml
           

我們可以看到預設配置中,使用了H2作為資料源。我們将其全部注釋。

#  h2:
#    driver: ${SW_STORAGE_H2_DRIVER:org.h2.jdbcx.JdbcDataSource}
#    url: ${SW_STORAGE_H2_URL:jdbc:h2:mem:skywalking-oap-db}
#    user: ${SW_STORAGE_H2_USER:sa}
#    metadataQueryMaxSize: ${SW_STORAGE_H2_QUERY_MAX_SIZE:5000}

           

将ElasticSearch對應的配置取消注釋:

elasticsearch:
    nameSpace: ${SW_NAMESPACE:""}
    clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:localhost:9200}
    protocol: ${SW_STORAGE_ES_HTTP_PROTOCOL:"http"}
    trustStorePath: ${SW_SW_STORAGE_ES_SSL_JKS_PATH:"../es_keystore.jks"}
    trustStorePass: ${SW_SW_STORAGE_ES_SSL_JKS_PASS:""}
    user: ${SW_ES_USER:""}
    password: ${SW_ES_PASSWORD:""}
    indexShardsNumber: ${SW_STORAGE_ES_INDEX_SHARDS_NUMBER:2}
    indexReplicasNumber: ${SW_STORAGE_ES_INDEX_REPLICAS_NUMBER:0}
#    # Those data TTL settings will override the same settings in core module.
    recordDataTTL: ${SW_STORAGE_ES_RECORD_DATA_TTL:7} # Unit is day
    otherMetricsDataTTL: ${SW_STORAGE_ES_OTHER_METRIC_DATA_TTL:45} # Unit is day
    monthMetricsDataTTL: ${SW_STORAGE_ES_MONTH_METRIC_DATA_TTL:18} # Unit is month
#    # Batch process setting, refer to https://www.elastic.co/guide/en/elasticsearch/client/java-api/5.5/java-docs-bulk-processor.html
    bulkActions: ${SW_STORAGE_ES_BULK_ACTIONS:1000} # Execute the bulk every 1000 requests
    flushInterval: ${SW_STORAGE_ES_FLUSH_INTERVAL:10} # flush the bulk every 10 seconds whatever the number of requests
    concurrentRequests: ${SW_STORAGE_ES_CONCURRENT_REQUESTS:2} # the number of concurrent requests
    resultWindowMaxSize: ${SW_STORAGE_ES_QUERY_MAX_WINDOW_SIZE:10000}
    metadataQueryMaxSize: ${SW_STORAGE_ES_QUERY_MAX_SIZE:5000}

           

預設使用了localhost下的ES,是以我們可以不做任何處理,直接進行使用。啟動OAP程式:

bin/oapService.sh
           

這樣安裝Backend後端服務就已經完畢了,接下來我們安裝UI。先來看一下UI的配置檔案:

catwebapp/webapp.yml
           
#預設端口,我們改為8000
server:
  port: 8000

collector:
  path: /graphql
  ribbon:
    ReadTimeout: 10000
    # Point to all backend's restHost:restPort, split by ,#OAP服務,如果有多個用逗号隔開
    listOfServers: 127.0.0.1:12800

           

目前的預設配置不用修改就可以使用,啟動UI程式:

/bin/webappService.sh
           

然後我們就可以通過浏覽器通路Skywalking的可視化頁面了,通路位址:http://虛拟機IP位址:8080,如果出現下面的圖,就代表安裝成功了

./bin/startup.sh 可以同時啟動backend和ui,後續可以執行該檔案進行重新開機。

分布式鍊路追蹤 Skywalking

4. Skywalking 基礎

4.1 agent 的使用

agent 探針可以讓我們不修改代碼的情況下,對 java應用上使用到的元件進行動态監控,擷取運作資料發送到OAP上進行統計和存儲。agent探針在java中是使用java agent技術實作的,不需要更改任何代碼,java agent會通過虛拟機(VM)接口來在運作期更改代碼。

Agent探針支援 JDK 1.6 - 12的版本,Agent探針所有的檔案在Skywalking的agent檔案夾下。檔案目錄如下;

+--  agent
     +-- activations
         apm-toolkit-log4j-1.x-activation.jar
         apm-toolkit-log4j-2.x-activation.jar
         apm-toolkit-logback-1.x-activation.jar
         ...
    //配置檔案
    +-- config
          agent.config
    //元件的所有插件
    +-- plugins
        apm-dubbo-plugin.jar
        apm-feign-default-http-9.x.jar
        apm-httpClient-4.x-plugin.jar
        .....
    //可選插件
    +-- optional-plugins
         apm-gson-2.x-plugin.jar
         ......
    +-- bootstrap-plugins
         jdk-http-plugin.jar
         ......
    +-- logs
        skywalking-agent.jar

           

部分插件在使用上會影響整體的性能或者由于版權問題放置于可選插件包中,不會直接加載,如果需要使用,将可選插件中的jar包拷貝到plugins包下。

由于沒有修改agent探針中的應用名,是以預設顯示的是Your_ApplicationName。我們修改下應用名稱,讓他顯示的更加正确。編輯agent配置檔案:

cd /usr/local/skywalking/apache-skywalking-apm-bin/agent/config
vi agent.config
           

我們在配置中找到這麼一行:

#TheservicenameinUI
agent.service_name=${SW_AGENT_NAME:Your_ApplicationName}
           

這裡的配置含義是可以讀取到SW_AGENT_NAME配置屬性,如果該配置沒有指定,那麼預設名稱為Your_ApplicationName。這裡我們把Your_ApplicationName替換成我們想要的名稱:skywalking_tomcat

#TheservicenameinUI
agent.service_name=${SW_AGENT_NAME:skywalking_tomcat}
           

4.1.1 Skywalking 在 Tomcat7和8 的使用

需要先準備一個Spring Mvc項目,在資源中已經提供了打包好的檔案

skywalking_springmvc-1.0-SNAPSHOT.war

将資源檔案下的apache-tomcat-8.5.47.tar.gz檔案上傳至虛拟機/usr/local/skywalking目錄下,然後解壓:

将war包上傳至webapps/下。編輯tmcat的 /bin/catalina.sh檔案,在檔案頂部添加:

CATALINA_OPTS="$CATALINA_OPTS-javaagent:/usr/local/skywalking/apache-skywalking-apm-bin/agent/skywalking-agent.jar";exportCATALINA_OPTS
           

修改tomcat啟動端口:

執行bin目錄下的./startup.sh 檔案啟動tomcat。然後通路位址:

此時再通路Skywalking的頁面,會發現出現了一個服務和端點,同時有一筆調用顯示了調用的應用名和接口位址。

4.1.2 SpringBoot 中使用

Skywalking與Spring Boot內建提供了完善的支援。

1、首先我們複制一份agent,防止與tomcat使用的沖突。

cd /usr/local/skywalking/apache-skywalking-apm-bin/
cp -r agent agent_boot
vi agent_boot/config/agent.config
           

修改配置中的應用名為:skywalking_boot

2、将資源檔案夾中skywalking_springboot.jar檔案上傳到/usr/local/skywalking目錄下。提供了一個正常通路的接口和一個異常通路接口:

(你自己本地搞一個 jar 包也行)

使用指令啟動spring boot項目:

使用jar包啟動的項目如果需要內建skywalking,需要添加-javaagent參數,參數值為agent的jar包梭子啊位置。

-Dserver.port參數用于指定端口号,防止與tomcat沖突。

末尾添加&背景運作模式啟動Spring Boot項目。

最後通路接口,稍等片刻通路Skywalking的UI頁面。

4.2 RocketBot的使用

Skywalking的監控UI頁面成為RocketBot,我們可以通過8080端口進行通路,由于8080端口很容易沖突,可以修改webapp/webapp.yml來更改啟動端口:修改為 8000

4.2.1 儀表盤

打開RocketBot預設會出現儀表盤頁面:

分布式鍊路追蹤 Skywalking

儀表盤頁面分為兩大塊:

  • 服務儀表盤,展示服務的調用情況
  • 資料庫儀表盤,展示資料庫的響應時間等資料

選中服務儀表盤,有四個次元的統計資料可以進行檢視:

  • 全局,檢視全局接口的調用,包括全局響應時長的百分比,最慢的端點,服務的吞吐量等
  • 服務,顯示服務的響應時長、SLA、吞吐量等資訊
  • 端點,顯示端點的響應時長、SLA、吞吐量等資訊
  • 執行個體,顯示執行個體的響應時長、SLA、吞吐量等資訊,還可以檢視執行個體的JVM的GC資訊、CPU資訊、記憶體資訊

4.2.2 拓撲圖

Skywalking 提供拓撲圖,直覺地檢視服務之間的調用關系:

(内容很多。未寫完,每天都會繼續寫!!!)

(内容很多。未寫完,每天都會繼續寫!!!)

繼續閱讀