- 深入淺出Prometheus:原理、應用、源碼與拓展詳解
- 陳曉宇 楊川胡 陳嘯編著
- 7字
- 2019-06-19 15:57:31
第3章 數據存儲
3.1 存儲接口
Prometheus提供了兩種存儲方式,分別為本地存儲和遠端存儲。
本地存儲通過Prometheus自帶的時序數據庫將數據保存在本地,從而實現高性能讀寫。但時序數據庫畢竟是非集群的數據庫,這樣就限制了它的存儲容量,無法保存大量的歷史監控數據。為此,Prometheus引入了遠端存儲。
為了適配各種遠端存儲,Prometheus 抽象了一組數據讀寫接口,并通過適配器模式將Prometheus對遠端存儲的讀寫接口轉化為第三方的數據存儲接口,從而擴展了Prometheus存儲大量歷史數據的能力。
Prometheus存儲總共定義了兩組方法,分別用于數據寫入和數據讀取。
這里先介紹數據寫入接口Appender,主要涉及Add、AddFast、Commit和Rollback這4種方法。

Add 方法和 AddFast 方法用于追加樣本數據,請求參數主要是采樣時間和樣本值,如下所述。
◎ Add方法需要根據傳入的標簽通過 Hash算法找到(如果不存在則創建)序列ID,然后將樣本值保存到序列中。
◎ AddFast方法則直接傳入序列 ID,省去了前面進行序列查找或者序列 ID生成的步驟。
Commit 方法用于提交多個 Add 方法或將 AddFast 方法的結果持久化(例如保存到WAL中)。
Rollback方法用于回滾。
接下來講解監控數據的查詢接口Querier。Querier接口主要定義了Select方法,Select方法用于根據給定的標簽查詢對應的時序數據。具體代碼如下:


為了兼容本地存儲和遠端存儲,Prometheus提供了fanout接口,該接口同樣實現了上面的Appender接口。當執行fanout中的方法(如Add)時,fanout接口會先執行本地存儲(primary)的 Add 方法,然后遍歷執行每個遠端存儲(secondaries)的Add方法。當需要獲取Prometheus保存時間最長的監控數據時,也會分別調用本地存儲和遠端存儲的startTime方法,獲取各自的最長保存時間點,選擇最大值作為整個存儲的最長保存時間。
Prometheus連接存儲的示意圖如圖3-1所示。

圖3-1
- 數據結構(Java語言描述)
- 技術領導力:程序員如何才能帶團隊
- Android 7編程入門經典:使用Android Studio 2(第4版)
- Java加密與解密的藝術
- 微信小程序開發解析
- SharePoint Development with the SharePoint Framework
- Python完全自學教程
- HTML5從入門到精通 (第2版)
- Learning Probabilistic Graphical Models in R
- 從零開始學C#
- 小型編譯器設計實踐
- iOS Development with Xamarin Cookbook
- Three.js Essentials
- Python機器學習
- 陪孩子像搭積木一樣學編程:Python真好玩+Scratch趣味編程(全2冊)