Prometheus 與 VictoriaMetrics 優(yōu)缺點(diǎn)對(duì)比
時(shí)序數(shù)據(jù)庫(kù)有很多,比如Prometheus、M3DB、TimescaleDB、OpenTSDB、InfluxDB等等。Prometheus與VictoriaMetrics都是開(kāi)源的時(shí)間序列數(shù)據(jù)庫(kù),它們都提供了強(qiáng)大的監(jiān)控和告警解決方案。本文我們分析下Prometheus和VictoriaMetrics之間的差異以及優(yōu)缺點(diǎn),從而來(lái)為用戶提供最合適的解決方案。
Prometheus
Prometheus最初是 SoundCloud 中的一個(gè)項(xiàng)目,是一個(gè)功能強(qiáng)大的監(jiān)控和警報(bào)工具包,專門用于處理多維環(huán)境中的時(shí)間序列數(shù)據(jù)。由于其對(duì)多維數(shù)據(jù)收集、查詢和警報(bào)生成的本機(jī)支持,它在 SRE 和 DevOps 社區(qū)中變得非常受歡迎。
Prometheus 是在云原生計(jì)算基金會(huì) (CNCF) 下開(kāi)發(fā)的。Prometheus 服務(wù)器、客戶端庫(kù)、Alertmanager 和其他相關(guān)組件可以在 Prometheus GitHub 組織中找到。主要存儲(chǔ)庫(kù)是:https://github.com/prometheus/prometheus
VictoriaMetrics
VictoriaMetrics則是一個(gè)高性能、高性價(jià)比、可擴(kuò)展的時(shí)間序列數(shù)據(jù)庫(kù),可以作為Prometheus的長(zhǎng)期遠(yuǎn)程存儲(chǔ)。它擁有超強(qiáng)的數(shù)據(jù)壓縮和高速數(shù)據(jù)攝取能力,使其成為大規(guī)模監(jiān)控任務(wù)的有吸引力的替代方案。VictoriaMetrics源代碼可以在以下位置找到:https://github.com/VictoriaMetrics/VictoriaMetrics
性能比較
VictoriaMetrics 與 Prometheus 之間的數(shù)據(jù)攝取和查詢率性能基于使用指標(biāo)的基準(zhǔn)node_exporter`測(cè)試。內(nèi)存和磁盤空間使用情況數(shù)據(jù)適用于單個(gè) Prometheus 或 VictoriaMetrics 服務(wù)器。
比較  | Prometheus  | VictoriaMetrics  | 
數(shù)據(jù)采集  | 基于拉動(dòng)  | 基于拉式和推式  | 
數(shù)據(jù)攝取  | 每秒高達(dá) 240,000 個(gè)樣本  | 每秒高達(dá) 360,000 個(gè)樣本  | 
數(shù)據(jù)查詢  | 每秒高達(dá) 80,000 次查詢  | 每秒高達(dá) 100,000 次查詢  | 
內(nèi)存使用情況  | 高達(dá) 14GB RAM  | 高達(dá) 4.3GB 的 RAM  | 
數(shù)據(jù)壓縮  | 使用LZF壓縮  | 使用 Snappy 壓縮  | 
磁盤寫入頻率  | 更頻繁地將數(shù)據(jù)寫入磁盤  | 減少將數(shù)據(jù)寫入磁盤的頻率  | 
磁盤空間使用情況  | 需要更多磁盤空間  | 需要更少的磁盤空間  | 
查詢語(yǔ)言  | PromQL  | MetricsQL(向后兼容 PromQL)  | 
可擴(kuò)展性和集成性比較
Prometheus使用基于PUll模型來(lái)收集指標(biāo),可以處理多達(dá)數(shù)百萬(wàn)個(gè)活動(dòng)時(shí)間序列。該架構(gòu)雖然簡(jiǎn)化了監(jiān)控服務(wù)方的操作。但是也有一定的弊端,比如多個(gè)實(shí)例抓取的是相同的監(jiān)控指標(biāo),不能保證采集的數(shù)據(jù)值為一致的,并且在實(shí)際的使用中可能遇到網(wǎng)絡(luò)延遲問(wèn)題,所以會(huì)產(chǎn)生數(shù)據(jù)不一致的問(wèn)題,不過(guò)對(duì)于監(jiān)控報(bào)警這個(gè)場(chǎng)景來(lái)說(shuō),一般不會(huì)要求數(shù)據(jù)的強(qiáng)一致性,所以從業(yè)務(wù)上來(lái)說(shuō)是可以接受,因?yàn)檫@種數(shù)據(jù)不一致性影響基本上沒(méi)什么影響。這種場(chǎng)景適合監(jiān)控規(guī)模不大,只需要保存短周期監(jiān)控?cái)?shù)據(jù)的場(chǎng)景。
圖片
而 VictoriaMetrics支持pull模型和Push模型。它能夠處理大量數(shù)據(jù)和更廣泛的網(wǎng)絡(luò)場(chǎng)景(得益于其推送模型支持),使其具有可擴(kuò)展性和靈活性。
Prometheus架構(gòu)
圖片
Prometheus的架構(gòu)由四個(gè)主要組件組成:
- Prometheus Server :Prometheus Server是Prometheus的核心組件,主要負(fù)責(zé)從各個(gè)目標(biāo)(target)中收集指標(biāo)(metrics)數(shù)據(jù),并對(duì)這些數(shù)據(jù)進(jìn)行存儲(chǔ)、聚合和查詢。
 - Client Libraries :Prometheus提供了多種客戶端庫(kù),用于在應(yīng)用程序中嵌入Prometheus的指標(biāo)收集功能。
 - Exporters :Exporters是用于將第三方系統(tǒng)的監(jiān)控?cái)?shù)據(jù)導(dǎo)出為Prometheus格式的組件。Prometheus支持多種Exporters,例如Node Exporter、MySQL Exporter、HAProxy Exporter等。
 - Alertmanager:Alertmanager是Prometheus的告警組件,用于根據(jù)用戶定義的規(guī)則對(duì)監(jiān)控?cái)?shù)據(jù)進(jìn)行告警。
 - 服務(wù)發(fā)現(xiàn):Prometheus 支持各種服務(wù)發(fā)現(xiàn)機(jī)制,幫助它找到應(yīng)該抓取的目標(biāo)。
 - PromQL:這是 Prometheus 內(nèi)置的靈活查詢語(yǔ)言,用于數(shù)據(jù)探索和儀表板,與 SQL 不同。
 
VictoriaMetrics架構(gòu)
VictoriaMetrics 提供單機(jī)版和集群版。如果您的每秒寫入數(shù)據(jù)點(diǎn)數(shù)小于100萬(wàn)(這個(gè)數(shù)量是個(gè)什么概念呢,如果只是做機(jī)器設(shè)備的監(jiān)控,每個(gè)機(jī)器差不多采集200個(gè)指標(biāo),采集頻率是10秒的話每臺(tái)機(jī)器每秒采集20個(gè)指標(biāo)左右,100萬(wàn)/20=5萬(wàn)臺(tái)機(jī)器),VictoriaMetrics 官方默認(rèn)推薦您使用單機(jī)版,單機(jī)版可以通過(guò)增加服務(wù)器的CPU核心數(shù),增加內(nèi)存,增加IOPS來(lái)獲得線性的性能提升。且單機(jī)版易于配置和運(yùn)維。
下面這是一個(gè)集群版的架構(gòu)圖
圖片
VictoriaMetrics在保持更簡(jiǎn)單的架構(gòu)的同時(shí),還包括幾個(gè)核心組件:
- vmstorage:數(shù)據(jù)存儲(chǔ)以及查詢結(jié)果返回,默認(rèn)端口為 8482
 - vminsert:數(shù)據(jù)錄入,可實(shí)現(xiàn)類似分片、副本功能,默認(rèn)端口 8480
 - vmselect:數(shù)據(jù)查詢,匯總和數(shù)據(jù)去重,默認(rèn)端口 8481
 - vmagent:數(shù)據(jù)指標(biāo)抓取,支持多種后端存儲(chǔ),會(huì)占用本地磁盤緩存,默認(rèn)端口 8429
 - vmalert:報(bào)警相關(guān)組件,如果不需要告警功能可以不使用該組件,默認(rèn)端口為 8880
 
數(shù)據(jù)壓縮和存儲(chǔ)效率
Prometheus擁有高效的存儲(chǔ)系統(tǒng),但在長(zhǎng)期數(shù)據(jù)存儲(chǔ)后端和檢索效率方面不如VictoriaMetrics。
VictoriaMetrics 相對(duì)于 Prometheus 的主要優(yōu)勢(shì)之一是其數(shù)據(jù)壓縮功能。它的數(shù)據(jù)壓縮算法,可顯著降低存儲(chǔ)要求。VictoriaMetrics 聲稱提供比 Prometheus 高出 10 倍的數(shù)據(jù)壓縮,這是長(zhǎng)期數(shù)據(jù)保留和成本優(yōu)化的關(guān)鍵優(yōu)勢(shì)。
Prometheus
- 內(nèi)存存儲(chǔ):Prometheus利用內(nèi)存存儲(chǔ)來(lái)訪問(wèn)最近的時(shí)間序列數(shù)據(jù)。數(shù)據(jù)庫(kù)中的這個(gè)部分被稱為head block。
 - 磁盤存儲(chǔ):當(dāng)數(shù)據(jù)達(dá)到一定的年齡或大小后,位于"head block"中的數(shù)據(jù)會(huì)被移動(dòng)到磁盤中,這個(gè)過(guò)程稱為checkpointing。這個(gè)數(shù)據(jù)庫(kù)由長(zhǎng)期存儲(chǔ)的"persistent blocks"組成。
 
VictoriaMetrics
1.內(nèi)存存儲(chǔ):與 Prometheus 類似,VictoriaMetrics 使用內(nèi)存存儲(chǔ)在傳入數(shù)據(jù)寫入磁盤之前進(jìn)行緩沖。這種方法有助于優(yōu)化寫入性能。同時(shí)還緩存經(jīng)常訪問(wèn)的數(shù)據(jù)以加快檢索速度。
2.磁盤存儲(chǔ):VictoriaMetrics 中的大部分?jǐn)?shù)據(jù)存儲(chǔ)在磁盤上。它使用一種高效的存儲(chǔ)格式,可以實(shí)現(xiàn)大幅度地進(jìn)行數(shù)據(jù)壓縮。
查詢語(yǔ)言
PromQL
Prometheus使用PromQL。PromQL 允許實(shí)時(shí)選擇和聚合時(shí)間序列數(shù)據(jù)。它使我們能夠高度靈活地使用指標(biāo)。通過(guò) PromQL,用戶可以過(guò)濾和聚合指標(biāo),計(jì)算比率、比率、平均值和百分位數(shù)等指標(biāo)。
MetricsQL
VictoriaMetrics向后兼容 PromQL。我們都可以按照理解的 PromQL 語(yǔ)法來(lái)進(jìn)行查詢。但是,它還引入了 PromQL 的擴(kuò)展,稱為MetricsQL。MetricsQL 增強(qiáng)了 PromQL 提供的查詢功能。它引入了新函數(shù)、運(yùn)算符和語(yǔ)法糖。簡(jiǎn)化并改善了用戶體驗(yàn),特別是對(duì)于復(fù)雜的查詢和聚合。
攝取率
Prometheus
- Prometheus定期從監(jiān)控目標(biāo)中獲取指標(biāo)。這些獲取的頻率的調(diào)整可以控制數(shù)據(jù)攝取速率。
 - Prometheus實(shí)際上能夠攝取數(shù)據(jù)的速率取決于許多因素,包括運(yùn)行的硬件性能、被獲取的指標(biāo)的復(fù)雜性以及存儲(chǔ)層的效率。
 - 如果Prometheus無(wú)法跟上傳入數(shù)據(jù)量,可能會(huì)丟棄樣本或增加延遲。
 
VictoriaMetrics
- VictoriaMetrics則比Prometheus更加高效利用資源。它聲稱在相同的數(shù)據(jù)量下,能夠更高效地?cái)z取數(shù)據(jù),使用更少的CPU、內(nèi)存和磁盤空間。
 - 這種效率使得VictoriaMetrics在相同硬件上能夠比Prometheus更快地?cái)z取數(shù)據(jù)。
 - 在架構(gòu)設(shè)計(jì)方面,VictoriaMetrics可以通過(guò)拉?。ㄅcPrometheus類似)和推送模式來(lái)攝取數(shù)據(jù)。推送模式對(duì)于高基數(shù)數(shù)據(jù)和攝取速率是有幫助的。
 
高可用性和可靠性
Prometheus 本身并不支持集群,這意味著它不提供原生高可用性。高可用性可以通過(guò)運(yùn)行重復(fù)實(shí)例來(lái)實(shí)現(xiàn),或者thanos架構(gòu),當(dāng)然也可以整合VictoriaMetrics。
來(lái)源:vivo容器監(jiān)控系統(tǒng)架構(gòu)
而VictoriaMetrics 在設(shè)計(jì)時(shí)就考慮到了高可用性。它使用復(fù)制和集群來(lái)確保在實(shí)例發(fā)生故障時(shí)數(shù)據(jù)不會(huì)丟失,從而成為了很多大廠的選擇。
API接口
Prometheus和VictoriaMetrics都提供了基于 Http的 API接口,以滿足客戶端調(diào)用需求
Prometheus API
- 查詢:Prometheus提供了PromQL查詢語(yǔ)言,用戶可以使用該語(yǔ)言通過(guò)HTTP API查詢指標(biāo)數(shù)據(jù)。
 - 元數(shù)據(jù):API endpoint提供對(duì) Prometheus 服務(wù)器中關(guān)系列和標(biāo)簽的元數(shù)據(jù)的訪問(wèn)。
 - 管理:某些管理任務(wù),例如刪除系列、快照等,也可以通過(guò) API 執(zhí)行。
 
VictoriaMetrics API
VictoriaMetrics提供了一個(gè)全面的HTTP API,根據(jù)功能分為幾個(gè)部分:
- 適用于Prometheus的指標(biāo)API:此API與Prometheus的HTTP API兼容,這意味著可以將VictoriaMetrics作為Prometheus的替代品。
 - InfluxDB API:VictoriaMetrics還提供與InfluxDB的寫入和查詢API兼容的API。這使得從InfluxDB切換到VictoriaMetrics也很容易。
 - Graphite API:VictoriaMetrics還為Graphite的API提供了一個(gè)兼容層。
 - MetricsQL和PromQL API:這些API用于查詢存儲(chǔ)在VictoriaMetrics中的指標(biāo)數(shù)據(jù)。MetricsQL是VictoriaMetrics特定的PromQL擴(kuò)展,提供了PromQL中不可用的額外功能。
 
與 Grafana 集成
由于 VictoriaMetrics兼容Prometheus,所以在 在 Grafana 進(jìn)行可視化配置時(shí),可以使用“Prometheus”數(shù)據(jù)源,并將 Url 設(shè)置為VictoriaMetrics Server 地址即可。
總結(jié)
以上我們總結(jié)Prometheus與VictoriaMetrics的各個(gè)方面的對(duì)比,雖然VictoriaMetrics在某些方面可能比Prometheus更強(qiáng)大,比如在處理大規(guī)模數(shù)據(jù)和高并發(fā)負(fù)載時(shí)的性能表現(xiàn),完全可以替換Prometheus,但它相對(duì)來(lái)說(shuō)是相對(duì)較新的項(xiàng)目,尚未達(dá)到Prometheus在用戶社區(qū)和廣泛采用方面的水平。此外,Prometheus的發(fā)展時(shí)間更早,是CNCF第二個(gè)畢業(yè)的項(xiàng)目,已經(jīng)得到了大量用戶的驗(yàn)證,并且有更多的文檔、教程和案例可供參考。
此外,技術(shù)的流行和廣泛采用并不僅僅取決于技術(shù)本身的性能,還受到多個(gè)因素的影響,包括市場(chǎng)宣傳、社區(qū)支持、用戶體驗(yàn)和可用性等。Prometheus在這些方面都做得相對(duì)較好,因此在監(jiān)控領(lǐng)域更為流行和廣泛采用。
參考















 
 
 





 
 
 
 