分散式系統呼叫鏈監控
- 應用架構由集中式向分散式演進後,整個呼叫關係變得複雜。
- 分散式架構由複雜且較大規模叢集構成,各個應用之間相當獨立,可能由不同團隊、不同語言實現。
- 系統一個完整的呼叫過程可能橫跨多個服務及資料中心。
- 複雜的呼叫導致系統出問題後難以定位問題。
- 無法準確知道整體系統效能及執行情況。
全鏈路效能監控
一個請求完整的呼叫鏈可能如下圖,經過多個系統服務,呼叫關係複雜。
期間我們會關注各個呼叫的各項效能指標,比如吞吐量(TPS)、響應時間及錯誤記錄等。
- 吞吐量,根據拓撲可相應計算元件、平臺、物理裝置的實時吞吐量。
- 響應時間,包括整體呼叫的響應時間和各個服務的響應時間等。
- 錯誤記錄,根據服務返回統計單位時間異常次數。
全鏈路效能監控從整體維度到區域性維度展示各項指標,將跨應用的所有呼叫鏈效能資訊集中展現,可方便度量整體和區域性效能,並且方便找到故障產生的源頭,生產上可極大縮短故障排除時間。
Google Dapper
系統整個呼叫鏈
- 當使用者發起一個請求時,首先到達前端A服務,然後分別對B服務和C服務進行RPC呼叫;
- B服務處理完給A做出響應,但是C服務還需要和後端的D服務和E服務互動之後再返還給A服務,最後由A服務來響應使用者的請求;
對整個呼叫過程的追蹤
- 請求到來生成一個全域性TraceID,通過TraceID可以串聯起整個呼叫鏈,一個TraceID代表一次請求。
- 除了TraceID外,還需要SpanID用於記錄呼叫父子關係。每個服務會記錄下parent id和span id,通過他們可以組織一次完整呼叫鏈的父子關係。
- 一個沒有parent id的span成為root span,可以看成呼叫鏈入口。
- 所有這些ID可用全域性唯一的64位整數表示;
- 整個呼叫過程中每個請求都要透傳TraceID和SpanID。
- 每個服務將該次請求附帶的TraceID和附帶的SpanID作為parent id記錄下,並且將自己生成的SpanID也記錄下。
- 要檢視某次完整的呼叫則只要根據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框架:
- Dubbo支援
- Rest支援
- 自定義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… 進行預定。感謝各位朋友。
=========================
歡迎關注: