Prometheus 学习之——本地存储 TSDB

article/2025/9/2 20:44:57

Prometheus 学习之——本地存储 TSDB

文章目录

  • Prometheus 学习之——本地存储 TSDB
  • 前言
  • 一、TSDB 核心概念
  • 二、详细介绍
    • 1.block
      • 1)chunks
      • 2)index
      • 3)tombstone
      • 4)meta.json
    • 2.WAL
  • 总结


前言

Prometheus 是 CNCF 收录的第二个项目,已经成为了云原生时代监控的标准。

本文介绍了 Prometheus 本地存储的 V3 版本。该版本主要由 Fabian 主导开发,将监控数据以时间段拆分成不同的 block,并且会压缩、合并历史数据块;还引入了 WAL,避免因为 Prometheus 重启或者宕机导致数据丢失等问题;并且,数据存储可接近每秒 10 000 000 个样本,与 V2 版本相比,对 CPU 的使用率降低 3 倍,磁盘 I/O 降低 10 倍。


一、TSDB 核心概念

Prometheus 的本地存储被称为 Prometheus TSDB。TSDB 的设计有两个核心:block 和 WAL,而 block 又包含 chunk、index、meta.json、tombstones。

二、详细介绍

1.block

    TSDB 将存储的监控数据按照时间分隔成 block,block 的大小并不固定,按照设定的步长倍数递增。默认最小的 block 保存 2h 监控数据。如果步数为 3、步长为 3,则 block 的大小依次为:2h、6h、18h。随着数据量的不断增长,TSDB 会将小的 block 合并成大的 block,例如将 3 个 2h 的 block 合并成一个 6h 的 block,这样不仅可以减少数据存储,还可以减少内存中的 block 个数,便于对数据进行检索。

    每个 block 都有全局唯一的名称,通过 ULID(Universally Unique Lexicographically Sortable Identifier,全局字典可排序 ID)原理生成,可以通过 block 的文件名确定这个 block 的创建时间,从而很方便地按照时间对 block 排序。对时序数据库的查询通常都会涉及连续的很多块,这种通过命名便可以排序的设计非常简便。

     block 包含 4 个主要部分:chunks、index、meta.json、tombstones,如下图:
在这里插入图片描述
进入本地安装好的 Prometheus 里看一下,确实如此:
在这里插入图片描述

1)chunks

    chunks 用于保存压缩后的时序数据。每个 chunk 的大小为 512MB,如果超过,则会别截断成多个 chunk 保存,且以数字编号命名。

2)index

    index 是为了对监控数据进行快速检索和查询而设计的,主要用来记录 chunk 中时序的偏移位置。index 的数据格式如下:

  1. TOC 表。TOC 表是 index 的入口,记录 index 文件中其他表的位置。在写入其他表的数据之前都会先将当前的偏移量(8 字节)作为该表的地址记录,在读取 index 时首先读取的是 TOC 表。
  2. 符号表(Symbol Table)。TSDB 对磁盘的利用发挥到了极致,为了避免标签重复存储,对每个标签只存储一次,在使用该标签时直接使用符号表中的索引。
  3. 时序列表(Series)。记录该 block 中每个时序的标签及这些时序在该 block 中关联的 chunk 块。
  4. 标签索引表(Label Index Table)。将具有相同标签名称(key)的标签组合到一起,从而形成标签索引(Label Index),然后通过标签索引表去查找这些索引。
  5. Postings 表。每个 Posting 都代表一个标签和时序的关联关系,Postings 表则是 Posting 的索引表。

举个例子:
假如要查找某个时间段内某种指标的监控数据,TSDB 就会首先根据该时间段找到所有的 block,并加载每个 block 的 index 文件,之后要先读取 index 的 TOC 表才能找到其他表。对 TOC 表的读取很简单,直接读取 index 文件的最后 52 字节(6 张表 * 每张表 8 字节偏移量 + 4 字节的 CRC 校验和)即可。之后找到符号表,就可以确定这个指标标签的名称和值在符号表中的索引 ID,后续的查找都是基于这个 ID 的查找。

3)tombstone

    tombstone 用于对数据进行软删除。TSDB 在删除 block 数据块时会将整个目录删除,但如果只删除一部分数据块的内容,则可以通过 tombstone 进行软删除。

4)meta.json

    meta.json 记录 block 的元数据信息,主要包括一个数据块记录样本的起始时间(minTime)、截止时间(maxTime)、样本数、时序数和数据源等信息,这些元数据信息在后期对 block 进行维护(删除过期 block、合并历史 block 等)时会用到。
    一个 meta 文件的样例:

{"ulid": "01FCFPJNJARNTQZVATVBWA7BAT", //所属 block 的 ulid"minTime": 1628229600000, //block 的最小时间"maxTime": 1628280000000, //block 的最大时间"stats": {"numSamples": 4416675, //样本数"numSeries": 1838, //时序个数"numChunks": 40430 //chunk 个数},"compaction": {"level": 3, //压缩级别"sources": ["01FCDB1QZABY4DXFARW9AWCM93", //block ulid"01FCDHXF7A9EX4GFA2E7YHDSGN","01FCDRZAJ636968YMBYYPM4W0R","01FCDZMWRAYN9TFWE2730SJATG","01FCE6ZKCH25K7VX3J548GXANE","01FCEE8QMHPGGBZWQGCMHMAAZD","01FCF5DACZQSQHN0RJWR4N2VJH"],"parents": [{"ulid": "01FCDZMXC4DGMZPCGNHVQWPYWQ","minTime": 1628229600000,"maxTime": 1628251200000},{"ulid": "01FCF5DCCYTAAYE3AY389TJKV2","minTime": 1628251200000,"maxTime": 1628272800000},{"ulid": "01FCF5DACZQSQHN0RJWR4N2VJH","minTime": 1628272800000,"maxTime": 1628280000000}]},"version": 1
}

上面的 compaction 记录这个块被压缩的次数。之前介绍 block 大小时提到:小块会被 TSDB 压缩成大块,每压缩一次,level 值就会加一,并且 source 部分会记录这个大块是由哪些小块压缩而成的。

    这些 block 按照时间顺序被分割成一个个 block,其中,第 1 个 block 被称为 head block(头块),它被存储在内存中并且允许修改,而后面的 block 以只读方式存储在硬盘中。整体布局如下:
在这里插入图片描述
    head block 和后面的 block 都被设定为保存 2h 数据,当 head block 超过 1.5 倍大小(3h)的时候,它将被重新划分成 2h 和 1h 两部分,前面一部分将会变成只读块并被保存到硬盘中。

2.WAL

    WAL(Write-Ahead Logging,预写日志)是关系型数据库中利用日志来实现事务性和持久性的一种技术,即在进行某个操作之前先将这件事情记录下来,以便之后对数据进行回滚、重试等操作并保证数据的可靠性。

     Prometheus 为了防止丢失暂存在内存中的还未被写入磁盘的监控数据,引入了 WAL 机制。WAL 被分割成默认大小为 128MB 的文件段(Segment),文件段以数字命名,例如 00000000、00000001、00000002 等,以此类推。WAL 的写入单位是页(page),每页的大小为 32KB,所以每个段文件的大小必须是页的大小的整数倍。每个文件段都有一个"已使用的页"属性来标识在该段中已分配的页数目,如果 WAL 一次性写入的页数超过一个段的空闲页数,就会创建一个新的文件段来保存这些页,从而确保一次性写入的页不会跨段存储。

    按照每种对象设定的采集周期,Prometheus 会将周期性采集的监控数据通过 Add 接口添加到 head block 中,但这些数据没有被持久化,TSDB 通过 WAL 将提交的数据先保存到磁盘中,在 TSDB 宕机重启后,会首先启动多协程读取 WAL,从而恢复之前的状态。


总结


http://chatgpt.dhexx.cn/article/KyqFBply.shtml

相关文章

阿里云IoT物模型上报数据流转到实例内TSDB

阿里云物联网平台上存储的数据最多为30天,为了能让数据永久保存下来,就需要把物联网平台的数据流转到其他的数据库,对于企业版实例,内部有一个实例内的时空数据库TSDB,正好可以利用。下边就介绍一下物联网平台的物模型…

使用TSDB自动检测时序数据的异常情况

本期Jesse就带大家来继续了解一下TSDB的应用问题,小伙伴们,让我们直接步入正题吧。 本文仅代表个人观点,如有偏颇之处,还请海涵~ 现今,每天都有数千亿个传感器产生大量时序数据。公司收集大量数据使得分析…

TSDB 存储引擎介绍

本文介绍 DolphinDB 在2.0版本中新推出的存储引擎 TSDB。 1. OLAP 与 TSDB 适用的场景 OLAP 是 DolphinDB 在2.0版本之前的唯一存储引擎。数据表中每个分区的每一列存为一个文件。数据在表中的存储顺序与数据写入的顺序一致,数据写入有非常高的效率。 OLAP 引擎的…

TSDB与Blockchain

各位小伙伴们我们又见面了,伴随着区块链技术的推广,很多企业也在思考是否将其应用。其实TSDB与区块链有很多共通之处,本期Jesse就来和大家聊聊TSDB与区块链。本文参考了Nicolas Hourcard的文章“You Don’t Need a Blockchain, You Need a Ti…

FlashDB嵌入式数据库之TSDB数据存储解析

一、驱动层:SFUD(Serial Flash Universal Driver) 是一款开源的串行 SPI Flash 通用驱动库 二、中间层:FAL(FLASH ABSTRACTION LAYER))FLASH 抽象层 三、应用层:FlashDB(FlashDB 是一…

时间序列数据库 (TSDB)

参考文档:时间序列数据库 TSDB_时间序列数据库 TSDB-阿里云帮助中心 什么是时序数据库 时序数据是随时间不断产生的一系列数据,简单来说,就是带时间戳的数据。数据可能来自服务器和应用程序的指标、物联网传感器的读数、网站或应用程序上的…

TSDB在高速公路大数据平台的应用

好久没有跟大家聊TSDB的应用场景了,Jesse也在国庆期间进行了补课,今天就跟大家聊聊TSDB在高速公路大数据平台的应用。本文借鉴了郝建明、袁逸涛发表在《上海船舶运输科学研究生学报》的《基于时序数据库的高速公路数据集成平台》一文,感谢二位…

时序数据库(TSDB)

时序数据库(TSDB)是一种特定类型的数据库,主要用来存储时序数据。随着5G技术的不断成熟,物联网技术将会使得万物互联。物联网时代之前只有手机、电脑可以联网,以后所有设备都会联网,这些设备每时每刻都会吐…

TSDB数据库

目录 为什么需要时序数据库: 时间序列数据库的特点: 常见的时间序列数据库: 时间序列数据库存储: 时间序列数据库问题: 参考资料: 内容是在我球的docs上直接复制过来的,懒得写两份&#x…

关于时许数据库的相关名词解释

1 时序数据库TSDB 英文全称为 Time Series Database,提供高效存取时序数据和统计分析功能的数据管理系统。 2 时序数据(Time Series Data) 基于稳定频率持续产生的一系列指标监测数据。例如,监测某城市的空气质量时&#xff0c…

物联网平台搭建的全过程介绍(六)——物联网TSDB之基本知识及读写代码介绍

目录 一、TSDB基本知识 二、物联网平台数据流通架构 三、TSDB数据结构 1、TSDB数据包的组成 2、TSDB的另外两个相关概念 四、阿里云物联网平台实例内TSDB功能介绍 1、数据写入 (1)需要添加的依赖 (2)写入数据代码 2、数据…

ES6—简介

目录 一、概述 二、扩展:Babel转码器 三、拓展:编译打包 一、概述 概念 ES6全称ECMAScript 6.0,是Javascript语言的下一代标准,2015年6月正式发布。 注意,ES6既是一个历史名词,也是一个泛指,…

深入浅出ES6(一):ES6是什么

深入浅出ES6(一):ES6是什么 作者 Jason Orendorff ,译者 刘振涛 发布于 2015年6月5日 | http://www.infoq.com/cn/articles/es6-in-depth-an-introduction 我的阅读清单 编者按:ECMAScript 6离我们越来越近了&#…

[ 前端开发 ] 为什么要学习ES6?

ECMAScript 6 概念 ECMAScript 6 简称 ES6 为什么要学习ES6? ES6 是 JavaScript 的下一个版本标准,诞生于2015年6月份。ES6 的主要目的是为了解决 ES5 的先天不足。ES6 的终极目标是为了使 JavaScript 语言可以用来编写复杂的大型应用程序,成为企业…

前端基础之ES6

ES6 ES6简介 ES6实际上是一个泛指,泛指ES2015及后续版本 为什么使用ES6? 每一次标准的诞生都意味着语言的完善,功能的加强。JavaScript语言本身也有一些令人不满意的地方。 变量提升特性增加了程序运行时的不可预测性语法过于松散&#x…

第一节:ES是什么?ES6是什么?

系列文章目录 第一节:ES是什么?ES6是什么? 文章目录 系列文章目录前言一、ES是什么?二、ES6是什么? 前言 学习一下ES,都是自己学习的总结和理解,大家有什么问题都可以提出,一起讨论…

1.什么是ES6,为什么使用它

1.什么是ES6? ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了。Mozilla公司将在这个标准的基础上,推出JavaScript 2.0。ES6主要是为了解决ES5的先天不足,比如JavaScri…

ES6是什么

ES6是什么 ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在 2015 年 6 月正式发布了。 它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应用程序,成为企业级开发语言。 现在大部分的编…

ES6是什么?通俗理解

1.了解一门语言,首先要搞明白它到底是什么? ECMA (Eurupean Compuler Manuluclurers Assuxiation)中文名为欧洲计算机制造商协会,这个组织的日常是评估、开发和认可电信和计算机标准。19919 年后该组织改名为ECMA国际。 ES6是门脚本语言&…

list集合转换成string字符串

集合转换成字符串 闲来无事&#xff0c;总结了几种list转换成string的方法 第一种 <jdk8新特性&#xff0c;string集合、integer集合均可随意转换成string> 个人觉得这个方法应该属于jdk8的新特性 ArrayList<String> arrayList new ArrayList<String>(){{…