阿里巴巴鷹眼系統瞭解

業務背景

上圖是 2012 年淘寶核心業務應用關係的拓撲圖,還不包含了其他的非核心業務應用,所謂的核心業務就是和交易相關的,和錢相關的業務。這張圖大家可能看不清楚,看不清楚纔是正常的,因爲當時的阿里應用數量之多、應用間關係之混亂靠人工確實已經無法理清楚了。

基於微服務體系之下構建的業務系統存在的問題基本上分爲四類:

第一個是故障定位難,今天我們淘寶下單的動作,用戶在頁面上點購買按鈕,這麼一個簡單操作,其實它背後是由十幾個甚至數十個的微服務去共同完成的,這十幾個甚至幾十個微服務也由不同的團隊去負責,這是微服務的過度協同帶來的結果,一旦出現問題,最壞情況下我們也許就要拉上十幾個團隊一起來看問題。

第二個問題是容量預估難,阿里每年要做若干次大促活動,在以前的巨石系統當中做容量預估是非常容易的,因爲我們大促時候按照預估的流量與當前系統的單機壓測容量做一個對比,把所有的系統按比例去擴容就可以了。而實際上在大促的場景下,每一個系統在覈心鏈路當中的參與度、重要性都是不一樣的,我們並不能對每一個系統做等比例的擴容,所以微服務架構下的容量預估也是一件難事。

第三個問題就是資源浪費多,資源浪費多首先是容量預估不準的一個後果,同時資源浪費多背後隱含的另一個問題就是性能優化難,爲什麼這麼說呢?我們當打開一個頁面發現它慢的時候,我根本不知道這個頁面慢在哪裏,瓶頸在哪裏,怎麼去優化,這些問題累積下來,資源的浪費也成爲了一個巨大的問題。

第四個是鏈路梳理難,我們一個新人加入阿里的時候,老闆讓他負責一個系統,他在這個複雜的微服務體系中,就像人第一次在沒有地圖沒有導航的情況下來到一個大城市一樣,根本不知道自己身在何處。應用負責人不知道自己的系統被誰依賴了,也不知道自己的系統下游會影響其他哪些人。

鷹眼是什麼

鷹眼就是主要的目的就是解決上面所說的這四個問題,我們首先來定義一下鷹眼這個系統,它是一個以鏈路追蹤技術爲核心的監控系統,它主要的手段是通過收集、存儲、分析、分佈式系統中的調用事件數據,協助開發運營人員進行故障診斷、容量預估、性能瓶頸定位以及調用鏈路梳理。它的靈感是來自於 Google 的 Dapper。

整體技術架構

技術原理

在阿里巴巴每天有超過一萬億次的分佈式調用,這個數據其實也是很早之前統計的,如果在這一萬億次調用當中出現了一個問題,我們怎麼去定位?看一下這個例子,系統 A 調用 B,B 調用 C,在這之後 A 又調用了 D,如果 B 調 C 出了問題的話,那麼負責維護 A 系統的開發人員根本不知道問題到底出在哪裏,他只知道這次調用失敗了,那麼我們怎麼樣解決這個問題?雖然現在的很多大公司都在重複造很多輪子,但還好在阿里巴巴中間件這個東西沒有被重複造出兩個,基礎設施還是相對比較統一的。所以我們可以在一套中間件裏做統一埋點,在分佈式調用框架、分佈式消息系統、緩存系統、統一接入層、Web 框架層的發送與接收請求的地方做統一埋點,埋點的數據能夠被一套中間件在系統之間進行無縫透傳。

當用戶的請求進來的時候,我們在第一個接收到這個請求的服務器的中間件會生成唯一的 TraceID,這個 TraceID 會隨着每一次分佈式調用透傳到下游的系統當中,所有透傳的事件會存儲在 RPC log 文件當中,隨後我們會有一箇中心化的處理集羣把所有機器上的日誌增量地收集到集羣當中進行處理,處理的邏輯比較簡單,就是做了簡單清洗後再倒排索引。只要系統中報錯,然後把 TraceID 作爲異常日誌當中的關鍵字打出來,我們可以看到這次調用在系統裏面經歷了這些事情,我們通過 TraceID 其實可以很容易地看到這次調用是卡在 B 到 C 的數據庫調用,它超時了,通過這樣的方式我們可以很容易追溯到這次分佈式調用鏈路中問題到底出在哪裏。其實通過 TraceId 我們只能夠得到上面這張按時間排列的調用事件序列,我們希望得到的是有嵌套關係的調用堆棧。

要想還原調用堆棧,我們還需要另外一個東西叫做 RPCId(在 OpenTracing 中有類似的概念,叫做 SpanID),RPCId 是一個多維序列。它經過第一次鏈路的時候初始值是 0,它每進行一次深入調用的時候就變成 0.1,然後再升就是 0.1.1,它每進行一次同深度的調用,就是說 A 調完 B 以後又調了 D 就會變成 0.2,RPCId 也隨着本次調用被打印至同一份 RPC Log 中,連同調用事件本身和 TraceId 一起被採集到中心處理集羣中一起處理。

收集完了以後,我們對所有調用事件按照 RPCId 進行一個深度遍歷,我們就可以獲得這樣的一個調用堆棧,上圖中的調用堆棧實際上就是真實的淘寶交易系統裏面進行下單的交易調用堆棧,可以看到這次調用經歷了很多系統。但大家在鷹眼的視角上面來看,就好像是在本地發生的一樣,我們可以很容易地去看到如果一次調用出現了問題,那問題的現象是出現在哪裏,最後問題的根因又是發生在了哪裏。除了調用異常的返回碼之外,我們在右邊其實還可以看到每次調用的耗時是多少,我們也可以看到每一次調用如果慢了它是慢在哪裏。我們從這張圖中解釋了鷹眼是如何解決微服務四大問題中的故障定位難的問題,它可以通過倒排索引,讓用戶反查出每一次調用的全貌是怎樣的。

 

如果我們對萬億級別的調用鏈數據進行聚合,是否能夠獲得更有價值的信息?我們可以看一下,每一次調用除了它唯一標識 TraceID 和 RPCID 之外,還包含了一些標籤信息 (Tag),什麼是標籤呢?就是具備共性的, 大家都會有的這麼一些信息,比如說這次調用它分別經歷了這些系統,這些系統它每次調用的 IP 是什麼,經過哪個機房,服務名是什麼?有一些標籤是可以通過鏈路透傳下去的,比如入口 url,它透傳下去以後我就知道這次請求在下去之後發生的每一次事件都是由通過這個入口去發起的,那麼如果把這些標籤進行聚合計算,我們可以得到調用鏈統計的數據,例如按某機房標籤統計調用鏈,我們就可以得到每個機房的調用次數的趨勢圖。

 

相似組件

Zipkin 是一款開源的分佈式實時數據追蹤系統(Distributed Tracking System),基於 Google Dapper 的論文設計而來,由 Twitter公司開發貢獻。其主要功能是聚集來自各個異構系統的實時監控數據,用來追蹤微服務架構下的系統延時問題應用系統需要進行裝備(instrument)以向 Zipkin 報告數據。Zipkin 的用戶界面可以呈現一幅關聯圖表,以顯示有多少被追蹤的請求通過了每一層應用。Zipkin 以 Trace 結構表示對一次請求的追蹤,又把每個 Trace 拆分爲若干個有依賴關係的 Span。在微服務架構中,一次用戶請求可能會由後臺若干個服務負責處理,那麼每個處理請求的服務就可以理解爲一個 Span(可以包括 API 服務,緩存服務,數據庫服務以及報表服務等)。當然這個服務也可能繼續請求其他的服務,因此 Span 是一個樹形結構以體現服務之間的調用關係Zipkin 的用戶界面除了可以查看 Span 的依賴關係之外還以瀑布圖的形式顯示了每個 Span 的耗時情況可以一目瞭然的看到各個服務的性能狀況。打開每個 Span,還有更詳細的數據以鍵值對的形式呈現,而且這些數據可以在裝備應用的時候自行添加。

鏈接:zipkin:https://manzhizhen.iteye.com/blog/2348175

           鷹眼:https://www.cnblogs.com/gzxbkk/p/9600263.html

           google dapper論文:https://blog.csdn.net/yangzishiw/article/details/79402084

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章