0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

vivo服務(wù)端監(jiān)控架構(gòu)設(shè)計(jì)與實(shí)踐

PLC工控專欄 ? 來源:加密狗破解 ? 作者:加密狗破解 ? 2022-02-22 09:53 ? 次閱讀

當(dāng)今時(shí)代處在信息大爆發(fā)的時(shí)代,信息借助互聯(lián)網(wǎng)的潮流在全球自由的流動(dòng),產(chǎn)生了各式各樣的平臺(tái)系統(tǒng)和軟件系統(tǒng),越來越多的業(yè)務(wù)也會(huì)導(dǎo)致系統(tǒng)的復(fù)雜性。

當(dāng)核心業(yè)務(wù)出現(xiàn)了問題影響用戶體驗(yàn),開發(fā)人員沒有及時(shí)發(fā)現(xiàn),發(fā)現(xiàn)問題時(shí)已經(jīng)為時(shí)已晚,又或者當(dāng)服務(wù)器的CPU持續(xù)增高,磁盤空間被打滿等,需要運(yùn)維人員及時(shí)發(fā)現(xiàn)并處理,這就需要一套有效的監(jiān)控系統(tǒng)對(duì)其進(jìn)行監(jiān)控和預(yù)警。

如何對(duì)這些業(yè)務(wù)和服務(wù)器進(jìn)行監(jiān)控和維護(hù)是我們開發(fā)人員和運(yùn)維人員不可忽視的重要一環(huán),這篇文章全篇大約5000多字,我將對(duì)vivo服務(wù)端監(jiān)控的原理和架構(gòu)演進(jìn)之路做一次系統(tǒng)性整理,以便大家做監(jiān)控技術(shù)選型時(shí)參考。

vivo服務(wù)端監(jiān)控旨在為服務(wù)端應(yīng)用提供包括系統(tǒng)監(jiān)控、JVM監(jiān)控以及自定義業(yè)務(wù)指標(biāo)監(jiān)控在內(nèi)的一站式數(shù)據(jù)監(jiān)控,并配套實(shí)時(shí)、多維度、多渠道的告警服務(wù),幫助用戶及時(shí)掌握應(yīng)用多方面狀態(tài),事前及時(shí)預(yù)警發(fā)現(xiàn)故障,事后提供詳實(shí)的數(shù)據(jù)用于追查定位問題,提升服務(wù)可用性。目前vivo服務(wù)端監(jiān)控累計(jì)接入業(yè)務(wù)方數(shù)量達(dá)到200+,本文介紹的是服務(wù)端監(jiān)控,我司還有其他類型的優(yōu)秀監(jiān)控包括通用監(jiān)控、調(diào)用鏈監(jiān)控和客戶端監(jiān)控等。

1.1 監(jiān)控系統(tǒng)的基本流程

無論是開源的監(jiān)控系統(tǒng)還是自研的監(jiān)控系統(tǒng),整體流程都大同小異。

1)數(shù)據(jù)采集:可以包括JVM監(jiān)控?cái)?shù)據(jù)如GC次數(shù),線程數(shù)量,老年代和新生代區(qū)域大??;系統(tǒng)監(jiān)控?cái)?shù)據(jù)如磁盤使用使用率,磁盤讀寫的吞吐量,網(wǎng)絡(luò)的出口流量和入口流量,TCP連接數(shù);業(yè)務(wù)監(jiān)控?cái)?shù)據(jù)如錯(cuò)誤日志,訪問日志,視頻播放量,PV,UV等。

2)數(shù)據(jù)傳輸:將采集的數(shù)據(jù)以消息形式或者 HTTP 協(xié)議的形式等上報(bào)給監(jiān)控系統(tǒng)。

3)數(shù)據(jù)存儲(chǔ):有使用 MySQL、Oracle 等 RDBMS 存儲(chǔ)的,也有使用時(shí)序數(shù)據(jù)庫(kù)OpenTSDB、InfluxDB 存儲(chǔ)的,還有使用 HBase 直接存儲(chǔ)的。

4)數(shù)據(jù)可視化:數(shù)據(jù)指標(biāo)的圖形化展示,可以是折線圖,柱狀圖,餅圖等。

5)監(jiān)控告警:靈活的告警設(shè)置,以及支持郵件、短信、IM 等多種通知通道。

1.2 如何規(guī)范的使用監(jiān)控系統(tǒng)

在使用監(jiān)控系統(tǒng)之前,我們需要了解監(jiān)控對(duì)象的基本工作原理,例如JVM監(jiān)控,我們需要清楚JVM的內(nèi)存結(jié)構(gòu)組成和常見的垃圾回收機(jī)制;其次需要確定如何去描述和定義監(jiān)控對(duì)象的狀態(tài),例如監(jiān)控某個(gè)業(yè)務(wù)功能的接口性能,可以監(jiān)控該接口的請(qǐng)求量,耗時(shí)情況,錯(cuò)誤量等;在確定了如何監(jiān)控對(duì)象的狀態(tài)之后,需要定義合理的告警閾值和告警類型,當(dāng)收到告警提醒時(shí),幫助開發(fā)人員及時(shí)發(fā)現(xiàn)故障;最后建立完善的故障處理體系,收到告警時(shí)迅速響應(yīng),及時(shí)處理線上故障。

二、vivo服務(wù)端監(jiān)控系統(tǒng)架構(gòu)及演進(jìn)之路

在介紹vivo服務(wù)端監(jiān)控系統(tǒng)架構(gòu)之前,先帶大家了解一下OpenTSDB時(shí)序數(shù)據(jù)庫(kù),在了解之前說明下為什么我們會(huì)選擇OpenTSDB,原因有以下幾點(diǎn):

1) 監(jiān)控?cái)?shù)據(jù)采集指標(biāo)在某一時(shí)間點(diǎn)具有唯一值,沒有復(fù)雜的結(jié)構(gòu)及關(guān)系。

2)監(jiān)控?cái)?shù)據(jù)的指標(biāo)具有隨著時(shí)間不斷變化的特點(diǎn)。

3)基于HBase分布式、可伸縮的時(shí)間序列數(shù)據(jù)庫(kù),存儲(chǔ)層不需要過多投入精力,具有HBase的高吞吐,良好的伸縮性等特點(diǎn)。

4)開源,Java實(shí)現(xiàn),并且提供基于HTTP的應(yīng)用程序編程接口,問題排查快可修改。

2.1 OpenTSDB簡(jiǎn)介

1)基于HBase的分布式的,可伸縮的時(shí)間序列數(shù)據(jù)庫(kù),主要用途就是做監(jiān)控系統(tǒng)。譬如收集大規(guī)模集群(包括網(wǎng)絡(luò)設(shè)備、操作系統(tǒng)、應(yīng)用程序)的監(jiān)控?cái)?shù)據(jù)并進(jìn)行存儲(chǔ)和查詢,支持秒級(jí)數(shù)據(jù)采集,支持永久存儲(chǔ),可以做容量規(guī)劃,并很容易地接入到現(xiàn)有的監(jiān)控系統(tǒng)里,OpenTSDB的系統(tǒng)架構(gòu)圖如下:

vivo服務(wù)端監(jiān)控架構(gòu)設(shè)計(jì)與實(shí)踐

存儲(chǔ)結(jié)構(gòu)單元為Data Point,即某個(gè)Metric在某個(gè)時(shí)間點(diǎn)的數(shù)值。Data Point包括以下部分:

Metric,監(jiān)控指標(biāo)名稱;

Tags,Metric的標(biāo)簽,用來標(biāo)注類似機(jī)器名稱等信息,包括TagKey和TagValue;

Value,Metric對(duì)應(yīng)的實(shí)際數(shù)值,整數(shù)或小數(shù);

Timestamp,時(shí)間戳。

核心存儲(chǔ)兩張表:tsdb和tsdb-uid。表tsdb用來存儲(chǔ)監(jiān)控?cái)?shù)據(jù),如下圖:

vivo服務(wù)端監(jiān)控架構(gòu)設(shè)計(jì)與實(shí)踐

Row Key為Metric+Timestamp的小時(shí)整點(diǎn)+TagKey+TagValue,取相應(yīng)的字節(jié)映射組合起來;列族t下的Qualifier為Timestamp的小時(shí)整點(diǎn)余出的秒數(shù),對(duì)應(yīng)的值即為Value。

表tsdb-uid用來存儲(chǔ)剛才提到的字節(jié)映射,如下圖:

vivo服務(wù)端監(jiān)控架構(gòu)設(shè)計(jì)與實(shí)踐

圖中的“001”表示tagk=hots或者tagv=static,提供正反查詢。

2)OpenTSDB使用策略說明:

不使用OpenTSDB提供的rest接口,通過client與HBase直連;

工程端禁用compact動(dòng)作的Thrd線程;

間隔10秒獲取Redis緩沖數(shù)據(jù)批量寫入OpenTSDB。

2.2OpenTSDB在實(shí)踐中需要關(guān)注的點(diǎn)

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);
/**
 * 打印結(jié)果:
 * 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在存儲(chǔ)浮點(diǎn)型數(shù)據(jù)時(shí),無法知悉存儲(chǔ)意圖,在轉(zhuǎn)化時(shí)會(huì)遇到精確性問題,即存儲(chǔ)"0.51",取出為"0.5099999904632568"。

2)聚合函數(shù)問題

OpenTSDB的大部分聚合函數(shù),包括sum、avg、max、min都是LERP(linear interpolation)的插值方式,即所獲取的值存在被補(bǔ)缺的現(xiàn)象,對(duì)于有空值需求的使用很不友好。詳細(xì)原理參見OpenTSDB關(guān)于interpolation的文檔。

目前vmonitor服務(wù)端監(jiān)控使用的OpenTSDB是我們改造后的源碼,新增了nimavg函數(shù),配合自帶的zimsum函數(shù)滿足空值插入需求。

2.3vivo服務(wù)端監(jiān)控采集器原理

vivo服務(wù)端監(jiān)控架構(gòu)設(shè)計(jì)與實(shí)踐

1)定時(shí)器

內(nèi)含3種采集器:OS采集器、JVM采集器和業(yè)務(wù)指標(biāo)采集器,其中OS及JVM每分鐘執(zhí)行采集和匯聚,業(yè)務(wù)指標(biāo)采集器會(huì)實(shí)時(shí)采集并在1分鐘的時(shí)間點(diǎn)完成匯聚重置,3份采集器的數(shù)據(jù)打包上報(bào)至RabbitMQ,上報(bào)動(dòng)作異步超時(shí)。

2)業(yè)務(wù)指標(biāo)采集器

業(yè)務(wù)指標(biāo)采集方式有2種:日志輸出過濾和工具類代碼上報(bào)(侵入式),日志輸出過濾是通過繼承l(wèi)og4j的Filter,從而獲取指標(biāo)配置中指定的Appender輸出的renderedMessage,并根據(jù)指標(biāo)配置的關(guān)鍵詞、聚合方式等信息進(jìn)行同步監(jiān)聽采集;代碼上報(bào)根據(jù)代碼中指定的指標(biāo)code進(jìn)行message信息上報(bào),屬于侵入式的采集方式,通過調(diào)用監(jiān)控提供的Util實(shí)現(xiàn)。業(yè)務(wù)指標(biāo)配置每隔5分鐘會(huì)從CDN刷新,內(nèi)置多種聚合器供聚合使用,包括count計(jì)數(shù)、 sum求和、average平均、max最大值和min最小值統(tǒng)計(jì)。

2.4 vivo服務(wù)端監(jiān)控老版本架構(gòu)設(shè)計(jì)

vivo服務(wù)端監(jiān)控架構(gòu)設(shè)計(jì)與實(shí)踐

1)數(shù)據(jù)采集及上報(bào):需求方應(yīng)用接入的監(jiān)控采集器vmonitor-agent根據(jù)監(jiān)控指標(biāo)配置采集相應(yīng)數(shù)據(jù),每分鐘上報(bào)1次數(shù)據(jù)至RabbitMQ,所采用的指標(biāo)配置每5分鐘從CDN下載更新,CDN內(nèi)容由監(jiān)控后臺(tái)上傳。

2)計(jì)算及存儲(chǔ):監(jiān)控后臺(tái)接收RabbitMQ的數(shù)據(jù),拆解后存儲(chǔ)至OpenTSDB,供可視化圖表調(diào)用,監(jiān)控項(xiàng)目、應(yīng)用、指標(biāo)和告警等配置存儲(chǔ)于MySQL;通過Zookeeper和Redis實(shí)現(xiàn)分布式任務(wù)分發(fā)模塊,實(shí)現(xiàn)多臺(tái)監(jiān)控服務(wù)協(xié)調(diào)配合運(yùn)作,供分布式計(jì)算使用。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 監(jiān)控
    +關(guān)注

    關(guān)注

    6

    文章

    2212

    瀏覽量

    55238
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    12

    文章

    9204

    瀏覽量

    85548
  • vivo
    +關(guān)注

    關(guān)注

    12

    文章

    3306

    瀏覽量

    63372
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    SSR與微服務(wù)架構(gòu)的結(jié)合應(yīng)用

    隨著互聯(lián)網(wǎng)技術(shù)的快速發(fā)展,前端技術(shù)棧不斷更新迭代,后端架構(gòu)也經(jīng)歷了從單體應(yīng)用到微服務(wù)的變革。在這個(gè)過程中,服務(wù)端渲染(SSR)作為一種提升頁(yè)面加載速度和SEO性能的技術(shù),與微服務(wù)
    的頭像 發(fā)表于 11-18 11:34 ?342次閱讀

    邊緣計(jì)算架構(gòu)設(shè)計(jì)最佳實(shí)踐

    邊緣計(jì)算架構(gòu)設(shè)計(jì)最佳實(shí)踐涉及多個(gè)方面,以下是一些關(guān)鍵要素和最佳實(shí)踐建議: 一、核心組件與架構(gòu)設(shè)計(jì) 邊緣設(shè)備與網(wǎng)關(guān) 邊緣設(shè)備 :包括各種嵌入式設(shè)備、傳感器、智能手機(jī)、智能攝像頭等,負(fù)責(zé)采
    的頭像 發(fā)表于 10-24 14:17 ?453次閱讀

    架構(gòu)與設(shè)計(jì) 常見微服務(wù)分層架構(gòu)的區(qū)別和落地實(shí)踐

    架構(gòu)風(fēng)格越傾向于清晰的職責(zé)定位,且讓領(lǐng)域模型成為架構(gòu)的核心。 基于這些架構(gòu)風(fēng)格,在軟件架構(gòu)設(shè)計(jì)過程中又有非常多的架構(gòu)分層模型。 傳統(tǒng)三層
    的頭像 發(fā)表于 10-22 15:34 ?261次閱讀
    <b class='flag-5'>架構(gòu)</b>與設(shè)計(jì) 常見微<b class='flag-5'>服務(wù)</b>分層<b class='flag-5'>架構(gòu)</b>的區(qū)別和落地<b class='flag-5'>實(shí)踐</b>

    使用NS1串口服務(wù)器HTTP模式上傳服務(wù)器數(shù)據(jù)

    HTTP協(xié)議工作于客戶-服務(wù)端架構(gòu)之上。瀏覽器作為HTTP客戶通過URL向HTTP服務(wù)端即Web服務(wù)
    的頭像 發(fā)表于 08-30 12:36 ?378次閱讀
    使用NS1串口<b class='flag-5'>服務(wù)</b>器HTTP模式上傳<b class='flag-5'>服務(wù)</b>器數(shù)據(jù)

    請(qǐng)問ESP32作為藍(lán)牙服務(wù)端如何修改MTU?

    我們的工程把esp32當(dāng)作藍(lán)牙服務(wù)端讓電腦去連,由于一些老電腦上沒有藍(lán)牙,要用外置藍(lán)牙驅(qū)動(dòng),默認(rèn)MTU只有23,但是說明上驅(qū)動(dòng)是支持最大mtu的,所以有什么辦法可以通過服務(wù)端去修改mtu嗎
    發(fā)表于 06-27 07:47

    請(qǐng)問esp_local_ctrl中服務(wù)端如何主動(dòng)發(fā)消息?

    請(qǐng)問,在wifi本地控制例程esp_local_ctrl中,設(shè)備作為服務(wù)端在客戶沒有請(qǐng)求的情況下,如何主動(dòng)發(fā)送消息給客戶呢?
    發(fā)表于 06-06 06:11

    服務(wù)端測(cè)試包括什么類型

    服務(wù)端測(cè)試是確保軟件系統(tǒng)在服務(wù)器端正常運(yùn)行和滿足性能要求的重要環(huán)節(jié)。本文將詳細(xì)介紹服務(wù)端測(cè)試的類型、方法和最佳實(shí)踐。 1. 服務(wù)端測(cè)試的定義
    的頭像 發(fā)表于 05-30 16:03 ?771次閱讀

    服務(wù)端測(cè)試是web測(cè)試嗎為什么

    服務(wù)端測(cè)試和Web測(cè)試是兩個(gè)不同的概念,但它們?cè)谲浖_發(fā)和測(cè)試過程中是相互關(guān)聯(lián)的。本文將詳細(xì)解釋這兩個(gè)概念以及它們之間的關(guān)系。 服務(wù)端測(cè)試 服務(wù)端測(cè)試主要關(guān)注服務(wù)器端的軟件組件,這些組
    的頭像 發(fā)表于 05-30 15:30 ?627次閱讀

    服務(wù)端測(cè)試和客戶測(cè)試區(qū)別在哪

    服務(wù)端測(cè)試和客戶測(cè)試是軟件開發(fā)過程中的兩個(gè)重要環(huán)節(jié),它們分別針對(duì)服務(wù)器端和客戶的軟件進(jìn)行測(cè)試。本文將詳細(xì)介紹服務(wù)端測(cè)試和客戶
    的頭像 發(fā)表于 05-30 15:27 ?3154次閱讀

    服務(wù)端的測(cè)試主要是測(cè)什么內(nèi)容

    服務(wù)端測(cè)試是軟件開發(fā)過程中的一個(gè)重要環(huán)節(jié),主要目的是確保服務(wù)端程序的穩(wěn)定性、性能、安全性和可靠性。 功能測(cè)試 功能測(cè)試是服務(wù)端測(cè)試的基礎(chǔ),主要驗(yàn)證服務(wù)端程序是否按照需求實(shí)現(xiàn)了所有功能。
    的頭像 發(fā)表于 05-30 15:24 ?4086次閱讀

    交換芯片架構(gòu)設(shè)計(jì)

    交換芯片的架構(gòu)設(shè)計(jì)是網(wǎng)絡(luò)設(shè)備性能和功能的關(guān)鍵。一個(gè)高效的交換芯片架構(gòu)能夠處理大量的數(shù)據(jù)流量,支持高速數(shù)據(jù)傳輸,并提供先進(jìn)的網(wǎng)絡(luò)功能。
    的頭像 發(fā)表于 03-21 16:28 ?555次閱讀

    lwip stm407作為服務(wù)端 pc連接不上怎么解決?

    lwip stm407作為服務(wù)端 pc連接不上
    發(fā)表于 03-20 06:32

    交換芯片架構(gòu)設(shè)計(jì)

    交換芯片架構(gòu)設(shè)計(jì)是網(wǎng)絡(luò)通信中的關(guān)鍵環(huán)節(jié),它決定了交換機(jī)的性能、功能和擴(kuò)展性。
    的頭像 發(fā)表于 03-18 14:12 ?730次閱讀

    華為企業(yè)架構(gòu)設(shè)計(jì)方法及實(shí)例

    企業(yè)架構(gòu)是一項(xiàng)非常復(fù)雜的系統(tǒng)性工程。公司在充分繼承原有架構(gòu)方法基礎(chǔ)上,博采眾家之長(zhǎng),融合基于職能的業(yè)務(wù)能力分析與基于價(jià)值的流程分析,將”傳統(tǒng)
    發(fā)表于 01-30 09:40 ?900次閱讀
    華為企業(yè)<b class='flag-5'>架構(gòu)設(shè)</b>計(jì)方法及實(shí)例

    ?PLC從HTTP服務(wù)端獲取JSON文件,解析數(shù)據(jù)到寄存器

    智能網(wǎng)關(guān)IGT-DSER集成了多種PLC協(xié)議,方便實(shí)現(xiàn)各種PLC與HTTP服務(wù)端之間通訊。通過網(wǎng)關(guān)的參數(shù)配置軟件綁定JSON文件的字段與PLC寄存器地址,配置URL,即可采用POST命令,將JSON
    發(fā)表于 01-24 09:47