剖析Prometheus的內部存儲機制


Prometheus有着非常高效的時間序列數據存儲方法,每個采樣數據僅僅占用3.5byte左右空間,上百萬條時間序列,30秒間隔,保留60天,大概花了200多G(引用官方PPT)。
接下來讓我們看看他的原理。

Prometheus內部主要分為三大塊,Retrieval是負責定時去暴露的目標頁面上去抓取采樣指標數據,Storage是負責將采樣數據寫磁盤,PromQL是Prometheus提供的查詢語言模塊。

從最原始的抓取數據上來看,基本是這個樣子,timestamp是當前抓取時間戳:

每個Metric name代表了一類的指標,他們可以攜帶不同的Labels,每個Metric name + Label組合成代表了一條時間序列的數據。
例如圖上的數據:

http_requests_total{status="200",method="GET"}
http_requests_total{status="404",method="GET"}

表示了兩條不同的時間序列。

在Prometheus的世界里面,所有的數值都是64bit的。每條時間序列里面記錄的其實就是64bit timestamp(時間戳) + 64bit value(采樣值)。

而對於時間序列的基本特性來說,通常是過去的數據一般是只讀的,是不會變更的,當前時間的數據才會可能在寫,模式如下圖:

根據上面的分析,時間序列的存儲似乎可以設計成key-value存儲的方式(基於BigTable)。

進一步拆分,可以像下面這樣子:

上圖的第二條樣式就是現在Prometheus內部的表現形式了,__name__是特定的label標簽,代表了metric name。

再回顧一下Prometheus的整體流程:

上面提到了K-V存儲,當然是使用了LevelDB的引擎,它的特點是順序讀寫性能非常高,這是非常符合時間序列的存儲的。

為了得到順序的時間序列哈希索引值,Prometheus是這樣處理的:

FNV哈希算法全名為Fowler-Noll-Vo算法,是以三位發明人Glenn Fowler,Landon Curt Noll,Phong Vo的名字來命名的,最早在1991年提出。
FNV能快速hash大量數據並保持較小的沖突率,它的高度分散使它適用於hash一些非常相近的字符串,比如URL,hostname,文件名,text,IP地址等。

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可以按一定的比例保留數據。

關於Chunk 塊編碼的剖析

Prometheus 提供三種不同類型的塊編碼,用戶可以在Prometheus啟動時指定最新的編碼方式,-storage.local.chunk-encoding-version,有效值是0,1,2。

版本0的編碼是較老版本上的Prometheus上使用的,新版本已經不再建議使用的。

版本1是當前版本默認提供的編碼方式,它相對於0版有較好的壓縮能力,而且在一個塊內,有較高的訪問速度,當然版本0的編碼速度是最快的,但是相對版本1,速度優勢不是特別明顯。

版本2提供了一個更高的壓縮比例,編碼和解碼需要耗更多的CPU,當然,這是取決於查詢的數據集有多大。通常如果是較少的查詢,僅用於存檔的數據,可以使用這種編碼。

對比:

Chunk版本號 每個采樣點所占字節 耗CPU核 塊編碼耗時
1 3.3 1.6 2.9s
2 1.3 2.4 4.9s

V0 結構

V1 結構

V2 結構

Prometheus是如何訪止數據丟失的呢?例如發生異常關閉或者什么別的情況?它提供了一個Checkpointing功能,對於內存里面的塊,Prometheus 使用了一個checkpoint file 去同步寫入磁盤,類似於Hbase的WAL原理,當發生crash時,先從checkpoint file去恢復數據。

以上內容是根據Prometheus官方人員的一份PPT摘取,原文件在此:https://files.cnblogs.com/files/vovlie/copyofprometheusstorage1-160127133731.pdf


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM