使用本地存儲能夠下降Prometheus部署和管理的複雜度同時減小高可用(HA)帶來的複雜性。 在默認狀況下,用戶只須要部署多套Prometheus,採集相同的Targets便可實現基本的HA。
固然本地存儲也帶來了一些很差的地方,首先就是數據持久化的問題,特別是在像Kubernetes這樣的動態集羣環境下,若是Promthues的實例被從新調度,那全部歷史監控數據都會丟失。 其次本地存儲也意味着Prometheus不適合保存大量歷史數據(通常Prometheus推薦只保留幾周或者幾個月的數據)。最後本地存儲也致使Prometheus沒法進行彈性擴展。
爲了適應這方面的需求,Prometheus提供了remote_write和remote_read的特性,支持將數據存儲到遠端和從遠端讀取數據。經過將監控樣本採集和數據存儲分離,解決Prometheus的持久化問題。
除了本地存儲方面的問題,因爲Prometheus基於Pull模型,當有大量的Target須要採樣本時,單一Prometheus實例在數據抓取時可能會出現一些性能問題,聯邦集羣的特性可讓Prometheus將樣本採集任務劃分到不一樣的Prometheus實例中,而且經過一個統一的中心節點進行聚合,從而可使Prometheuse能夠根據規模進行擴展。
本地存儲
Prometheus 2.x 採用自定義的存儲格式將樣本數據保存在本地磁盤當中。以下所示,按照兩個小時爲一個時間窗口,將兩小時內產生的數據存儲在一個塊(Block)中,每個塊中包含該時間窗口內的全部樣本數據(chunks),元數據文件(meta.json)以及索引文件(index)。
而在當前時間窗口內正在收集的樣本數據,Prometheus則會直接將數據保存在內容當中。爲了確保此期間若是Prometheus發生崩潰或者重啓時可以恢復數據,Prometheus啓動時會以寫入日誌(WAL)的方式來實現重播,從而恢復數據。此期間若是經過API刪除時間序列,刪除記錄也會保存在單獨的邏輯文件當中(tombstone)。
內存中的block數據未寫入磁盤時,block目錄下面主要保存wal文件:
./data/01BKGV7JBM69T2G1BGBGM6KB12
./data/01BKGV7JBM69T2G1BGBGM6KB12/meta.json
./data/01BKGV7JBM69T2G1BGBGM6KB12/wal/000002
./data/01BKGV7JBM69T2G1BGBGM6KB12/wal/000001
持久化的block目錄下wal文件被刪除,timeseries數據保存在chunk文件裏。index用於索引timeseries在wal文件裏的位置。
./data/01BKGV7JC0RY8A6MACW02A2PJD
./data/01BKGV7JC0RY8A6MACW02A2PJD/meta.json
./data/01BKGV7JC0RY8A6MACW02A2PJD/index
./data/01BKGV7JC0RY8A6MACW02A2PJD/chunks
./data/01BKGV7JC0RY8A6MACW02A2PJD/chunks/000001
./data/01BKGV7JC0RY8A6MACW02A2PJD/tombstones
經過時間窗口的形式保存全部的樣本數據,能夠明顯提升Prometheus的查詢效率,當查詢一段時間範圍內的全部樣本數據時,只須要簡單的從落在該範圍內的塊中查詢數據便可。
存儲配置
對於本地存儲,prometheus提供了一些配置項,主要包括:
--storage.tsdb.path: 存儲數據的目錄,默認爲data/,若是要掛外部存儲,能夠指定該目錄
--storage.tsdb.retention.time:
數據過時清理時間,默認保存15天
--storage.tsdb.retention.size: 聲明數據塊的最大值,不包括wal文件,如512MB
Prometheus有着很是高效的時間序列數據存儲方法,每一個採樣數據僅僅佔用3.5byte左右空間,上百萬條時間序列,30秒間隔,保留60天,大概花了200多G(引用官方PPT)。
1KB Chunks
在Prometheus的世界中,不管是內存仍是磁盤,它都是以1KB單位分紅塊來操做的。(新出的Prometheus 2.0對存儲底層作了很大改動,專門針對SSD的寫放大進行了優化,提升SSD的讀寫性能和讀寫次數等。)
總體流程是 抓取數據 -> 寫到head chunk,寫滿1KB,就再生成新的塊,完成的塊,是不可再變動的 -> 根據配置文件的設置,有一部份chunk會被保留在內存裏,按照LRU算法,按期將塊寫進磁盤文件內。
注意: 一條時間序列,保存到一個磁盤文件內。
時間序列的保留維護
在Prometheus的啓動選項中,有一項storage.local.retention能夠設置數據自動保留多長時間,例如24h,表示數據超過24小時內的將會自動清除,相似於zabbix的housekeeping功能。storage.local.series-file-shrink-ratio能夠按必定的比例保留數據。
遠程存儲
Prometheus的本地存儲設計能夠減小其自身運維和管理的複雜度,同時可以知足大部分用戶監控規模的需求。可是本地存儲也意味着Prometheus沒法持久化數據,沒法存儲大量歷史數據,同時也沒法靈活擴展和遷移。
爲了保持Prometheus的簡單性,Prometheus並無嘗試在自身中解決以上問題,而是經過定義兩個標準接口(remote_write/remote_read),讓用戶能夠基於這兩個接口將數據保存到任意第三方的存儲服務中,這種方式在Promthues中稱爲遠程存儲(Remote Storage)。
Remote Write
用戶能夠在Prometheus配置文件中指定Remote Write(遠程寫)的URL地址,好比指向influxdb中,也可指向消息隊列等。
remote_write 主要用於可寫遠程存儲配置,主要包含如下參數:
url: 訪問地址
remote_timeout: 請求超時時間
write_relabel_configs: 標籤重置配置, 拉取到的數據,通過重置處理後,發送給遠程存儲
<remote_write>
write_relabel_configs將從新標籤應用於樣本,而後再將其發送到遠程端點。在外部標籤以後應用寫從新標記。這能夠用來限制發送哪些樣本。
Remote Read
Promthues的Remote Read(遠程讀)的流程當中,當用戶發起查詢請求後(也就是說Remote Read只在數據查詢時有效),Promthues將向remote_read中配置的URL發起查詢請求,接收Promthues的原始樣本數據。
當獲取到樣本數據後,Promthues在本地使用PromQL對樣本數據進行二次處理。
remote_read 主要用於可讀遠程存儲配置,主要包含如下參數:
url: 訪問地址
remote_timeout: 請求超時時間
社區中支持prometheus遠程讀寫的方案
AppOptics: write
Chronix: write
Cortex: read and write
CrateDB: read and write
Elasticsearch: write
Gnocchi: write
Graphite: write
InfluxDB: read and write
OpenTSDB: write
PostgreSQL/TimescaleDB: read and write
SignalFx: write
clickhouse: read and write
Demo: InfluxDB
CREATE DATABASE "prometheus"
remote_write:
remote_read:
或
remote_write:
remote_read:
查看influxdb:
> select * from up
name: up
time __name__ instance job value
---- -------- -------- --- -----
1569564952174000000 up localhost:9090 prometheus 1
1569564967174000000 up localhost:9090 prometheus 1
1569564982174000000 up localhost:9090 prometheus 1
1569564997174000000 up localhost:9090 prometheus 1
1569565012174000000 up localhost:9090 prometheus 1
1569565027174000000 up localhost:9090 prometheus 1
1569565042174000000 up localhost:9090 prometheus 1
Influxdb的cli中查詢結果time列格式顯示設置
1.直接執行 influx -precision rfc3339
2.或者登陸到influx cli以後
precision rfc3339