運(yùn)維之三大監(jiān)控對(duì)比
1. zabbix
Zabbix核心組件主要是Agent和Server,其中Agent主要負(fù)責(zé)采集數(shù)據(jù)并通過(guò)主動(dòng)或者被動(dòng)的方式采集數(shù)據(jù)發(fā)送到Server/Proxy,除此之外,為了擴(kuò)展監(jiān)控項(xiàng),Agent還支持執(zhí)行自定義腳本。Server主要負(fù)責(zé)接收Agent發(fā)送的監(jiān)控信息,并進(jìn)行匯總存儲(chǔ),觸發(fā)告警等。
Zabbix由于使用了關(guān)系型數(shù)據(jù)存儲(chǔ)時(shí)序數(shù)據(jù),所以在監(jiān)控大規(guī)模集群時(shí)常常在數(shù)據(jù)存儲(chǔ)方面捉襟見(jiàn)肘。所以從Zabbix 4.2版本后開(kāi)始支持TimescaleDB時(shí)序數(shù)據(jù)庫(kù),不過(guò)目前成熟度還不高。
2. falcon
- Falcon-agent是用Go語(yǔ)言開(kāi)發(fā)的Daemon程序,運(yùn)行在每臺(tái)Linux服務(wù)器上,用于采集主機(jī)上的各種指標(biāo)數(shù)據(jù),主要包括CPU、內(nèi)存、磁盤、文件系統(tǒng)、內(nèi)核參數(shù)、Socket連接等,目前已經(jīng)支持200多項(xiàng)監(jiān)控指標(biāo)。并且,Agent支持用戶自定義的監(jiān)控腳本。
- Hearthbeat server簡(jiǎn)稱HBS心跳服務(wù),每個(gè)Agent都會(huì)周期性地通過(guò)RPC方式將自己的狀態(tài)上報(bào)給HBS,主要包括主機(jī)名、主機(jī)IP、Agent版本和插件版本,Agent還會(huì)從HBS獲取自己需要執(zhí)行的采集任務(wù)和自定義插件。
- Transfer負(fù)責(zé)接收Agent發(fā)送的監(jiān)控?cái)?shù)據(jù),并對(duì)數(shù)據(jù)進(jìn)行整理,在過(guò)濾后通過(guò)一致性Hash算法發(fā)送到Judge或者Graph。
- Graph是基于RRD的數(shù)據(jù)上報(bào)、歸檔、存儲(chǔ)組件。Graph在收到數(shù)據(jù)以后,會(huì)以rrdtool的數(shù)據(jù)歸檔方式來(lái)存儲(chǔ),同時(shí)提供RPC方式的監(jiān)控查詢接口。
- Judge告警模塊,Transfer轉(zhuǎn)發(fā)到Judge的數(shù)據(jù)會(huì)觸發(fā)用戶設(shè)定的告警規(guī)則,如果滿足,則會(huì)觸發(fā)郵件、微信或者回調(diào)接口。這里為了避免重復(fù)告警引入了Redis暫存告警,從而完成告警的合并和抑制。
- Dashboard是面向用戶的監(jiān)控?cái)?shù)據(jù)查詢和告警配置界面。
3. prometheus
Prometheus Server負(fù)責(zé)定時(shí)在目標(biāo)上抓取metrics(指標(biāo))數(shù)據(jù)并保存到本地存儲(chǔ)里面。Prometheus采用了一種Pull(拉)的方式獲取數(shù)據(jù),不僅降低客戶端的復(fù)雜度,客戶端只需要采集數(shù)據(jù),無(wú)需了解服務(wù)端情況,而且服務(wù)端可以更加方便的水平擴(kuò)展。
如果監(jiān)控?cái)?shù)據(jù)達(dá)到告警閾值Prometheus Server會(huì)通過(guò)HTTP將告警發(fā)送到告警模塊alertmanger,通過(guò)告警的抑制后觸發(fā)郵件或者webhook。Prometheus支持PromQL提供多維度數(shù)據(jù)模型和靈活的查詢,通過(guò)監(jiān)控指標(biāo)關(guān)聯(lián)多個(gè)tag的方式,將監(jiān)控?cái)?shù)據(jù)進(jìn)行任意維度的組合以及聚合。
對(duì)比:
- 開(kāi)發(fā)語(yǔ)言 便捷易部署(promehteus)
- 系統(tǒng)成熟度(zabbix)20多年
- 系統(tǒng)擴(kuò)展性 Zabbix和Open-Falcon都可以自定義各種監(jiān)控腳本,并且Zabbix不僅可以做到主動(dòng)推送,還可以做到被動(dòng)拉取,Prometheus則定義了一套監(jiān)控?cái)?shù)據(jù)規(guī)范,并通過(guò)各種exporter擴(kuò)展系統(tǒng)采集能力。
- 數(shù)據(jù)存儲(chǔ) Zabbix采用關(guān)系數(shù)據(jù)庫(kù)保存,這極大限制了Zabbix采集的性能,Nagios和Open-Falcon都采用RDD數(shù)據(jù)存儲(chǔ) ,Prometheus自研一套高性能的時(shí)序數(shù)據(jù)庫(kù),在V3版本可以達(dá)到每秒千萬(wàn)級(jí)別的數(shù)據(jù)存儲(chǔ),通過(guò)對(duì)接第三方時(shí)序數(shù)據(jù)庫(kù)擴(kuò)展歷史數(shù)據(jù)的存儲(chǔ);
- 配置復(fù)雜度 Prometheus只有一個(gè)核心server組件,其他系統(tǒng)配置相對(duì)麻煩,尤其是Open-Falcon。
- 社區(qū)活躍度 Prometheus在這方面占據(jù)絕對(duì)優(yōu)勢(shì),社區(qū)活躍度最高,并且受到CNCF的支持
- 容器支持 Prometheus開(kāi)始成為主導(dǎo)及容器監(jiān)控方面的標(biāo)配
Prometheus功能介紹
(1) prometheus的指標(biāo)類型
- Counter(計(jì)數(shù)器):計(jì)數(shù)統(tǒng)計(jì),累計(jì)多長(zhǎng)或者累計(jì)多少次等。它的特點(diǎn)是只增不減,譬如HTTP訪問(wèn)總量;
- Gauge(儀表盤):數(shù)據(jù)是一個(gè)瞬時(shí)值,如果當(dāng)前內(nèi)存用量,它隨著時(shí)間變化忽高忽低。
如果需要了解某個(gè)時(shí)間段內(nèi)請(qǐng)求的響應(yīng)時(shí)間,通常做法是使用平均響應(yīng)時(shí)間,但這樣做無(wú)法體現(xiàn)數(shù)據(jù)的長(zhǎng)尾效應(yīng)。例如,一個(gè)HTTP服務(wù)器的正常響應(yīng)時(shí)間是30ms,但有很少幾次請(qǐng)求耗時(shí)3s,通過(guò)平均響應(yīng)時(shí)間很難甄別長(zhǎng)尾效應(yīng),所以Prometheus引入了Histogram和Summary。
- Histogram(直方圖):服務(wù)端分位,不同區(qū)間內(nèi)樣本的個(gè)數(shù),譬如班級(jí)成績(jī),低于60分的9個(gè),低于70分的10個(gè),低于80分的50個(gè)。
- Summary(摘要):客戶端分位,直接在客戶端通過(guò)分位情況,還是用班級(jí)成績(jī)舉例:0.8分位的是,80分,0.9分為85分,0.99分為的是98分
(2) prometheus的client應(yīng)用方式
- 客戶端集成client,提供metrics接口查詢
- 通過(guò)exporter方式
(3) prometheus的存儲(chǔ)方式
Prometheus提供了兩種數(shù)據(jù)持久化方式:
- 一種是本地存儲(chǔ),通過(guò)Prometheus自帶的tsdb(時(shí)序數(shù)據(jù)庫(kù)),將數(shù)據(jù)保存到本地磁盤,為了性能考慮,建議使用SSD。但本地存儲(chǔ)的容量畢竟有限,建議不要保存超過(guò)一個(gè)月的數(shù)據(jù)。Prometheus本地存儲(chǔ)經(jīng)過(guò)多年改進(jìn),自Prometheus 2.0后提供的V3版本tsdb性能已經(jīng)非常高,可以支持單機(jī)每秒1000w個(gè)指標(biāo)的收集。
- 另一種是遠(yuǎn)端存儲(chǔ),適用于大量歷史監(jiān)控?cái)?shù)據(jù)的存儲(chǔ)和查詢。通過(guò)中間層的適配器的轉(zhuǎn)化,Prometheus將數(shù)據(jù)保存到遠(yuǎn)端存儲(chǔ)。適配器實(shí)現(xiàn)Prometheus存儲(chǔ)的remote write和remote read接口并把數(shù)據(jù)轉(zhuǎn)化為遠(yuǎn)端存儲(chǔ)支持的數(shù)據(jù)格式。目前,遠(yuǎn)端存儲(chǔ)主要包括OpenTSDB、InfluxDB、Elasticsearch、M3db、Kafka等,其中M3db是目前非常受歡迎的后端存儲(chǔ)。
(4) prometheus的查詢方式
和關(guān)系型數(shù)據(jù)庫(kù)的SQL類似,Prometheus也內(nèi)置了數(shù)據(jù)查詢語(yǔ)言PromQL,它提供對(duì)時(shí)間序列數(shù)據(jù)豐富的查詢,聚合以及邏輯運(yùn)算的能力。一條PromQL主要包括了指標(biāo)名稱、過(guò)濾器以及函數(shù)和參數(shù)。并且指標(biāo)可以進(jìn)行數(shù)據(jù)運(yùn)算。
(5) prometheus的監(jiān)控方式
Prometheus配置監(jiān)控對(duì)象有兩種方式,一種是通過(guò)靜態(tài)文件配置,另一種是動(dòng)態(tài)發(fā)現(xiàn)機(jī)制,自動(dòng)注冊(cè)監(jiān)控對(duì)象。
Prometheus動(dòng)態(tài)發(fā)現(xiàn)目前已經(jīng)支持Kubernetes、etcd、Consul等多種服務(wù)發(fā)現(xiàn)機(jī)制,動(dòng)態(tài)發(fā)現(xiàn)機(jī)制可以減少運(yùn)維人員手動(dòng)配置,在容器運(yùn)行環(huán)境中尤為重要,容器集群通常在幾千甚至幾萬(wàn)的規(guī)模,如果每個(gè)容器都需要單獨(dú)配置監(jiān)控項(xiàng)不僅需要大量工作量,而且容器經(jīng)常變動(dòng),后續(xù)維護(hù)更是異常麻煩。針對(duì)Kubernetes環(huán)境的動(dòng)態(tài)發(fā)現(xiàn),Prometheus通過(guò)watch kubernetes api動(dòng)態(tài)獲取當(dāng)前集群所有服務(wù)和容器情況,從而動(dòng)態(tài)調(diào)整監(jiān)控對(duì)象
為了擴(kuò)展單個(gè)Prometheus的采集能力和存儲(chǔ)能力,Prometheus引入了“聯(lián)邦”的概念。
多個(gè)Prometheus節(jié)點(diǎn)組成兩層聯(lián)邦結(jié)構(gòu),如圖所示,上面一層是聯(lián)邦節(jié)點(diǎn),負(fù)責(zé)定時(shí)從下面的Prometheus節(jié)點(diǎn)獲取數(shù)據(jù)并匯總,部署多個(gè)聯(lián)邦節(jié)點(diǎn)是為了實(shí)現(xiàn)高可用
并且聯(lián)邦機(jī)制可以分為倆種,一種是跨服務(wù)聯(lián)合,一種是分層聯(lián)邦。
- 跨服務(wù)聯(lián)合,從不同的源抓取特定的服務(wù)的監(jiān)控?cái)?shù)據(jù),然后做聚合處理;
- 分層聯(lián)邦,就向一顆樹(shù),更高級(jí)別的prometheus服務(wù)從大量次級(jí)服務(wù)器收集聚合時(shí)間序列數(shù)據(jù),然后去統(tǒng)一制定告警規(guī)則,分發(fā)觸發(fā)事件。
除此之外,prometheus可以依靠Thanos外掛服務(wù),實(shí)現(xiàn)prometheus集群化、以及數(shù)據(jù)長(zhǎng)期存儲(chǔ)的功能,有興趣的可以了解下。其實(shí)在prometheus2.0自身使用remote-wirte,remote-read接口已經(jīng)解決了數(shù)據(jù)長(zhǎng)期存儲(chǔ)的問(wèn)題了。預(yù)計(jì)3.0會(huì)做出更大的提升,尤其是prometheus的集群化。