剖析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(採樣值)。code

而對於時間序列的基本特性來講,一般是過去的數據通常是隻讀的,是不會變動的,當前時間的數據纔會可能在寫,模式以下圖:blog

根據上面的分析,時間序列的存儲彷佛能夠設計成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

相關文章
相關標籤/搜索