大數據平臺監控告警系統的實現

開場

本次演講將會一步步地,向大家展示我們這個系統架構。
由於時間有限,我不會深入講解技術細節(事實上我一開始做好、發給Sting的ppt有多達40頁現在精簡到20多頁)。
我希望達到的效果是--

  • 對於有相關項目經驗的開發人員,可以起到一個參考的作用

  • 對於沒有監控項目經驗的人員,也可以讓你對如何實現監控平臺有一個快速的認知

背景介紹

監控系統對於大數據平臺的重要性不言而喻。
那要實現這樣一種系統,我們需要解決哪些問題?

  • 首先我們要知道如何採集監控數據,監控數據主要有三種

    • 系統本身的運行狀態,例如CPU、內存、磁盤、網絡的使用情況

    • 各種應用的運行狀況,例如數據庫、容器等

    • 處理網絡上發送過來的數據

  • 有了數據,我們需要採用合適的存儲方案來保存海量的監控數據

  • 然後需要把這些數據在web界面進行展示,把監控指標的變化情況可視化

  • 另外,如果監控系統只能看而不能及時發出告警(以郵件/微信等通知方式),價值也大打折扣

  • 最後,對於這樣的大型架構,我們同樣需要考慮高可用/高併發/可伸縮性

架構設計之路

接下來,我們來初步設計這個架構的實現方案。
根據對現有監控產品的調研,以及我們列出的所需解決的問題,可以發現監控系統的一般套路:採集-存儲-展示-告警,也就是圖上這四個模塊:

爲了實現解耦、異步和對採集器的控制,我們在採集和存儲之間增加一個任務隊列;考慮到可能需要進行接口封裝、統一開放對外接口,我們增加一個API服務模塊。

存儲-OpenTSDB

我們先來看看存儲方面的OpenTSDB。
由於監控數據(例如CPU、內存等)跟時間點密切相關,我們確定了採用時間序列來存儲監控數據。OpenTSDB是一個基於HBase、分佈式、高可用、可伸縮的時間序列數據庫,支持每秒百萬級別的寫入請求,並可以通過增加節點來靈活擴展處理能力。
我們可以把它當作一個HBase的應用,利用它豐富的API和聚合函數來查詢監控數據。

它存儲的數據格式包涵以下四個元素:

  • Metric:

    指標名,比如過去1分鐘的系統負載,可以表示爲proc.loadavg.1m

  • Timestamp:

    Unix時間戳,可以精確到毫秒級別

  • Value:

    指標的數值,整型

  • Tag:

    標籤,指標的過濾條件,作用相當於SQL語句中的Where條件查詢;

    每個指標可以有多個標籤

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

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

一個示例:

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

這是它的應用場景,中間綠色的就是OpenTSDB(簡稱TSD),上面每個Server的c就是採集器(collector),採集器把數據發送到TSD,TSD再異步寫入到HBase集羣,web UI則可以通過TSD的HTTP API接口來查詢數據和進行展示。

因此,在我們這個系統架構裏,存儲模塊就是OpenTSDB模塊。

採集-Collector

我們的採集器基於開源的TCollector。
TCollector是一個python編寫的、OpenTSDB的採集器客戶端。它提供了一個採集器的框架,讓你只需要編寫簡單的採集腳本,其他諸如網絡連接、性能優化等工作由它處理。

上面是它的工作原理:編寫的採集器腳本,從Linux的/proc目錄下獲取系統相關信息,或者收集其他自定義的指標,輸出到標準輸出,然後有一個核心的採集器管理器統一處理輸出數據,最後發送到TSD。

這個核心管理器,其內部實現也不復雜(源代碼大概1000多行),就是起兩個主循環線程:讀取線程ReaderThread和發送線程SenderThread。ReaderThread從採集器運行實例(也就是腳本輸出)yield一行數據,將數據異步推入ReaderQueue,然後SenderThread從ReaderQueue裏拿到數據,存到SenderQueue,最後發送到TSD。其中還有一些優化工作,ReaderThread負責做一些數據去重,減少一段時間內相同數據的發送次數;SenderThread負責網絡連接的管理,比如與TSD的心跳檢測、黑白名單等。
我們在TCollector的基礎上進行開發,包括:

  • 重構,提高代碼可讀性、解耦模塊和配置

  • 增加實現代理和用戶管理

  • 增加與任務隊列Celery的集成

  • 性能優化

因此,這個系統架構的採集器模塊,也有了實現。

隊列-Celery

Celery是一個快速、靈活、高可用、分佈式的異步任務調度隊列。
集成到我們這個系統裏,其實就是把採集器當成生產者,採集器生產的數據發送到Broker;Broker是消息中間件,我們選用了Redis;Worker就是消費者,消費者行爲就是從Redis中獲取數據,並最終寫入到TSD裏面。
整個流程比起採集器直接發送到TSD會更長,但得益於Redis和Celery的高效,依然保持極佳的性能,且可以通過結合Celery-Flower這種管理界面,對採集行爲進行控制。


因此,任務隊列由Celery實現。

API-Tornado

Tornado是一個高性能的Web服務框架,很適合構建支持高併發的API服務,而且Tornado可以和Celery整合在一起。這個Tornado API服務,我們在系統中主要用它來:

  • API的封裝,對TSD、Bosun(告警模塊)的API進行二次開發

  • 可以作爲對外接口,接收處理網絡數據
    因此,系統架構中API服務的實現也敲定了。

展示-Metrilyx

Metrilyx是基於OpenTSDB的開源可視化界面:

  • 它是基於django開發的,可以很好地利用django生態的工具

  • 數據展示的面板簡單易用

  • 對數據指標更好的查詢操作

  • 更豐富的指標名搜索工具

  • 分佈式、高可用


這是它的數據面板,左邊是指標名搜索欄,右邊每個小面板展示的是監控指標的圖表。

告警-Bosun

最後,告警這個模塊,我們採用了StackOverflow的Bosun。Bosun是一個基於OpenTSDB開源的告警系統:

  • GO語言和AngularJS開發,性能好且易於部署

  • 通過靈活強大的表達式來定義告警規則

  • 提供HTTP調用的告警方式


架構全景

至此,我們基本看完了整個系統架構的技術面貌。

我們把上面的架構圖再稍微完善一下...

這就是我們系統的整個架構全景。
可以看到,在OpenTSDB節點上,我們增加了一個HAProxy,用於進行負載均衡。
在採集器部分,還增加了一個Proxy代理。因爲在大數據場景下,完全有可能是跨地區的大規模採集,這時候我們需要在不同的地域增加一個代理,用於中轉處理和統一發送數據。

整個架構可以概括爲:採集-隊列-存儲-展示-告警,以及協助提供模塊間通訊的API服務。

現在來看,在這個系統架構裏涉及到的技術選型,Python幾乎佔據了半壁江山,包括採集器TCollector、Celery隊列、django展示界面和Tornado。

所以,正如本次大會的主題所說的,我們看到Python正在大數據領域發揮着重要的作用,也希望更多的Pythoner一起來分享自己的成果,貢獻自己的力量。

推薦閱讀:

趣店線上監控報警系統設計與實現

5款強大的JVM 性能調優監控工具 !

生產實踐 | 基於 Flink 的短視頻生產消費監控

一篇文章全面瞭解監控知識體系

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