深入解读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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;并可以观察到方法的执…