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 。