Prometheus是CNCF基金會管理的一個開源監控項目,因爲其良好的架構設計和完善的生態,迅速成爲了監控領域事實上的標準,尤爲是在雲原生領域。數據庫
隨着深刻地瞭解Prometheus,你會發現一些很是好的功能:服務器
對於一家小型單位,Prometheus足夠了。幾乎不須要任何的開發,就足以應對全部監控需求。架構
咱們都知道Prometheus,自身的時序數據庫TSDB是一個單機的數據庫,不支持分佈式是其天生的劣勢。當你的 metrics 數量足夠多的時候,單機Prometheus就顯得捉襟見肘。您的Prometheus服務器開始崩潰,大多時候是內存問題。Prometheus中的內存使用量與存儲的時間序列數量成正比,而且隨着時間序列數量的增長,Prometheus會OOM。具備數百萬個指標的Prometheus可使用超過100GB的RAM,不少時候咱們受限制於一些主機自己的大小,咱們沒法不斷的經過縱向調整機器大小來解決這個問題。併發
所以解決Prometheus的擴展性,是打造企業分佈式監控平臺的關鍵。運維
官方的解決方案是集羣聯邦,主要提供了分層聯邦和跨服務聯邦。分佈式
分層聯邦容許 Prometheus 可以擴展到十幾個數據中心和上百萬的節點。在此場景下,聯邦拓撲相似一個樹形拓撲結構,上層的 Prometheus 服務器從大量的下層 Prometheus 服務器中收集和匯聚的時序數據。工具
在跨服務聯邦中,一個服務的 Prometheus 服務器被配置來提取來自其餘服務的 Prometheus 服務器的指定的數據,以便在一個 Prometheus 服務器中對兩個數據集啓用告警和查詢。spa
這兩種聯邦,其實有很大的問題,本質上Prometheus的單機能力依舊沒有獲得解決。架構設計
拆分永遠是解決問題的一個好思路。尤爲是當你的場景是,不須要一個全局的監控視圖。設計
咱們能夠根據環境(test,uat, prod)或是業務類型(基礎設施,中間件,業務),甚至是根據部門類型來拆分。
固然能夠經過grafana配置不一樣的數據源,給使用方營造一種總體的假象。
可是這種方案,會帶來不少問題:
Prometheus社區也意識到了一樣的問題,因而提供了遠程讀寫兩個接口,讓你們可使用一些社區的時序數據庫方案,來擴展prometheus。
當前,有幾個提供長期存儲(LTS)的開源項目,而這些社區項目則領先於其餘項目:Cortex,Thanos或M3。
固然這些項目實現的方式是不一樣的,均有不一樣的優點和劣勢,須要你們根據本身單位實際的場景需求來選擇。
諸如Thanos,最終的儲存是S3等對象存儲,總體架構比較複雜。
M3db社區活躍度不夠,文檔比較少,可是M3db相比其餘幾個,是典型的時序數據庫。
Influxdb集羣版本沒有開源。
Victoria 數據是沒有副本的。
我曾經在生產環境中,使用過Clickhouse做爲長期存儲。該解決方案存在的問題是,Clickhouse併發查詢能力比較低,致使查詢的時候慢。固然寫入卻是沒有什麼大的問題。
這種架構的好處是:
尤爲當Prometheus部署到kubernetes當中,而且咱們使用了Prometheus的kubernetes sd 服務發現時,當咱們集羣變得很是大的時候,單臺的Prometheus採集能力也成爲一個瓶頸。此時,咱們可使用hash mod, 對採集任務進行分片。
本文是利用Prometheus 打造企業分佈式監控平臺系列中的第一篇文章。主要講了Prometheus的可擴展性上的一些解決方案。其實沒有百分百完美的方案,你們須要根據本身metrics的數量來選擇最合適本身的方案。