分散式系統呼叫鏈監控

超人汪小建發表於2017-05-10

分散式系統呼叫鏈監控

  • 應用架構由集中式向分散式演進後,整個呼叫關係變得複雜。
  • 分散式架構由複雜且較大規模叢集構成,各個應用之間相當獨立,可能由不同團隊、不同語言實現。
  • 系統一個完整的呼叫過程可能橫跨多個服務及資料中心。
  • 複雜的呼叫導致系統出問題後難以定位問題。
  • 無法準確知道整體系統效能及執行情況。

全鏈路效能監控

一個請求完整的呼叫鏈可能如下圖,經過多個系統服務,呼叫關係複雜。

分散式系統呼叫鏈監控

期間我們會關注各個呼叫的各項效能指標,比如吞吐量(TPS)、響應時間及錯誤記錄等。

  • 吞吐量,根據拓撲可相應計算元件、平臺、物理裝置的實時吞吐量。
  • 響應時間,包括整體呼叫的響應時間和各個服務的響應時間等。
  • 錯誤記錄,根據服務返回統計單位時間異常次數。

全鏈路效能監控從整體維度到區域性維度展示各項指標,將跨應用的所有呼叫鏈效能資訊集中展現,可方便度量整體和區域性效能,並且方便找到故障產生的源頭,生產上可極大縮短故障排除時間。

Google Dapper

系統整個呼叫鏈

  1. 當使用者發起一個請求時,首先到達前端A服務,然後分別對B服務和C服務進行RPC呼叫;
  2. B服務處理完給A做出響應,但是C服務還需要和後端的D服務和E服務互動之後再返還給A服務,最後由A服務來響應使用者的請求;
    分散式系統呼叫鏈監控

對整個呼叫過程的追蹤

  1. 請求到來生成一個全域性TraceID,通過TraceID可以串聯起整個呼叫鏈,一個TraceID代表一次請求。
  2. 除了TraceID外,還需要SpanID用於記錄呼叫父子關係。每個服務會記錄下parent id和span id,通過他們可以組織一次完整呼叫鏈的父子關係。
  3. 一個沒有parent id的span成為root span,可以看成呼叫鏈入口。
  4. 所有這些ID可用全域性唯一的64位整數表示;
  5. 整個呼叫過程中每個請求都要透傳TraceID和SpanID。
  6. 每個服務將該次請求附帶的TraceID和附帶的SpanID作為parent id記錄下,並且將自己生成的SpanID也記錄下。
  7. 要檢視某次完整的呼叫則只要根據TraceID查出所有呼叫記錄,然後通過parent id和span id組織起整個呼叫父子關係。

分散式系統呼叫鏈監控

呼叫鏈監控核心工作

  • 呼叫鏈資料的生成,對整個呼叫過程的所有應用進行埋點並輸出日誌。
  • 呼叫鏈資料採集,對各個應用中的日誌資料進行採集。
  • 呼叫鏈資料儲存及查詢,對採集到的資料進行儲存,由於日誌資料量一般都很大,不僅要能對其儲存,還需要能提供快速查詢。
  • 指標運算、儲存及查詢,對採集到的日誌資料進行各種指標運算,將運算結果儲存起來。
  • 告警功能,提供各種閥值警告功能。

整體架構

分散式系統呼叫鏈監控

  • 通過AGENT生成呼叫鏈日誌。
  • 通過logstash採集日誌到kafka。
  • kafka負責提供資料給下游消費。
  • storm計算匯聚指標結果並落到es。
  • storm抽取trace資料並落到es,這是為了提供比較複雜的查詢。比如通過時間維度查詢呼叫鏈,可以很快查詢出所有符合的traceID,根據這些traceID再去hbase查資料就快了。
  • logstash將kafka原始資料拉取到hbase中。hbase的rowkey為traceID,根據traceID查詢是很快的。

AGENT無侵入部署

通過AGENT代理的無侵入式部署,將效能測量與業務邏輯完全分離,可以測量任意類的任意方法的執行時間,這種方式大大提高了採集效率,並且減少運維成本。根據服務跨度主要分為兩大類AGENT:

  • 服務內AGENT,這種方式是通過Java的agent機制,對服務內部的方法呼叫層次資訊進行資料收集,如方法呼叫耗時、入參、出參等資訊。

  • 跨服務AGENT,這種情況需要對主流RPC框架以外掛形式提供無縫支援。並通過提供標準資料規範以適應自定義RPC框架:

  1. Dubbo支援
  2. Rest支援
  3. 自定義RPC支援

比如生成的資料格式如下:

{
    "hostIp": "192.168.4.1",
    "instanceName": "TracingDemo",
    "isEntry": true,
    "errCode": 0,
    "spanId": "3cbfe7f0-141c-4597-8b15-38d2fb145e01",
    "parentId": "16a52a9f-e697-45ce-92fb-7395339eae4b",
    "traceId": "e5549498-60f3-4870-8483-fe26f6d0367b",
    "className": "dao.impl.ProductDaoImpl",
    "methodName": "queryProduct",
    "inParam": "",
    "createTime": 1448442004537,
    "returnTime": 1448442004537,
    "callTime": 5
}複製程式碼

呼叫鏈監控好處

  • 準確掌握生產一線應用部署情況;
  • 從呼叫鏈全流程效能角度,識別對關鍵呼叫鏈,並進行優化。
  • 提供可追溯的效能資料,量化 IT 運維部門業務價值。
  • 快速定位程式碼效能問題,協助開發人員持續性的優化程式碼;
  • 協助開發人員進行白盒測試,縮短系統上線穩定期。

一些效果圖

分散式系統呼叫鏈監控

分散式系統呼叫鏈監控

分散式系統呼叫鏈監控

====廣告時間,可直接跳過====

鄙人的新書《Tomcat核心設計剖析》已經在京東預售了,有需要的朋友可以到 item.jd.com/12185360.ht… 進行預定。感謝各位朋友。

=========================

歡迎關注:

分散式系統呼叫鏈監控

相關文章