深入解讀Prometheus 2.33 Series Chunks壓縮特性:原理與實踐

封面

深入解讀Prometheus 2.33 Series Chunks壓縮特性:原理與實踐

隨著監控指標規模不斷增長,Prometheus的本地TSDB存儲壓力日益增大。為提升存儲效率,Prometheus 2.33引入了Series Chunks壓縮特性,對時間序列數據在寫入和存儲時進行深度優化。本文將從原理、源碼和實踐示例三方面進行深度解析,幫助后端開發和運維同學在生產環境中高效使用該特性。

一、技術背景與應用場景

  1. 存儲挑戰:

    • 隨著服務規模擴大,指標量呈指數增長。常規的Chunk存儲在長時序上產生大量冗余數據。
    • 磁盤I/O和存儲成本飆升,迫切需要更高效的壓縮方案。
  2. Prometheus 2.33新特性:

    • 引入Series Chunks壓縮模式,對Block內多條序列進行協同編碼。
    • 基于增量編碼、RLE及LZ4混合壓縮算法,大幅提升壓縮比。
  3. 適用場景:

    • 大規模監控集群的長期存儲。
    • 磁盤或網絡存儲帶寬瓶頸明顯的環境。
    • 需要在邊緣節點進行預壓縮后遠程存儲的場景。

二、核心原理深入分析

Prometheus底層TSDB將數據切分成多個Block(默認2小時),每個Block包含多個Series和對應的Chunk。傳統模式下,每條Series單獨進行XOR+Varint編碼。而Series Chunks壓縮則是在Block維度對相鄰Series的Chunk Header和Data進行協同處理:

  1. 合并Chunk Header:

    • 在Block索引階段,收集所有Series的Chunk meta,并按時間排序。
    • 使用Delta-of-Delta編碼方式,存儲Chunk起止時刻和長度差值,實現Header壓縮。
  2. 數據區協同編碼:

    • 利用RLE(Run-Length Encoding)識別多個Series同時出現相同時間戳的場景。
    • 對值進行差分編碼后,統一使用LZ4進行批量壓縮。
  3. 混合壓縮策略:

    • 小Chunk(<4KB)優先使用XOR+Varint單序列渠道,減少解壓開銷。
    • 大Chunk批量調用Series Chunks壓縮算法,獲取更高壓縮比。

三、關鍵源碼解讀

以下示例基于Prometheus 2.33源碼,重點關注storage/tsdb/db.go中Chunk寫入流程:

// db.go(部分摘錄)
func (b *BlockWriter) writeSeriesChunks() error {// 收集所有Series的ChunkMetametas := b.collectMeta()// 1. 壓縮HeadercompressedHdr, err := encodeChunkHeaders(metas)if err != nil {return err}// 寫入Header區if _, err = b.hdrWriter.Write(compressedHdr); err != nil {return err}// 2. 壓縮數據區for _, meta := range metas {data := meta.Chunk.Bytes()var buf []byteif len(data) >= minBatchSize {buf = compressSeriesBatch(data, metas)} else {buf = singleSeriesCompress(data)}if _, err = b.dataWriter.Write(buf); err != nil {return err}}return nil
}
  • encodeChunkHeaders:使用Delta-of-Delta編碼存儲多個Chunk的時間戳差值。
  • compressSeriesBatch:將多條Series數據合并后用LZ4批量壓縮。
  • singleSeriesCompress:保留舊版XOR+Varint實現,以兼顧低延遲寫入。

四、實際應用示例

4.1 啟用配置

在啟動Prometheus時添加以下參數,即可啟用Series Chunks壓縮(2.33默認開啟,但可按需調整閾值):

# prometheus.yml
global:scrape_interval: 15s# 啟動參數
--storage.tsdb.min-chunk-duration=10m       # 最小Chunk持續時長
--storage.tsdb.max-block-duration=4h        # 最大Block時長
--storage.tsdb.series-chunks-batch-size=8KB # 批量壓縮閾值
--storage.tsdb.series-chunks-enabled=true   # 開關

4.2 讀取Chunk示例(Go)

使用Prometheus TSDB庫讀取已壓縮Chunk,示例代碼:

import ("fmt""github.com/prometheus/prometheus/tsdb""github.com/prometheus/prometheus/tsdb/chunkenc"
)func readBlock(path string) error {block, err := tsdb.OpenBlock(nil, path)if err != nil {return err}idxr, _ := block.Index()querier, _ := block.Chunks()defer querier.Close()it := idxr.Postings("__name__", "up")for it.Next() {seriesChunks := querier.Series(it.At())for seriesChunks.Next() {chunk := seriesChunks.Chunk()decoder := chunkenc.NewReader(chunk, 0)for decoder.Next() {ts, v := decoder.At()fmt.Printf("%d => %f\n", ts, v)}}}return nil
}

該示例演示了對壓縮后Chunk的解碼操作,無感知底層編碼變化。

4.3 壓縮效果評估

使用promtool tsdb analyze對比啟用前后磁盤占用:

# 未開啟Series Chunks
promtool tsdb analyze /data/prometheus-2.32/  
# 磁盤: 120GB# 開啟Series Chunks
promtool tsdb analyze /data/prometheus-2.33/  
# 磁盤: 88GB (約27%壓縮率提升)

五、性能特點與優化建議

  1. 壓縮與并發:

    • 批量壓縮帶來更高壓縮比,但會占用更多CPU,推薦在多核機器上開啟。
    • 對于延遲敏感場景,可通過series-chunks-batch-size調小閾值,平衡延遲和壓縮率。
  2. Block與Chunk參數:

    • 較小的Block時長可減小單次壓縮范圍,降低延遲,但會增加Index和Head內存占用。
    • 調整min-chunk-duration可對高頻寫入Series進行細粒度拆分,提升實時性。
  3. 磁盤與網絡存儲:

    • 壓縮后的Block文件更適合遠程對象存儲(如S3/GCS),可節省帶寬。
    • 配合遠程讀取(Remote Read)可在邊緣節點預壓縮,中心節點按需解壓,提高整體吞吐。

本文結合Prometheus 2.33源代碼和生產實踐,詳細解析了Series Chunks壓縮特性原理與應用,希望能為監控存儲優化提供借鑒。歡迎在評論區交流更多使用經驗。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/92956.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/92956.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/92956.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SpringBoot整合Liquibase提升數據庫變更的可控性、安全性、自動化程度(最詳細)

為什么要使用liquibase?- 團隊協作與版本管理- 當多人&#xff08;或多個小組&#xff09;并行開發、對同一數據庫結構進行變更時&#xff0c;如果僅靠手寫 SQL 腳本&#xff0c;很 容易產生沖突或漏掉某些變更。- Liquibase 將所有 DDL/DML 操作以“changeset”形式納入源碼管…

數據寫入因為漢字引發的異常

spark 數據寫hive表,發生 查詢分區異常問題 異常: 25107124 19 26.49 ERROR Hive: MelaException(message.Exception thrown when execuling quey. S ELECT DISTINCT ‘org apache.hadop.hive melastore .modelMpartion As"NUCLEUS TYPE,AONCREATE TIME,AO.LAST ACCE…

Springboot項目實現將文件上傳到阿里云

Springboot項目實現將文件上傳到阿里云 一、概述二、具體步驟 2.1引入阿里云工具 首先先建utils包&#xff0c;然后引入AliOSSUtils類&#xff0c;如下&#xff1a; package com.hechixueyuan.forestfiredetectionsystem.utils;import com.aliyun.oss.OSS; import com.aliyun.o…

如何理解 TCP 是字節流協議?詳解

文章目錄一、面向字節流二、粘包問題應用層如何解決粘包問題&#xff1f;一、面向字節流 使用 TCP socket 進行網絡編程&#xff0c;Linux 內核會給每個 socket 都分配一個發送緩沖區和一個接收緩沖區 由于緩沖區的存在, TCP 讀寫不需要一一匹配&#xff0c;例如&#xff1a;…

面試問題總結——關于OpenCV(二)

最近小組在面試視覺算法工程師,順便整理了一波關于OpenCV的面試題目。 有些知識點也不深入,對于寫的不對的地方,歡迎指正。 目錄 20.像素梯度如何計算? 21.關于開運算和閉運算的理解 22.開運算和閉運算有什么優缺點? 23.圖像插值有哪些? 24.圖像金字塔的原理 25.邊緣檢測…

目標導向的強化學習:問題定義與 HER 算法詳解—強化學習(19)

目錄 1、目標導向的強化學習&#xff1a;問題定義 1.1、 核心要素與符號定義 1.2、 核心問題&#xff1a;稀疏獎勵困境 1.3、 學習目標 2、HER&#xff08;Hindsight Experience Replay&#xff09;算法 2.1、 HER 的核心邏輯 2.2、 算法步驟&#xff08;結合 DDPG 舉例…

2025 XYD Summer Camp 7.21 智靈班分班考 · Day1

智靈班分班考 Day1 時間線 8:00 在濱蘭實驗的遠古機房中的一個鍵盤手感爆炸的電腦上開考。開 T1&#xff0c;推了推發現可以 segment tree 優化 dp&#xff0c;由于按空格需要很大的力氣導致馬蜂被迫改變。后來忍不住了頂著疼痛按空格。8:30 過了樣例&#xff0c;但是沒有大樣…

基于多種主題分析、關鍵詞提取算法的設計與實現【TF-IDF算法、LDA、NMF分解、BERT主題模型】

文章目錄有需要本項目的代碼或文檔以及全部資源&#xff0c;或者部署調試可以私信博主一、項目背景二、研究目標與意義三、數據獲取與處理四、文本分析與主題建模方法1. 傳統方法探索2. 主題模型比較與優化3. 深度語義建模與聚類五、研究成果與應用價值六、總結與展望總結每文一…

MDC(Mapped Diagnostic Context) 的核心介紹與使用教程

關于日志框架中 MDC&#xff08;Mapped Diagnostic Context&#xff09; 的核心介紹與使用教程&#xff0c;結合其在分布式系統中的實際應用場景&#xff0c;分模塊說明&#xff1a; 一、MDC 簡介 MDC&#xff08;映射診斷上下文&#xff09; 是 SLF4J/Logback 提供的一種線程…

Linux隨記(二十一)

一、highgo切換leader&#xff0c;follow - 隨記 【待寫】二、highgo的etcd未授權訪問 - 隨記 【待寫】三、highgo的etcd未授權訪問 - 隨記 【待寫】3.2、etcd的metric未授權訪問 - 隨記 【待寫】四、安裝Elasticsearch 7.17.29 和 Elasticsearch 未授權訪問【原理掃描】…

Java環境配置之各類組件下載安裝教程整理(jdk、idea、git、maven、mysql、redis)

Java環境配置之各類組件下載安裝教程整理&#xff08;jdk、idea、git、maven、mysql、redis&#xff09;1.[安裝配置jdk8]2.[安裝配置idea]3.[安裝配置git]4.[安裝配置maven]5.[安裝配置postman]6.[安裝配置redis和可視化工具]7.[安裝配置mysql和可視化工具]8.[安裝配置docker]…

配置https ssl證書生成

1.可用openssl生成私鑰和自簽名證書 安裝opensslsudo yum install openssl -y 2.生成ssl證書 365天期限sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \-keyout /etc/ssl/private/nginx-selfsigned.key \-out /etc/ssl/certs/nginx-selfsigned.crt3、按照提示編…

編程語言Java——核心技術篇(四)集合類詳解

言不信者行不果&#xff0c;行不敏者言多滯. 目錄 4. 集合類 4.1 集合類概述 4.1.1 集合框架遵循原則 4.1.2 集合框架體系 4.2 核心接口和實現類解析 4.2.1 Collection 接口體系 4.2.1.1 Collection 接口核心定義 4.2.1.2 List接口詳解 4.2.1.3 Set 接口詳解 4.2.1.4…

GaussDB 數據庫架構師(八) 等待事件(1)-概述

1、等待事件概述 等待事件&#xff1a;指當數據庫會話(session)因資源競爭或依賴無法繼續執行時&#xff0c;進入"等待"狀態&#xff0c;此時產生的性能事件即等待事件。 2、等待事件本質 性能瓶頸的信號燈&#xff0c;反映CPU,I/O、鎖、網絡等關鍵資源的阻塞情況。…

五分鐘系列-文本搜索工具grep

目錄 1??核心功能?? ??2??基本語法?? 3????常用選項 & 功能詳解?? ??4??經典應用場景 & 示例?? 5????重要的提示 & 技巧?? ??6??總結?? grep 是 Linux/Unix 系統中功能強大的??文本搜索工具??&#xff0c;其名稱源自 …

Java面試題及詳細答案120道之(041-060)

《前后端面試題》專欄集合了前后端各個知識模塊的面試題&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…

【嘗試】本地部署openai-whisper,通過 http請求識別

安裝whisper的教程&#xff0c;已在 https://blog.csdn.net/qq_23938507/article/details/149394418 和 https://blog.csdn.net/qq_23938507/article/details/149326290 中說明。 1、創建whisperDemo1.py from fastapi import FastAPI, UploadFile, File import whisper i…

Visual Studio 的常用快捷鍵

Visual Studio 作為主流的開發工具&#xff0c;提供了大量快捷鍵提升編碼效率。以下按功能分類整理常用快捷鍵&#xff0c;涵蓋基礎操作、代碼編輯、調試等場景&#xff08;以 Visual Studio 2022 為例&#xff0c;部分快捷鍵可在「工具 > 選項 > 環境 > 鍵盤」中自定…

Triton Server部署Embedding模型

在32核CPU、無GPU的服務器上&#xff0c;使用Python后端和ONNX后端部署嵌入模型&#xff0c;并實現并行調用和性能優化策略。方案一&#xff1a;使用Python后端部署Embedding模型 Python后端提供了極大的靈活性&#xff0c;可以直接在Triton中運行您熟悉的sentence-transformer…

Java動態調試技術原理

本文轉載自 美團技術團隊胡健的Java 動態調試技術原理及實踐, 通過學習java agent方式進行動態調試了解目前很多大廠開源的一些基于此的調試工具。 簡介 斷點調試是我們最常使用的調試手段&#xff0c;它可以獲取到方法執行過程中的變量信息&#xff0c;并可以觀察到方法的執…