當今時代處在信息大爆發的時代,信息借助互聯網的潮流在全球自由的流動,產生了各式各樣的平臺系統和軟件系統,越來越多的業務也會導致系統的復雜性。
當核心業務出現了問題影響用戶體驗,開發人員沒有及時發現,發現問題時已經為時已晚,又或者當服務器的CPU持續增高,磁盤空間被打滿等,需要運維人員及時發現并處理,這就需要一套有效的監控系統對其進行監控和預警。
如何對這些業務和服務器進行監控和維護是我們開發人員和運維人員不可忽視的重要一環,這篇文章全篇大約5000多字,我將對vivo服務端監控的原理和架構演進之路做一次系統性整理,以便大家做監控技術選型時參考。
vivo服務端監控旨在為服務端應用提供包括系統監控、JVM監控以及自定義業務指標監控在內的一站式數據監控,并配套實時、多維度、多渠道的告警服務,幫助用戶及時掌握應用多方面狀態,事前及時預警發現故障,事后提供詳實的數據用于追查定位問題,提升服務可用性。目前vivo服務端監控累計接入業務方數量達到200+,本文介紹的是服務端監控,我司還有其他類型的優秀監控包括通用監控、調用鏈監控和客戶端監控等。
1.1 監控系統的基本流程
無論是開源的監控系統還是自研的監控系統,整體流程都大同小異。
1)數據采集:可以包括JVM監控數據如GC次數,線程數量,老年代和新生代區域大小;系統監控數據如磁盤使用使用率,磁盤讀寫的吞吐量,網絡的出口流量和入口流量,TCP連接數;業務監控數據如錯誤日志,訪問日志,視頻播放量,PV,UV等。
2)數據傳輸:將采集的數據以消息形式或者 HTTP 協議的形式等上報給監控系統。
3)數據存儲:有使用 MySQL、Oracle 等 RDBMS 存儲的,也有使用時序數據庫OpenTSDB、InfluxDB 存儲的,還有使用 HBase 直接存儲的。
4)數據可視化:數據指標的圖形化展示,可以是折線圖,柱狀圖,餅圖等。
5)監控告警:靈活的告警設置,以及支持郵件、短信、IM 等多種通知通道。
1.2 如何規范的使用監控系統
在使用監控系統之前,我們需要了解監控對象的基本工作原理,例如JVM監控,我們需要清楚JVM的內存結構組成和常見的垃圾回收機制;其次需要確定如何去描述和定義監控對象的狀態,例如監控某個業務功能的接口性能,可以監控該接口的請求量,耗時情況,錯誤量等;在確定了如何監控對象的狀態之后,需要定義合理的告警閾值和告警類型,當收到告警提醒時,幫助開發人員及時發現故障;最后建立完善的故障處理體系,收到告警時迅速響應,及時處理線上故障。
二、vivo服務端監控系統架構及演進之路
在介紹vivo服務端監控系統架構之前,先帶大家了解一下OpenTSDB時序數據庫,在了解之前說明下為什么我們會選擇OpenTSDB,原因有以下幾點:
1) 監控數據采集指標在某一時間點具有唯一值,沒有復雜的結構及關系。
2)監控數據的指標具有隨著時間不斷變化的特點。
3)基于HBase分布式、可伸縮的時間序列數據庫,存儲層不需要過多投入精力,具有HBase的高吞吐,良好的伸縮性等特點。
4)開源,Java實現,并且提供基于HTTP的應用程序編程接口,問題排查快可修改。
2.1 OpenTSDB簡介
1)基于HBase的分布式的,可伸縮的時間序列數據庫,主要用途就是做監控系統。譬如收集大規模集群(包括網絡設備、操作系統、應用程序)的監控數據并進行存儲和查詢,支持秒級數據采集,支持永久存儲,可以做容量規劃,并很容易地接入到現有的監控系統里,OpenTSDB的系統架構圖如下:
存儲結構單元為Data Point,即某個Metric在某個時間點的數值。Data Point包括以下部分:
Metric,監控指標名稱;
Tags,Metric的標簽,用來標注類似機器名稱等信息,包括TagKey和TagValue;
Value,Metric對應的實際數值,整數或小數;
Timestamp,時間戳。
核心存儲兩張表:tsdb和tsdb-uid。表tsdb用來存儲監控數據,如下圖:
Row Key為Metric+Timestamp的小時整點+TagKey+TagValue,取相應的字節映射組合起來;列族t下的Qualifier為Timestamp的小時整點余出的秒數,對應的值即為Value。
表tsdb-uid用來存儲剛才提到的字節映射,如下圖:
圖中的“001”表示tagk=hots或者tagv=static,提供正反查詢。
2)OpenTSDB使用策略說明:
不使用OpenTSDB提供的rest接口,通過client與HBase直連;
工程端禁用compact動作的Thrd線程;
間隔10秒獲取Redis緩沖數據批量寫入OpenTSDB。
2.2OpenTSDB在實踐中需要關注的點
1)精確性問題
String value = "0.51";
float f = Float.parseFloat(value);
int raw = Float.floatToRawIntBits(f);
byte[] float_bytes = Bytes.fromInt(raw);
int raw_back = Bytes.getInt(float_bytes, 0);
double decode = Float.intBitsToFloat(raw_back);
/**
* 打印結果:
* Parsed Float: 0.51
* Encode Raw: 1057132380
* Encode Bytes: 3F028F5C
* Decode Raw: 1057132380
* Decoded Float: 0.5099999904632568
*/
System.out.println("Parsed Float: " + f);
System.out.println("Encode Raw: " + raw);
System.out.println("Encode Bytes: " + UniqueId.uidToString(float_bytes));
System.out.println("Decode Raw: " + raw_back);
System.out.println("Decoded Float: " + decode);
如上代碼,OpenTSDB在存儲浮點型數據時,無法知悉存儲意圖,在轉化時會遇到精確性問題,即存儲"0.51",取出為"0.5099999904632568"。
2)聚合函數問題
OpenTSDB的大部分聚合函數,包括sum、avg、max、min都是LERP(linear interpolation)的插值方式,即所獲取的值存在被補缺的現象,對于有空值需求的使用很不友好。詳細原理參見OpenTSDB關于interpolation的文檔。
目前vmonitor服務端監控使用的OpenTSDB是我們改造后的源碼,新增了nimavg函數,配合自帶的zimsum函數滿足空值插入需求。
2.3vivo服務端監控采集器原理
1)定時器
內含3種采集器:OS采集器、JVM采集器和業務指標采集器,其中OS及JVM每分鐘執行采集和匯聚,業務指標采集器會實時采集并在1分鐘的時間點完成匯聚重置,3份采集器的數據打包上報至RabbitMQ,上報動作異步超時。
2)業務指標采集器
業務指標采集方式有2種:日志輸出過濾和工具類代碼上報(侵入式),日志輸出過濾是通過繼承log4j的Filter,從而獲取指標配置中指定的Appender輸出的renderedMessage,并根據指標配置的關鍵詞、聚合方式等信息進行同步監聽采集;代碼上報根據代碼中指定的指標code進行message信息上報,屬于侵入式的采集方式,通過調用監控提供的Util實現。業務指標配置每隔5分鐘會從CDN刷新,內置多種聚合器供聚合使用,包括count計數、 sum求和、average平均、max最大值和min最小值統計。
2.4 vivo服務端監控老版本架構設計
1)數據采集及上報:需求方應用接入的監控采集器vmonitor-agent根據監控指標配置采集相應數據,每分鐘上報1次數據至RabbitMQ,所采用的指標配置每5分鐘從CDN下載更新,CDN內容由監控后臺上傳。
2)計算及存儲:監控后臺接收RabbitMQ的數據,拆解后存儲至OpenTSDB,供可視化圖表調用,監控項目、應用、指標和告警等配置存儲于MySQL;通過Zookeeper和Redis實現分布式任務分發模塊,實現多臺監控服務協調配合運作,供分布式計算使用。
審核編輯:湯梓紅
-
監控
+關注
關注
6文章
2175瀏覽量
55096 -
服務器
+關注
關注
12文章
9024瀏覽量
85187 -
vivo
+關注
關注
12文章
3292瀏覽量
63147
發布評論請先 登錄
相關推薦
評論