張鳳麗
天津工業(yè)職業(yè)學(xué)院 天津 300400
Prometheus是一種應(yīng)用十分廣泛的性能監(jiān)控平臺(tái),是一個(gè)開源的記錄和處理數(shù)字時(shí)間序列的監(jiān)控平臺(tái),由Matt T.Proud和Julius Volz最初合作開發(fā),開始開發(fā)的大部分費(fèi)用由SoundCloud贊助,使用Go語言編寫,現(xiàn)在是一個(gè)獨(dú)立的開源項(xiàng)目,獨(dú)立于任何公司維護(hù),并于2016年加入云原生基金會(huì),成為繼Kubernetes之后的第二個(gè)托管項(xiàng)目。其工作基本原理是通過HTTP協(xié)議周期性的抓取被監(jiān)控組件的狀態(tài),任何組件只要提供HTTP接口就可以接入監(jiān)控系統(tǒng)而不需要任何SDK[1]。
Prometheus的工作流程如下。
Prometheus Server負(fù)責(zé)對監(jiān)控?cái)?shù)據(jù)的獲取、存儲(chǔ)、查詢與監(jiān)測Job的調(diào)度,以既定的輪詢頻率抓取監(jiān)控目標(biāo)數(shù)據(jù)并實(shí)現(xiàn)數(shù)據(jù)持久化到時(shí)序數(shù)據(jù)庫。與其他依靠代理或嵌入式設(shè)備收集數(shù)據(jù)并“推送”指標(biāo)到監(jiān)控后臺(tái)思路不同,Prometheus Exporter負(fù)責(zé)將監(jiān)控?cái)?shù)據(jù)采集的端點(diǎn)(Endpoint)通過HTTP服務(wù)暴露,之后Prometheus Server通過訪問該端點(diǎn)獲取需要采集的監(jiān)控?cái)?shù)據(jù)。如果目標(biāo)網(wǎng)絡(luò)不可達(dá),可以通過PushGateway間接實(shí)現(xiàn)目標(biāo)指標(biāo)項(xiàng)抓取。另外Prometheus提供客戶端庫,選擇適合的語言,可以方便地在應(yīng)用程序上為需要監(jiān)控的服務(wù)生成相應(yīng)的metric并暴露給Prometheus server,當(dāng)Prometheus server來pull時(shí),直接返回實(shí)時(shí)狀態(tài)的metric。Prometheus Alertmanager報(bào)警組件用于處理收到的警報(bào)以及Grafana數(shù)據(jù)展示組件用于可視化展示收集的數(shù)據(jù)。
Prometheus整體架構(gòu)如圖1所示。
圖1 Prometheus架構(gòu)圖
Prometheus的主要特點(diǎn)如下:
(1)提供多維數(shù)據(jù)模型,時(shí)間序列由metric名稱和k/v的labels組成。
(2)提供一個(gè)靈活的查詢語句PromQL,可以利用多維數(shù)據(jù)完成復(fù)雜查詢。
(3)不依賴于分布式存儲(chǔ)的獨(dú)立的Prometheus服務(wù)器。
(4)基于HTTP的pull模式收集時(shí)間序列數(shù)據(jù),同時(shí)采用PushGateway組件收集數(shù)據(jù)。
(5)通過服務(wù)發(fā)現(xiàn)或者靜態(tài)配置去獲取監(jiān)控對象,自動(dòng)完成數(shù)據(jù)采集。
(7)支持作為數(shù)據(jù)源接入Grafana,有多種可視化圖形界面,易于伸縮[2-3]。
隨著云計(jì)算平臺(tái)的快速發(fā)展,云平臺(tái)服務(wù)因具有虛擬性、通用性、部署便捷、個(gè)性化服務(wù)和廉價(jià)性等優(yōu)點(diǎn)被廣泛應(yīng)用到生產(chǎn)和生活的各個(gè)方面,然而面對不管是大量的硬件設(shè)備或者是海量的軟件應(yīng)用服務(wù),如何對整個(gè)資源進(jìn)行有效監(jiān)控就顯得尤為重要了。越來越多的公司順勢推出了自己相應(yīng)的監(jiān)控工具,如Zabbix、Caati、InfluxDB、OpenTSDB、Nagios、Prometheus等。其中Zabbix是一個(gè)企業(yè)級、開源分布式的監(jiān)控工具,主要用于物理主機(jī),交換機(jī)和網(wǎng)絡(luò)監(jiān)控等,支持agent、snmp、JMX、telnet等多種數(shù)據(jù)采集方式并擁有豐富的插件,具有高可用性,支持多種告警方式,如基于郵件、短信和微信等,支持圖形化展示,但是存在性能瓶頸,存在單機(jī)的上線并且采用的是C和PHP語言,運(yùn)行速度會(huì)比Prometheus稍慢一些[4]。Cacti是基于PHP語言開發(fā)的網(wǎng)絡(luò)流量監(jiān)測工具,但缺點(diǎn)比較明顯如圖像效果不佳、不支持分布式等。InfluxDB是一個(gè)開源的時(shí)序數(shù)據(jù)庫,主要用于存儲(chǔ)數(shù)據(jù),如果想搭建監(jiān)控報(bào)警系統(tǒng),則需要依賴于其他的系統(tǒng),如數(shù)據(jù)采集器、報(bào)警模塊等。OpenTSDB是基于Hadoop和HBase的分布式時(shí)間序列數(shù)據(jù)庫,如果對時(shí)間序列數(shù)據(jù)有長期的存儲(chǔ)需要,并且對Hadoop十分熟悉則可以選用。Nagios是比較適合小集群或者靜態(tài)系統(tǒng)的監(jiān)控,是一個(gè)輕量化的監(jiān)控系統(tǒng),相對于目前的監(jiān)控系統(tǒng)工具來說比較古老,很多性能都沒有,不方便擴(kuò)展,需要增加很多插件[5]。
本文中所要探討的Prometheuss屬于一站式監(jiān)控報(bào)警平臺(tái);具有靈活的數(shù)據(jù)模型,同時(shí)支持在數(shù)據(jù)采集階段對監(jiān)控?cái)?shù)據(jù)的標(biāo)簽進(jìn)行修改;提供了十分靈活的豐富的查詢語句,能夠支持多維數(shù)據(jù)的復(fù)雜查詢;支持對云或者容器的監(jiān)控;具有豐富的組件支持;成熟的社區(qū)和豐富的參考文檔,以便于快速搭建監(jiān)控系統(tǒng),是目前應(yīng)用最多的云平臺(tái)的監(jiān)控工具[6]。
Prometheus官網(wǎng)提供很多Exporter鏈接,用來實(shí)現(xiàn)不同產(chǎn)品指標(biāo)數(shù)據(jù)抽取,有些標(biāo)注為官方維護(hù)如MySQL server exporter,Node/system metrics exporter等,有些由Prometheus社區(qū)開發(fā),還有一些第三提供,供大家參考或使用。但開源Exporter的指標(biāo)數(shù)量通常遠(yuǎn)遠(yuǎn)多于具體項(xiàng)目監(jiān)控指標(biāo)需求,無需周期獲取這些相應(yīng)指標(biāo)數(shù)據(jù)。如果依然周期獲取不使用指標(biāo),不僅增加Exporter接口響應(yīng)時(shí)間,也會(huì)給Prometheus及對應(yīng)后端時(shí)序存儲(chǔ)帶來一定的壓力。抑或Exporter依然全量抽取,通過Prometheus配置實(shí)現(xiàn)指標(biāo)過濾,都會(huì)增添額外的計(jì)算負(fù)擔(dān)。因此,考慮Exporter基于全量指標(biāo)基礎(chǔ)上,提供指標(biāo)分類,指標(biāo)簡單分為2類Enabled和Disabled,決定是否參與數(shù)據(jù)抽取,做到依據(jù)項(xiàng)目需求,指標(biāo)頁面可配置,每次請求時(shí)進(jìn)行指標(biāo)分類處理,并加載Enabled指標(biāo),進(jìn)行抽取。
Prometheus通過Pull方式周期的從目標(biāo)端(Exporter)抽取數(shù)據(jù)。該種松耦合的架構(gòu)方式,只要Exporter在運(yùn)行,可以在任何地方,查看監(jiān)控目標(biāo)實(shí)例的健康狀態(tài),并且可以快速定位故障。在PAAS平臺(tái)中,通常需要將Exporter部署到監(jiān)控目標(biāo)虛擬機(jī)內(nèi),對目標(biāo)入侵性較高,同時(shí)監(jiān)控不同種類指標(biāo)可能需要不同Exporter,導(dǎo)致目標(biāo)端內(nèi)需要維護(hù)多個(gè)Exporter,使目標(biāo)端Agent泛濫,帶來更多的資源消耗,維護(hù)起來更棘手。后續(xù)如果發(fā)現(xiàn)BUG或是版本升級,需要依次升級所有Exporter,風(fēng)險(xiǎn)很高。如果將Exporter從目標(biāo)端移出,作為Kubernates集群獨(dú)立服務(wù)部署,可以避免上述談到的諸多問題。Exporter作為獨(dú)立服務(wù)部署,不同的Exporter既可以分開獨(dú)立部署或按類別合并相近的Exporter如將數(shù)據(jù)庫相關(guān)的Exporter合并,形成新的DB-Exporter,對外提供指標(biāo)抽取服務(wù)。實(shí)際開發(fā)工程項(xiàng)目中,將Prometheus官網(wǎng)數(shù)據(jù)庫Redis Exporter,MySQL Server Exporter(official),MongoDB Exporter的開源代碼進(jìn)行修改合并,并成功實(shí)現(xiàn)數(shù)據(jù)庫引擎指標(biāo)抽取工作,整體結(jié)構(gòu)如圖2所示。Exporter Db提供數(shù)據(jù)庫引擎指標(biāo)抓取,Exporter vm實(shí)現(xiàn)類似Node exporter指標(biāo)數(shù)據(jù)抓取。數(shù)據(jù)渲染部分并沒有采用官方的Grafana作為解決方案,而是通過elm組件進(jìn)行個(gè)性化實(shí)現(xiàn)。UI效果呈現(xiàn),如圖2所示。
圖2
圖3
Prometheus目標(biāo)發(fā)現(xiàn)機(jī)制,在實(shí)際項(xiàng)目中的應(yīng)用。Prometheus提供兩種目標(biāo)發(fā)現(xiàn)機(jī)制?;谖募哪繕?biāo)發(fā)現(xiàn),可以結(jié)合共享存儲(chǔ)或是Etcd組件,如kubernates提供掛載共享存儲(chǔ)卷,Prometheus服務(wù)只需部署一份,可以充分利用kubernates服務(wù)高可用機(jī)制,在不同Node間秒級拉起新的Prometheus提供服務(wù),監(jiān)控目標(biāo)集合始終沒有變化。抑或通過Etcd保證Prometheus多個(gè)Node節(jié)點(diǎn)目標(biāo)配置文件一致性,Prometheus服務(wù)仍然部署一份。假設(shè)由于監(jiān)控實(shí)例目標(biāo)數(shù)量增長,需要多個(gè)Prometheus服務(wù)分擔(dān)監(jiān)控目標(biāo),且避免同一個(gè)目標(biāo)被重復(fù)拉取,就要分Node下發(fā)不同監(jiān)控目標(biāo)文件,也就失去Kubernates高可用的意義?;贑onsule服務(wù)發(fā)現(xiàn)機(jī)制,發(fā)現(xiàn)的是服務(wù),依然無法監(jiān)控不同產(chǎn)品實(shí)例目標(biāo)如數(shù)據(jù)庫,中間件實(shí)例等。但可模擬Consule服務(wù)接口/agent/self、/catalog/services、/health/service/:id來實(shí)現(xiàn)程序掃描數(shù)據(jù)庫中監(jiān)控目標(biāo)的記錄,從而實(shí)現(xiàn)表中記錄的變化,及時(shí)被Prometheus服務(wù)感知。該種方案,亦可以通過計(jì)算表中監(jiān)控目標(biāo)記錄數(shù),動(dòng)態(tài)增加Prometheus服務(wù)Replica數(shù)量,分擔(dān)Prometheus服務(wù)壓力,整體結(jié)構(gòu)如圖4所示。
圖4
依據(jù)探討點(diǎn)進(jìn)行的設(shè)計(jì)具有可行性及用戶友好型,不僅可以實(shí)現(xiàn)指標(biāo)項(xiàng)靈活修改、減少exporter數(shù)量依賴,升級便捷,最重要的通過模擬Consule后,可以動(dòng)態(tài)擴(kuò)展Prometheus Repica數(shù)量,分擔(dān)負(fù)載。