幾種分散式呼叫鏈監控元件的實踐與比較(二)比較
引言:繼上篇《幾種分散式呼叫鏈監控元件的實踐與比較(一)實踐》後,本篇將會講下幾種APM選型的比較與效能測試。
1. 前文回顧
上一篇文章主要講了三種分散式呼叫鏈監控元件的實踐。問題的背景由微服務架構展開,微服務的好處已經不用多說,而微服務的多了之後,千頭萬緒,下面這張圖經常被用到。
系統的複雜度因此提升。系統越複雜,越難解決問題,例如系統失敗或者效能問題。在三層架構中找到解決方案還不是太難,僅僅需要分析3個元件比如web伺服器,應用伺服器和資料庫,而伺服器數量也不多。但是,如果問題發生在n層架構中,就需要調查大量的元件和伺服器。另一個問題是僅僅分析單個元件很難看到大局;當發生一個低可見度的問題時,系統複雜度越高,就需要更長的時間來查詢原因。最糟糕的是,某些情況下我們甚至可能無法查找出來。
上面其實已經提到存在的故障定位問題,基於微服務體系之下構建的業務系統存在的問題基本上分為三類:
故障定位難,一個簡單操作,其背後可能是由十幾個微服務共同完成的,這些微服務也由不同的團隊去負責。一旦出現問題,最壞情況下我們也許需要這十幾個團隊一起來解決問題。
鏈路梳理難,應用沒有形成應用拓撲,不知道自己的服務下游會影響其他哪些人。
資源浪費多,容量預估難。對於一些服務,其消耗的cpm和memory可能連10%不到,遠遠沒有充分利用物理機。這其實和容量預估關聯,過大或者過小估算峰值的機器容量,都是浪費。
APM主要的目的就是解決上面所說的這四個問題,主要的手段是通過收集、儲存、分析、分散式系統中的呼叫事件資料,協助開發運營人員進行故障診斷、容量預估、效能瓶頸定位以及呼叫鏈路梳理。第一篇其實已經講過鏈路監控元件的需求:
程式碼的侵入性
探針的效能消耗
全面的呼叫鏈路資料分析
可擴充套件性
這邊列一下pinpoint在其wiki中提到的幾點:
分散式事務跟蹤,跟蹤跨分散式應用的訊息
自動檢測應用拓撲,幫助你搞清楚應用的架構
水平擴充套件以便支援大規模伺服器叢集
提供程式碼級別的可見性以便輕鬆定位失敗點和瓶頸
使用位元組碼增強技術,新增新功能而無需修改程式碼
下面我們沿著這些需求,看一下這幾種分散式呼叫鏈監控元件。
2. AMP比較
上面列了需求,但是不夠通用,筆者將需要對比的項提煉出來:
探針的效能
主要是agent對服務的吞吐量、CPU和記憶體的影響。微服務的規模和動態性使得資料收集的成本大幅度提高。collector的可擴充套件性
能夠水平擴充套件以便支援大規模伺服器叢集。全面的呼叫鏈路資料分析
提供程式碼級別的可見性以便輕鬆定位失敗點和瓶頸。對於開發透明,容易開關
新增新功能而無需修改程式碼,容易啟用或者禁用。完整的呼叫鏈應用拓撲
自動檢測應用拓撲,幫助你搞清楚應用的架構
筆者根據主要的需求,提煉出如上五點。
2.1 探針的效能
筆者其實也是比較關注探針的效能,畢竟APM定位還是工具,如果啟用了鏈路監控組建後,直接導致吞吐量降低過半,那也是不能接受的。筆者對skywalking、zipkin、pinpoint進行了壓測,並與基線(未使用探針)的情況進行了對比。
選用了一個常見的基於Spring的應用程式,他包含Spring Boot, Spring MVC,redis客戶端,mysql。 監控這個應用程式,每個trace,探針會抓取5個span(1 Tomcat, 1 SpringMVC, 2 Jedis, 1 Mysql)。這邊基本和skywalkingtest的測試應用差不多。
模擬了三種併發使用者:500,750,1000。使用jmeter測試,每個執行緒傳送30個請求,設定思考時間為10ms。使用的取樣率為1,即100%,這邊與產線可能有差別。pinpoint預設的取樣率為20,即50%,通過設定agent的配置檔案改為100%。zipkin預設也是1。組合起來,一共有12種。下面看下彙總表。
從上表可以看出,在三種鏈路監控元件中,skywalking的探針對吞吐量的影響最小,zipkin的吞吐量居中。pinpoint的探針對吞吐量的影響較為明顯,在500併發使用者時,測試服務的吞吐量從1385降低到774,影響很大。然後再看下CPU和memory的影響,筆者是在內部伺服器進行的壓測,對CPU和memory的影響都差不多在10%之內。
2.2 collector的可擴充套件性
collector的可擴充套件性,使得能夠水平擴充套件以便支援大規模伺服器叢集。
zipkin
在前一篇文章中,我們開發了zipkin-Server(其實就是提供的開箱即用包),zipkin-agent與zipkin-Server通過http或者mq進行通訊,http通訊會對正常的訪問造成影響,所以還是推薦基於mq非同步方式通訊,zipkin-Server通過訂閱具體的topic進行消費。這個當然是可以擴充套件的,多個zipkin-Server例項進行非同步消費mq中的監控資訊。
skywalking
skywalking的collector支援兩種部署方式:單機和叢集模式。collector與agent之間的通訊使用了gRPC。pinpoint
同樣,pinpoint也是支援叢集和單機部署的。pinpoint agent通過thrift通訊框架,傳送鏈路資訊到collector。
2.3 全面的呼叫鏈路資料分析
全面的呼叫鏈路資料分析,提供程式碼級別的可見性以便輕鬆定位失敗點和瓶頸。
zipkin
zipkin的鏈路監控粒度相對沒有那麼細,從上圖可以看到呼叫鏈中具體到介面級別,再進一步的呼叫資訊並未涉及。
skywalking
skywalking 還支援20+的中介軟體、框架、類庫,比如主流的dubbo、Okhttp,還有DB和訊息中介軟體。上圖skywalking鏈路呼叫分析擷取的比較簡單,閘道器呼叫user服務,由於支援眾多的中介軟體,所以skywalking鏈路呼叫分析比zipkin完備些。
pinpoint
pinpoint應該是這三種APM元件中,資料分析最為完備的元件。提供程式碼級別的可見性以便輕鬆定位失敗點和瓶頸,上圖可以看到對於執行的sql語句,都進行了記錄。還可以配置報警規則等,設定每個應用對應的負責人,根據配置的規則報警,支援的中介軟體和框架也比較完備。
2.4 對於開發透明,容易開關
對於開發透明,容易開關,新增新功能而無需修改程式碼,容易啟用或者禁用。我們期望功能可以不修改程式碼就工作並希望得到程式碼級別的可見性。
對於這一點,Zipkin 使用修改過的類庫和它自己的容器(Finagle)來提供分散式事務跟蹤的功能。但是,它要求在需要時修改程式碼。skywalking和pinpoint都是基於位元組碼增強的方式,開發人員不需要修改程式碼,並且可以收集到更多精確的資料因為有位元組碼中的更多資訊。
2.5 完整的呼叫鏈應用拓撲
自動檢測應用拓撲,幫助你搞清楚應用的架構。
上面三幅圖,分別展示了APM元件各自的呼叫拓撲,都能實現完整的呼叫鏈應用拓撲。相對來說,pinpoint介面顯示的更加豐富,具體到呼叫的DB名,zipkin的拓撲侷限於服務於服務之間。
3. 總結
本文講了三種分散式呼叫鏈監控元件的比較,主要從五方面著手,筆者對每一項都進了對比。至於具體選用哪款元件,大家可以根據實際的業務需求和場景進行選型,上面比較的資料僅供參考。這三款都是開源專案,一般公司都對針對實際情況進行一些二次開發,比如增加一些元件的支援、對接現存的大資料平臺等等。
最後,看了eagleEye的相關介紹,想提下監控系統如何從被動報警轉化為主動發現,其實和AIOps很密切。鏈路監控資料量很大,儘管可以通過壓縮比來降低傳輸的資料量,但是我們真的需要儲存每一條鏈路嗎?是不是隻需要識別每一個鏈路當中出現異常的情況。時序指標當中的異常點,那個時間點我們要識別出來。識別完了之後,對異常進行關聯,定位出最後的問題。當然這個涉及到業務和應用系統層面,很複雜,但筆者認為是後面AIOps的大趨勢。
參考:
Technical Overview Of Pinpoint
阿里微服務之殤及分散式鏈路追蹤技術原理
END
相關推薦
幾種分散式呼叫鏈監控元件的實踐與比較(二)比較
引言:繼上篇《幾種分散式呼叫鏈監控元件的實踐與比較(一)實踐》後,本篇將會講下幾種APM選型的比
基於星雲鏈的智慧合約與Dapp(二)——執行星雲鏈
上一篇文章講了搭建星雲私鏈的基本環境,接著我們來講講如何配置和執行星雲鏈。這裡講的只是一些基礎的介紹,為智慧合約和Dapp做準備,後期我們分析星雲鏈原始碼的時候再詳細講解。 創世區塊 在啟動星雲鏈之前,我們必須定義創世區塊的配置檔案。 創世區塊配置
幾種分散式呼叫技術的比較 -- RPC VS REST
我之前在傳統IT公司幹活,後來來了網際網路,感受到了很多不同,其中有一點就是兩者使用到的技術有一些差別。比如說分散式呼叫技術。 我在的這家公司內部的服務架構是基於Thrift的,服務基於Thrift進行釋出,以至於很多人沒有聽過、使用過Web Service。 話說傳統IT
分散式設計與開發(二)------幾種必須瞭解的分散式演算法
分散式設計與開發中有些疑難問題必須藉助一些演算法才能解決,比如分散式環境一致性問題,感覺以下分散式演算法是必須瞭解的(隨著學習深入有待新增): Paxos演算法 一致性Hash演算法 Paxos演算法 1)問題描述 分散式中有這麼一個疑難問題,客戶端向一個分散式叢集的服務
幾種協議比較(二)
以下是上述協議的簡單介紹:BSD開源協議 BSD開源協議是一個給於使用者很大自由的協議。基本上使用者可以”為所欲為”,可以自由的使用,修改原始碼,也可以將修改後的程式碼作為開源或者專有軟體再發布。 但”為所欲為”的前提當你釋出使用了BSD協議的程式碼,或則以BSD協議程式碼為基礎做二次開發自己的產品時,需要滿
2016-06-26 發布 支付系統開發的實踐與思考(一)
接口 簡單的 單向 new 成了 異步通知 平臺 應收 技術分享 通常我們在開發手機 app 或網站時都會涉及到支付相關的業務場景,用戶只需要簡單的點擊下按鈕並輸入密碼,就完成了整個支付過程。那麽今天我們就來簡單聊一下一個完整的支
區塊鏈之比特幣篇(二)
區塊 比特幣的區塊大小為1M。由區塊頭和該區塊所包含的交易列表組成。區塊頭大小為80位元組,其構成包括: 4位元組:版本號 ,記錄本區塊產生的時間。 32位元組:上一個區塊的雜湊值 ,用於追溯前一個區塊; 32位元組:交易列表的Merkle根雜湊值 ,包含本區塊的所有交易和幣基
資料結構與演算法(二)-線性表之單鏈表順序儲存和鏈式儲存
前言:前面已經介紹過資料結構和演算法的基本概念,下面就開始總結一下資料結構中邏輯結構下的分支——線性結構線性表 一、簡介 1、線性表定義 線性表(List):由零個或多個數據元素組成的有限序列; 這裡有需要注意的幾個關鍵地方: 1.首先他是一個序列,也就是說元素之間是有個先來後到的。
Zabbix監控平臺3.2.4(二)深入理解zabbix
一,Zabbix Web操作深入 1.1 Zabbix Web下的主機和模版以及監控項的新增方式 (1)建立一個模版 我們所有的功能幾乎都是在模版中定義的 我們再點進新建立的模版檢視 模版裡幾乎可以設定我們需要的所有功能 (2)在模版裡建立
vue esview 控制元件拖拽問題(二)Vue.directiove自定義命令
控制元件拖拽問題(二) initDropEvents是繫結在bind中的(droppable.js) 而這個droppable是在install_derictive.js中定義的定義命令, Vue.directive(‘droppable’,droppable)
freemarker寫select元件報錯總結(二)
1、錯誤描述 六月 25, 2014 11:32:49 下午 freemarker.log.JDK14LoggerFactory$JDK14Logger error 嚴重: Template processing error: "Macro select has no s
C# DataGridView控制元件與ListView控制元件的對比學習(二):ListView控制元件學習
一、定義: 表示Windows列表檢視控制元件,一般用來呈現資料,是一種輕量級的呈現資料的方法。 二、重要的屬性: 1、第一個非常重要的屬性是View:獲取或設定項在控制元件中的顯示方式,包括Details、LargeIcon、List、SmallI
分散式系統中的定時任務全解(二)
概述 上一篇分散式系統中的定時任務全解(一)中對定時任務和定時任務的基礎使用方式進行了說明。這一小節,把分散式場景下的定時任務進行一個大致的講解。 什麼是分散式場景呢,當單臺伺服器服務能力不夠的時候,就需要更多的伺服器進行水平向的擴充套件,由多臺伺服器分
COM元件設計與應用(十三)——事件和通知(VC6.0)
一、前言 我的 COM 元件執行時產生一個視窗,當用戶雙擊該視窗的時候,我需要通知呼叫者; 我的 COM 元件用執行緒方式下載網路上的一個檔案,當我完成任務後,需要通知呼叫者; 我的 COM 元件完成一個鐘錶的功能,當預定時間到達的時候,我需要通知呼叫者; ... ... ... ... 本回書
基於星雲鏈的智慧合約與Dapp(四)——編寫並執行智慧合約
一般智慧合約需要以下幾個步驟: 1.編寫智慧合約 2.部署智慧合約 3.呼叫智慧合約,驗證合約執行結果 編寫智慧合約 Nebulas實現了NVM虛擬機器來執行智慧合約,NVM的實現使用了JavaScript V8引擎,所以我們可以使用JavaScr
(詳細)Hibernate查詢技術(Query、Session、Criteria),Hibernate的三種狀態,Hibernate集合struts2實現登入功能(二)
Hibernate中提供了三種查詢方式: 1)Session的查詢:按主鍵查詢查詢,方法為get或load 2)Query的查詢:使用HQL語句或SQL語句完成查詢 3)Criteria的查詢:通過方法和類中屬性的關係,來設定查詢條件,完成查詢。 Session中get和load方法的區別? 1) 如果
ReactNative製作Component控制元件並且複用(二)
上一篇部落格ReactNative製作Component控制元件並且複用(一)簡單介紹了一下如何定義一個可複用的控制元件,並且引用他。這篇部落格繼續上一篇,介紹怎樣在使用自定義控制元件的時候傳遞資料,設定樣式等一些問題。OK 開始吧: 上一篇部落格中我們製作了一個長得還
基於Hadoop生態圈的資料倉庫實踐 —— 環境搭建(二)
二、安裝Hadoop及其所需的服務 1. CDH安裝概述 CDH的全稱是Cloudera's Distribution Including Apache Hadoop,是Cloudera公司的Hadoop分發版本。有三種方式安裝CDH: . Path A - 通過Cloud
四種途徑提高RabbitMQ傳輸數據的可靠性(二)
multiple 兩種 一段 當前 publisher sort hand tor mep 前言 上一篇四種途徑提高RabbitMQ傳輸消息數據的可靠性(一)已經介紹了兩種方式提高數據可靠性傳輸的方法,本篇針對上一篇中提出的問題(1)與問題(2)提出解決常用的方法。 本
Prometheus監控神器-服務發現篇(二)
> 本章節講解服務發現與Relabelling的機制與範例。 通過服務發現的方式,我們可以在不重啟Prometheus服務的情況下動態的發現需要監控的Target例項資訊。 ![image](https://upload-images.jianshu.io/upload_images/2426480