电竞比分网-中国电竞赛事及体育赛事平台

分享

大數(shù)據(jù)監(jiān)控告警系統(tǒng)的實(shí)現(xiàn)

 WindySky 2017-09-15

以下內(nèi)容整理PyCon2016深圳場(chǎng)演講稿--大數(shù)據(jù)監(jiān)控告警系統(tǒng)。

開(kāi)場(chǎng)

本次演講將會(huì)一步步地,向大家展示我們這個(gè)系統(tǒng)架構(gòu)
由于時(shí)間有限,我不會(huì)深入講解技術(shù)細(xì)節(jié)(事實(shí)上我一開(kāi)始做好、發(fā)給Sting的ppt有多達(dá)40頁(yè)現(xiàn)在精簡(jiǎn)到20多頁(yè))。
我希望達(dá)到的效果是--

  • 對(duì)于有相關(guān)項(xiàng)目經(jīng)驗(yàn)的開(kāi)發(fā)人員,可以起到一個(gè)參考的
  • 對(duì)于沒(méi)有監(jiān)控項(xiàng)目經(jīng)驗(yàn)的人員,也可以讓你對(duì)如何實(shí)現(xiàn)監(jiān)控平臺(tái)有一個(gè)快速的認(rèn)

背景介紹

監(jiān)控系統(tǒng)對(duì)于大數(shù)據(jù)平臺(tái)的重要性不言而喻。
那要實(shí)現(xiàn)這樣一種系統(tǒng),我們需要解決哪些問(wèn)題?

  • 首先我們要知道如何采集監(jiān)控?cái)?shù)據(jù),監(jiān)控?cái)?shù)據(jù)主要有三
    • 系統(tǒng)本身的運(yùn)行狀態(tài),例如CPU、內(nèi)存、磁盤(pán)、網(wǎng)絡(luò)的使用情
    • 各種應(yīng)用的運(yùn)行狀況,例如數(shù)據(jù)庫(kù)、容器等
    • 處理網(wǎng)絡(luò)上發(fā)送過(guò)來(lái)的數(shù)據(jù)
  • 有了數(shù)據(jù),我們需要采用合適的存儲(chǔ)方案來(lái)保存海量的監(jiān)控?cái)?shù)據(jù)
  • 然后需要把這些數(shù)據(jù)在web界面進(jìn)行展示,把監(jiān)控指標(biāo)的變化情況可視
  • 另外,如果監(jiān)控系統(tǒng)只能看而不能及時(shí)發(fā)出告警(以郵件/微信等通知方式),價(jià)值也大打
  • 最后,對(duì)于這樣的大型架構(gòu),我們同樣需要考慮高可用/高并發(fā)/可伸縮

架構(gòu)設(shè)計(jì)之路

接下來(lái),我們來(lái)初步設(shè)計(jì)這個(gè)架構(gòu)的實(shí)現(xiàn)方案
根據(jù)對(duì)現(xiàn)有監(jiān)控產(chǎn)品的調(diào)研,以及我們列出的所需解決的問(wèn)題,可以發(fā)現(xiàn)監(jiān)控系統(tǒng)一般套采集-存儲(chǔ)-展示-告,也就是圖上這四個(gè)模塊

為了實(shí)現(xiàn)解耦、異步和對(duì)采集器的控制,我們在采集和存儲(chǔ)之間增加一個(gè)任務(wù)隊(duì)列;考慮到可能需要進(jìn)行接口封裝、統(tǒng)一開(kāi)放對(duì)外接口,我們?cè)黾?wbr>一個(gè)API服務(wù)模塊。

存儲(chǔ)-OpenTSDB

我們先來(lái)看看存儲(chǔ)方面的OpenTSDB。
由于監(jiān)控數(shù)據(jù)(例如CPU、內(nèi)存等)跟時(shí)間點(diǎn)密切相關(guān),我們確定了采用時(shí)間序列來(lái)存儲(chǔ)監(jiān)控?cái)?shù)據(jù)。OpenTSDB是一個(gè)基于HBase、分布式、高可用、可伸縮的時(shí)間序列數(shù)據(jù)庫(kù),支持每秒百萬(wàn)級(jí)別的寫(xiě)入請(qǐng)求,并可以通過(guò)增加節(jié)點(diǎn)來(lái)靈活擴(kuò)展處理能力。
我們可以把它當(dāng)作一個(gè)HBase的應(yīng)用,利用它豐富的API和聚合函數(shù)來(lái)查詢(xún)監(jiān)控?cái)?shù)據(jù)。

它存儲(chǔ)的數(shù)據(jù)格式包涵以下四個(gè)元素:

  • Metric:指標(biāo)名,比如過(guò)去1分鐘的系統(tǒng)負(fù)載,可以表示為proc.loadavg.1m
  • Timestamp:Unix時(shí)間戳,可以精確到毫秒級(jí)
  • Value:指標(biāo)的數(shù)值,整型
  • Tag:標(biāo)簽,指標(biāo)的過(guò)濾條件,作用相當(dāng)于SQL語(yǔ)句中的Where條件查詢(xún);每個(gè)指標(biāo)可以有多個(gè)標(biāo)

每一條數(shù)據(jù)由以上4種數(shù)值組成,如(telnet端口發(fā)送的數(shù)據(jù)格式):

  • [metric] [timestamp] [value] [tags]

一個(gè)示例:

proc.loadavg.1m 1234567890 0.42 host=web42 pool=static


這是它的應(yīng)用場(chǎng)景,中間綠色的就是OpenTSDB(簡(jiǎn)稱(chēng)TSD),上面每個(gè)Server的c就是采集器(collector),采集器把數(shù)據(jù)發(fā)送到TSD,TSD再異步寫(xiě)入到HBase集群,web UI則可以通過(guò)TSD的HTTP API接口來(lái)查詢(xún)數(shù)據(jù)和進(jìn)行展示。

 因此,在我們這個(gè)系統(tǒng)架構(gòu)里,存儲(chǔ)模塊就是OpenTSDB模塊。

采集-Collector

我們的采集器基于開(kāi)源的TCollector。
TCollector是一個(gè)python編寫(xiě)的、OpenTSDB的采集器客戶(hù)端。它提供了一個(gè)采集器的框架,讓你只需要編寫(xiě)簡(jiǎn)單的采集腳本,其他諸如網(wǎng)絡(luò)連接、性能優(yōu)化等工作由它處理。

上面是它的工作原理:編寫(xiě)的采集器腳本,從Linux的/proc目錄下獲取系統(tǒng)相關(guān)信息,或者收集其他自定義的指標(biāo),輸出到標(biāo)準(zhǔn)輸出,然后有一個(gè)核心的采集器管理器統(tǒng)一處理輸出數(shù)據(jù),最后發(fā)送到TSD。
這個(gè)核心管理器,其內(nèi)部實(shí)現(xiàn)也不復(fù)雜(源代碼大概1000多行),就是起兩個(gè)主循環(huán)線(xiàn)程:讀取線(xiàn)程ReaderThread和發(fā)送線(xiàn)程SenderThread。ReaderThread從采集器運(yùn)行實(shí)例(也就是腳本輸出)yield一行數(shù)據(jù),將數(shù)據(jù)異步推入ReaderQueue,然后SenderThread從ReaderQueue里拿到數(shù)據(jù),存到SenderQueue,最后發(fā)送到TSD。其中還有一些優(yōu)化工作,ReaderThread負(fù)責(zé)做一些數(shù)據(jù)去重,減少一段時(shí)間內(nèi)相同數(shù)據(jù)的發(fā)送次數(shù);SenderThread負(fù)責(zé)網(wǎng)絡(luò)連接的管理,比如與TSD的心跳檢測(cè)、黑白名單等。
我們?cè)赥Collector的基礎(chǔ)上進(jìn)行開(kāi)發(fā),包括

  • 重構(gòu),提高代碼可讀性、解耦模塊和配置
  • 增加實(shí)現(xiàn)代理和用戶(hù)管理
  • 增加與任務(wù)隊(duì)列Celery的集成
  • 性能優(yōu)化

因此,這個(gè)系統(tǒng)架構(gòu)的采集器模塊,也有了實(shí)現(xiàn)。

隊(duì)列-Celery

Celery是一個(gè)快速、靈活、高可用、分布式的異步任務(wù)調(diào)度隊(duì)列。
集成到我們這個(gè)系統(tǒng)里,其實(shí)就是把采集器當(dāng)成生產(chǎn)者,采集器生產(chǎn)的數(shù)據(jù)發(fā)送到Broker;Broker是消息中間件,我們選用了Redis;Worker就是消費(fèi)者,消費(fèi)者行為就是從Redis中獲取數(shù)據(jù),并最終寫(xiě)入到TSD里面。
整個(gè)流程比起采集器直接發(fā)送到TSD會(huì)更長(zhǎng),但得益于Redis和Celery的高效,依然保持極佳的性能,且可以通過(guò)結(jié)合Celery-Flower這種管理界面,對(duì)采集行為進(jìn)行控制。

因此,任務(wù)隊(duì)列由Celery實(shí)現(xiàn)。

API-Tornado

Tornado是一個(gè)高性能的Web服務(wù)框架,很適合構(gòu)建支持高并發(fā)的API服務(wù),而且Tornado可以和Celery整合在一起。這個(gè)Tornado API服務(wù),我們?cè)谙到y(tǒng)中主要用它來(lái):

  • API的封裝,對(duì)TSD、Bosun(告警模塊)的API進(jìn)行二次開(kāi)發(fā)
  • 可以作為對(duì)外接口,接收處理網(wǎng)絡(luò)數(shù)據(jù) 
    因此,系統(tǒng)架構(gòu)中API服務(wù)的實(shí)現(xiàn)也敲定了

展示-Metrilyx

Metrilyx是基于OpenTSDB的開(kāi)源可視化界面:

  • 它是基于django開(kāi)發(fā)的,可以很好地利用django生態(tài)的工
  • 數(shù)據(jù)展示的面板簡(jiǎn)單易用
  • 對(duì)數(shù)據(jù)指標(biāo)更好的查詢(xún)操作
  • 更豐富的指標(biāo)名搜索工具
  • 分布式、高可用


這是它的數(shù)據(jù)面板,左邊是指標(biāo)名搜索欄,右邊每個(gè)小面板展示的是監(jiān)控指標(biāo)的圖表。

告警-Bosun

最后,告警這個(gè)模塊,我們采用了StackOverflow的Bosun。 Bosun是一個(gè)基于OpenTSDB開(kāi)源的告警系統(tǒng):

  • GO語(yǔ)言和AngularJS開(kāi)發(fā),性能好且易于部
  • 通過(guò)靈活強(qiáng)大的表達(dá)式來(lái)定義告警規(guī)則
  • 提供HTTP調(diào)用的告警方式

架構(gòu)全景

至此,我們基本看完了整個(gè)系統(tǒng)架構(gòu)的技術(shù)面貌。 
我們把上面的架構(gòu)圖再稍微完善一下... 
這就是我們系統(tǒng)的整個(gè)架構(gòu)全景。
可以看到,在OpenTSDB節(jié)點(diǎn)上,我們增加了一個(gè)HAProxy,用于進(jìn)行負(fù)載均衡。
在采集器部分,還增加了一個(gè)Proxy代理。因?yàn)樵?wbr>大數(shù)據(jù)場(chǎng)景下,完全有可能是跨地區(qū)的大規(guī)模采集,這時(shí)候我們需要在不同的地域增加一個(gè)代理,用于中轉(zhuǎn)處理和統(tǒng)一發(fā)送數(shù)據(jù)

整個(gè)架構(gòu)可以概括采集-隊(duì)列-存儲(chǔ)-展示-告警,以及協(xié)助提供模塊間通訊的API服務(wù)


現(xiàn)在來(lái)看,在這個(gè)系統(tǒng)架構(gòu)里涉及到的技術(shù)選型,Python幾乎占據(jù)了半壁江山,包括采集器TCollector、Celery隊(duì)列、django展示界面和Tornado。
所以,正如本次大會(huì)的主題所說(shuō)的,我們看到Python正在大數(shù)據(jù)領(lǐng)域發(fā)揮著重要的作用,也希望更多的Pythoner一起來(lái)分享自己的成果,貢獻(xiàn)自己的力量。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多