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