導讀:做爲鳳睛早期的接入方、後期的核心成員,筆者經歷了整個項目先後四年的變遷,看過項目的艱難開端、中期的默默積累以及後期的蓬勃發展。每一次架構的變遷都帶着技術浪潮的烙印,也看到項目成員利用有限資源來解決實際問題而持續不斷的創新。 前端
鳳睛是百度商業業務系統的性能監控系統(APM),它側重於對Java應用的監控,基本接入了百度絕大部分Java應用(覆蓋數千個業務應用,數萬個容器)。它可以對主流中間件框架( Spring Web、RPC、數據庫、緩存等)進行自動埋點,實現全棧式性能監控和全鏈路追蹤診斷,爲百度各業務線提供微服務系統性能指標、業務黃金指標、健康情況、監控告警等。java
△鳳睛產品流程圖mysql
△鳳睛的架構變遷時間線spring
01 鳳睛立項sql
項目發起在2016年,百度鳳巢廣告業務系統中間件 (分佈式RPC框架 Stargate等、配置中心、數據庫中間件等)已經完善。隨着單體服務拆分的深刻,總體Java在線上部署規模逐漸變多,同時,暴露的問題也愈來愈多。數據庫
典型的問題有:後端
鳳巢業務端急需一個分佈式追蹤系統來完成整個業務端日誌的「大串聯」。因此百度商業平臺基礎架構組發起了鳳睛的項目,名曰「鳳巢之眼」。緩存
02 鳳睛1.0springboot
在分佈式鏈路追蹤領域,探針採集這個環節主要存在侵入式和無侵入式。1.0探針走的侵入方式。業務開發人員首先引入探針相關的依賴 jar 包,經過攔截器自動收集調用關係以及性能數據;而後,添加硬編碼補充業務數據。架構
△編碼示例
探針採集的數據會被打印到磁盤,經過kafka收集走。底層的數據處理和數據存儲採用了Storm、 Hbase等當時流行的數據處理系統。後端架構比較複雜。
△鳳睛1.0架構示意圖
03 鳳睛2.0
鳳睛2.0版本中,首先是下降探針接入成本。2.0版本中,探針改用java agent技術結合cglib 作AOP註解,把依賴引入的jar 包從N個下降到1個。從編寫大段的調用鏈填充代碼改成儘可能走AOP。探針端傳輸層採用了更高效的傳輸協議(protobuffer+gzip), 直接經過 HTTP 協議發送到 kafka,大大了下降磁盤IO開銷。
2.0探針較1.0接入方便,傳輸也更快。可是仍需業務方添加AOP代碼。對於業務端數以百計的應用來講,接入仍然是大工程,推廣依然困難。
04 鳳睛3.0
鳳睛3.0架構設計中,項目組成員一直在思考兩個問題:
爲了解決問題1,探針3.0 決定徹底放棄侵入式方式,改成無侵入即字節碼加強方式。
對當時幾種流行的監控診斷工具進行了調研:
△Newrelic,pinpoint,greys監控探針調研
3.0探針參考了Greys支持運行時加強的特色以及 pinpoint、Newrelic基於插件擴展開發的設計理念。最終效果是探針可以自動對業務進程植入監控代碼,監控具體工做交由插件體系完成,徹底面向切面監控。
△探針主動加載示意圖
後端存儲系統轉而依託Doris。Doris是百度自研的基於 MPP 的交互式 SQL 數據倉庫,兼容mysql協議,學習成本低。既能夠作存儲又能夠作分析計算,初期避免引入spark,storm等技術,下降系統複雜度。
△架構設計如圖所示
架構升級後,做爲小團隊,也能快速批量部署探針,計算存儲能力也能知足需求。截止2017年,鳳睛3.0上線了100多個應用,跑在1000多個容器上面。
05 鳳睛4.0
2018年,微服務和虛擬化浪潮席捲而來。隨着部署平臺的不斷升級和 springboot體系的成熟完善,單體可以被快速拆分紅了數目衆多的微服務,依託平臺進行高效的運維部署。鳳睛做爲基礎組件被微服務託管平臺集成,並獲得公司級的推廣應用,總體部署應用規模從百級別激增到了千級別,部署容器從千級別變成了萬級別。
這個階段爆發了不少問題,技術核心問題主要有兩點:
2019年,鳳睛進行了進一步的改造升級,針對一、2兩個問題,進行了技術攻堅。
探針層面研究如何支持熱插拔,也就是探針在業務進程運行的狀況下自動完成升級。起初爲了保證業務類對探針插件類的可見性,探針類統一放到了 System Classloader裏。可是System Classloader 做爲系統默認的,不支持卸載。反之,若是把探針類所有放到自定義類加載器中。探針類則對業務類徹底不可見,也就沒法完成字節碼加強。
△探針熱插拔classloader體系
爲了解決可見性問題,探針引入了橋接類,經過橋接類提供的代碼樁和插件類庫投影,用戶類能夠訪問實際使用的探針類,完成監控改造的目的。對於不一樣插件,則放在不一樣的自定義 Classloader 裏面。這樣來插件之間互不可見。單個插件也能夠完成熱插拔。具體的設計細節後面會有文章詳細解讀。
毋庸置疑,鳳睛探針是業界惟一可以熱插拔的監控探針技術,咱們也申請了專利。它的功能正確性和性能是經歷過大規模線上流量驗證的。
繼續推動優化調用鏈檢索的性能。
首先分析下咱們的底層存儲結構:
經過對慢查詢的分析,發現檢索慢主要是兩個緣由:一是大量查詢沒有走任何索引,全表掃描海量數據很是慢。二是,導入碎片過多,致使文件Compaction特別慢,典型的LSM-Tree 的讀放大。爲了解決這些問題,調用鏈存儲層重構表結構,經過大量Rollup配合基本表,優化查詢時間。Doris 此時已經具有流式導入的能力,也藉機從小批量導入切換到流式導入。
△調用鏈處理架構
△上圖是鳳睛實時構建的微服務全景拓撲圖。截止2020年1月,大概涵蓋了數十條產品線的線上流量拓撲,最細粒度的節點爲接口,即 Java 應用中的函數。從圖中能夠分析出,託管全平臺非孤島接口節點大概有50w+,接口節點連線200w+ 條。
06 數據處理架構分離
架構繼續演進,鳳睛採集的數據量愈來愈多,業務方需求也愈來愈多。
主要面臨兩個問題:
這兩個問題歸根結底是時序數據如何存儲和展示。這涉及到分佈式追蹤領域兩個很基礎的概念,時序時間和調用鏈數據。所謂的時序數據是基於時間的一系列的數據,用於查看一些指標數據和指標趨勢。調用鏈數據是指記錄一個請求的所有流程,用於查看請求在哪一個環節出了故障,系統的瓶頸在哪兒。
時序數據不須要保存細節,只存時間、維度和指標的數據點, 能夠存儲在專門的時間序列數據庫(Time Series Database)。實際場景中,鳳睛沒有專門去維護一個時序數據庫。而是對接百度SIA智能監控平臺的分佈式時序數據庫TSDB。同時,利用百度SIA平臺提供豐富的多維可視化分析報表,用以解決用戶各類可視化多維度數據分析的需求。
△當前總體的架構
07 結語
鳳睛整個項目先後持續了4年,中間經歷過無數的困難和坎坷,經過積累了項目成員們持續的付出,最終取得里程碑式的成果。本文簡要介紹了鳳睛產品的業務背景、技術架構和產品形態,後續會繼續發文介紹技術相關的實現細節,歡迎持續關注。
推薦閱讀
最後歡迎各位關注咱們的同名公衆號「百度Geek說」~