1、本地存儲
磁盤布局:
這些目錄叫做2小時塊。
每個目錄包含一個chunks子目錄(包含那個時間窗口里的所有時間序列)、元數據文件meta.json、索引文件index。
索引文件將度量名稱和標簽索引到chunks目錄中的時間序列上。
chunks目錄中的樣例被分組到一個或多個段文件中,每個段文件默認最大上限是512M。
段文件的格式如圖所示。000001
當通過API刪除序列時,不會立即刪除塊段(chunk segment)中的數據,而是會將這一次刪除動作保存在墓碑(tombstone)文件中。
用於incoming samples的當前塊是保存在內存中的,並沒有完全持久化。
如果prometheus服務器掛了,那豈不是少了數據?
不會的,因為prometheus有一個預寫日志(WAL),每一次動作都會記錄到預寫日志中。
當prometheus重啟時,就會重放這些日志,因此就能恢復數據。
預寫日志文件被保存在wal目錄中,以128MB的段形式存在。
這些預寫日志文件包含尚未壓縮的原始數據,因此它們比常規的塊文件大得多。
prometheus至少保留3個預寫日志文件(如上圖)。
高流量的服務器可能會保留多於3個的預寫日志文件,以至少保留2個小時的原始數據。
請注意,本地存儲的一個限制是:它不是群集或復制的。
因此,它在驅動器或節點中斷時不具有任意的可擴展性或持久性,應該像任何其他單節點數據庫一樣進行管理。
建議使用RAID以提高存儲可用性,建議使用快照進行備份。通過適當的體系結構,可以在本地存儲中保留數年的數據。
可以通過遠程讀寫API來使用外部存儲。
2、壓縮
2小時塊 最終 在后台會被壓縮成更長的塊。
prometheus通過以下選項來配置本地存儲。
--storage.tsdb.path:數據存儲位置,默認是data目錄。
--storage.tsdb.retention.time:保留時間,默認是15天,過15天之后,就刪除。該配置會覆蓋--storage.tsdb.retention的值。
--storage.tsdb.retention.size:要保留的塊的最大字節數。最早的數據會首先被刪除。默認為0或禁用。
磁盤的最小尺寸取決於:wal目錄(wal和checkpoint)和chunks_head目錄(m-mapped head chunks)的峰值空間(每2小時會達到一次峰值)。
--storage.tsdb.wal-compression:開啟預寫日志的壓縮。
needed_disk_space = retention_time_seconds * ingested_samples_per_second * bytes_per_sample
3、遠程存儲
prometheus的本地存儲受限於單節點的擴展性和耐久性。
prometheus集成遠程存儲的三種方式:
(1)prometheus會將它接收的樣本數據以標准格式寫入遠程的URL。
(2)prometheus能從其他prometheus服務器以標准格式接收樣本數據。
(3)prometheus以標准格式從遠程URL讀取樣本數據。
https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_write
https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_read
內置的遠程寫入接收器,通過以下選項開啟:--enable-feature=remote-write-receiver
開啟后,遠程寫入接收器的端點是:/api/v1/write
https://github.com/prometheus/prometheus/blob/main/prompb/remote.proto
更多集成:
https://prometheus.io/docs/operating/integrations/#remote-endpoints-and-storage
將openmetrics format格式的數據寫入到TSDB中。以blocks的形式存放。
典型的用例是將度量數據從不同的監控系統或時間序列數據庫遷移到Prometheus。
遷移的前提是:需要首先將這些數據轉換成openmetrics format,然后才能遷移。
回填
通過promtool命令行工具完成回填。
promtool會將塊寫入到目錄中。默認情況下,是寫入到 ./data/ 目錄。
promtool tsdb create-blocks-from openmetrics <input file> [<output directory>]
當創建完 塊 之后,再將這些塊移動到prometheus的數據目錄中。
如果prometheus的數據目錄中已經有這些塊了,那就會發生重疊。因此需要設置
--storage.tsdb.allow-overlapping-blocks
以允許重疊。
請注意,任何回填的數據都要遵守為Prometheus服務器配置的保留(時間層面或大小層面的保留)。
--storage.tsdb.retention.size