• 一、整体介绍
  • 二、block
    • 2.1 head block
  • 三、WAL(Write-ahead logging, 预写日志)
    • 3.1 数据流向
  • 四、和存储相关的启动参数
  • 五、总结

一、整体介绍

Prometheus 2.x 采用自定义的存储格式将样本数据保存在本地磁盘当中。如下所示,按照两个小时(最少时间)为一个时间窗口,将两小时内产生的数据存储在一个块(Block)中,每一个块中包含该时间窗口内的所有样本数据(chunks),元数据文件(meta.json)以及索引文件(index)。

[mingming.chen@m162p65 data]$ tree
.
├── 01E2MA5GDWMP69GVBVY1W5AF1X
│ ├── chunks # 保存压缩后的时序数据,每个chunks大小为512M,超过会生成新的chunks
│ │ └── 000001
│ ├── index # chunks中的偏移位置
│ ├── meta.json # 记录block块元信息,比如 样本的起始时间、chunks数量和数据量大小等
│ └── tombstones # 通过API方式对数据进行软删除,将删除记录存储在此处(API的删除方式,并不是立即将数据从chunks文件中移除)
├── 01E2MH175FV0JFB7EGCRZCX8NF
│ ├── chunks
│ │ └── 000001
│ ├── index
│ ├── meta.json
│ └── tombstones
├── 01E2MQWYDFQAXXPB3M1HK6T20A
│ ├── chunks
│ │ └── 000001
│ ├── index
│ ├── meta.json
│ └── tombstones
├── lock
├── queries.active
└── wal #防止数据丢失(数据收集上来暂时是存放在内存中,wal记录了这些信息)
├── 00000366 #每个数据段最大为128M,存储默认存储两个小时的数据量。
├── 00000367
├── 00000368
├── 00000369
└── checkpoint.000365
└── 00000000

二、block

TSDB将存储的监控数据按照时间分成多个block存储,默认最小的block保存时间为2h,后台程序还会将小块合并成大块,减少内存中block的数量,便于索引查找数据,可以通过meta.json查看,可以看到01E2MA5GDWMP69GVBVY1W5AF1X被压缩1次,source有3个block,那么2*3=6小时的数据量。

关于block压缩:

  1. 最初的两个小时的块最终会在后台压缩为更长时间的块;
  2. 压缩的最大时间块为数据保留时间的10%或者31天,取两者的较小者。

2.1 head block

1.head block中的数据是被存储在内存中的并且可以被任意修改;
2.head block和后续的block初始设定保存2h数据,当head block超过3h时,会被拆分为2h+1h,2h block会变成只读块写入磁盘.(通过观察服务器上prometheus存储目录,每次压缩合并小块时间都比块内部时间多三个小时,为head block),如下所示:

三、WAL(Write-ahead logging, 预写日志)

Prometheus为了防止丢失暂存在内存中的还未被写入磁盘的监控数据,引入了WAL机制。WAL被分割成默认大小为128M的文件段(segment),之前版本默认大小是256M,文件段以数字命名,长度为8位的整形。WAL的写入单位是页(page),每页的大小为32KB,所以每个段大小必须是页的大小的整数倍。如果WAL一次性写入的页数超过一个段的空闲页数,就会创建一个新的文件段来保存这些页,从而确保一次性写入的页不会跨段存储。

3.1 数据流向

prometheus将周期性采集到的数据通过Add接口添加到head block,但是这些数据暂时没有持久化,TSDB通过WAL将数据保存到磁盘上(保存的数据没有压缩,占用内存较大),当出现宕机,启动多协程读取WAL,恢复数据。

四、和存储相关的启动参数

--storage.tsdb.path: This determines where Prometheus writes its database. Defaults to data/.
--storage.tsdb.retention.time: This determines when to remove old data. Defaults to 15d. Overrides storage.tsdb.retention if this flag is set to anything other than default.
--storage.tsdb.retention.size: [EXPERIMENTAL] This determines the maximum number of bytes that storage blocks can use (note that this does not include the WAL size, which can be substantial). The oldest data will be removed first. Defaults to 0 or disabled. This flag is experimental and can be changed in future releases. Units supported: KB, MB, GB, PB. Ex: "512MB"
--storage.tsdb.retention: This flag has been deprecated in favour of storage.tsdb.retention.time.
--storage.tsdb.wal-compression: This flag enables compression of the write-ahead log (WAL). Depending on your data, you can expect the WAL size to be halved with little extra cpu load. Note that if you enable this flag and subsequently downgrade Prometheus to a version below 2.11.0 you will need to delete your WAL as it will be unreadable.

PS: 以上有两个参数storage.tsdb.retention.size和storage.tsdb.retention.time,两个同时设置时,两者无优先级,谁先触发就执行删除操作。(其它启动参数参考promethes#promethes 第五章节启动参数部分)

五、总结

需要解决的几个问题:

1.远程存储节点长时间挂掉(默认blocK大小为2小时,实际大于六小时,prometheus2.15经测试验证非官方文档说的两个小时),刷盘到prometheus的数据库中的数据还能不能同步到远程?

2.WAL的缓存数据的时间可不可以调整?

解答:

1.根据以上内容和3.远程写参数优化可知,prometheus本地存储和远程存储并无影响。因为远程存储是通过将WAL中的数据缓存到多个内存队列(shards)中,然后写到远程存储设备,其直接与WAL打交道。而prometheus只是用WAL来防止数据丢失,其存储的一系列动作都与WAL没关系。所以当内存中缓存的数据达到刷盘的阈值,WAL中没有写到远程存储的数据就会丢失,当重新启动远程存储服务,原来那部分没有写入远程存储服务的数据已经丢失,只能从最新的数据开始写入远程存储,这部分可参考3.远程写参数优化2.2部分结论。

2. 可以调整,准确来说是间接调整。wal保留数据的长短与prometheus最小压缩block大小有关系,由于wal中至少保留当前时间正在写入的文件之外的三个文件(每个文件保存一个block大小的数据量),所以当增大block大小的时候就会相应的增大wal保存的数据量,但是,block的大小调整会直接影响内存的使用,需要根据现有的环境进行相应的调优。

如下图所示,当我设置--storage.tsdb.min-block-duration=4h(prometheus的启动参数)时,wal中当前保留的文件(存在的数据时间范围:2020.03.20 20:00:00–2020.03.21 13.52),其中每个文件保留4个小时的数据量。

4.Prometheus之存储及WAL的更多相关文章

  1. Prometheus TSDB存储原理

    Prometheus 包含一个存储在本地磁盘的时间序列数据库,同时也支持与远程存储系统集成,比如grafana cloud 提供的免费云存储API,只需将remote_write接口信息填写在Prom ...

  2. Prometheus学习系列(九)之Prometheus 存储

    前言 本文来自Prometheus官网手册 和 Prometheus简介 存储 Prometheus是一个本地磁盘时间序列数据库,但也可选择与远程存储系统集成,其本地时间序列数据库以自定义格式在磁盘上 ...

  3. Prometheus存储模型分析

    Prometheus是时下最为流行的开源监控解决方案,我们可以很轻松地以Prometheus为核心快速构建一套包含监控指标的抓取,存储,查询以及告警的完整监控系统.单个的Prometheus实例就能实 ...

  4. Prometheus存储原理及数据备份还原

    prometheus将采集到的样本以时间序列的方式保存在内存(TSDB 时序数据库)中,并定时保存到硬盘中.与zabbix不同,zabbix会保存所有的数据,而prometheus本地存储会保存15天 ...

  5. Prometheus时序数据库-内存中的存储结构

    Prometheus时序数据库-内存中的存储结构 前言 笔者最近担起了公司监控的重任,而当前监控最流行的数据库即是Prometheus.按照笔者打破砂锅问到底的精神,自然要把这个开源组件源码搞明白才行 ...

  6. 如何精简 Prometheus 的指标和存储占用

    前言 随着 Prometheus 监控的组件.数量.指标越来越多,Prometheus 对计算性能的要求会越来越高,存储占用也会越来越多. 在这种情况下,要优化 Prometheus 性能, 优化存储 ...

  7. Prometheus运⾏框架介绍

    框架结构的展⽰图 • 我们先来看下这个部分 这⾥是 prometheus的服务端也就是核⼼ prometheus本⾝是⼀个以进程⽅式启动,之后以多进程和多线程实现监控数据收集 计算 查询 更新 存储 ...

  8. 时序数据库连载系列:指标届的独角兽Prometheus

    简介 Prometheus是SoundCloud公司开发的一站式监控告警平台,依赖少,功能齐全.于2016年加入CNCF,广泛用于 Kubernetes集群的监控系统中,2018.8月成为继K8S之后 ...

  9. Prometheus TSDB分析

    Prometheus TSDB分析 概述 Prometheus是著名开源监控项目,其监控任务调度给具体的服务器,该服务器到目标上抓取监控数据,然后保存在本地的TSDB中.自定义强大的PromQL语言查 ...

  10. Kubernetes容器集群管理环境 - Prometheus监控篇

    一.Prometheus介绍之前已经详细介绍了Kubernetes集群部署篇,今天这里重点说下Kubernetes监控方案-Prometheus+Grafana.Prometheus(普罗米修斯)是一 ...

随机推荐

  1. 如何 使 Java、C# md5 加密的值保持一致

    Java C# md5 加密值保持一致,一般是编码不一致造成的值不同 JAVA (加密:123456) C#(加密:123456) UTF-8 e10adc3949ba59abbe56e057f20f ...

  2. 聊聊流式数据湖Paimon(一)

    翻译自 Apache Paimon官方文档 概览 概述 Apache Paimon (incubating) 是一项流式数据湖存储技术,可以为用户提供高吞吐.低延迟的数据摄入.流式订阅以及实时查询能力 ...

  3. 【C#】【串口通信(Serial Port)】无法使用(using System.IO.Ports;)命名空间<Error:SerialPort不存在上下文>

    1.包缺失导致--安装相应包: 2.等待命令行初始化--输入命令: Install-Package Microsoft.Windows.Compatibility -Version 5.0.2 参考网 ...

  4. 创建一个双模式跨运行时的 JavaScript 包

    本文将指导你发布双模式.跨运行时的 JavaScript 包.了解如何创建与 ESM 和 CommonJS 以及 Node.js.Deno 和浏览器等不同运行时兼容的库. 随着 JavaScript ...

  5. JavaScript forEach 方法跳出循环

    for循环 JavaScript中,for循环可以使用 break 和 continue 来跳出: continue:跳出本次循环 break:结束循环 for (let i = 0; i < ...

  6. 听说生鲜领军企业k8s集群都上云了,鱼会飞了?

    在这个中秋都和国庆在一起的双节里,我们的小明还在辛辛苦苦的找工作,听说他经历了一段"难忘"的面试. 小明面对着面试官的"层层拷问",游刃有余的化解了这些难题. ...

  7. Not on FX application thread(八)

    Not on FX application thread(八) JavaFX 从入门到入土系列 当你不在主线程中操作UI时会出现以下异常: Not on FX application thread 可 ...

  8. MyBatis入门操作

    MyBatis入门操作,其实是我只想验证一下instanceof是否能在xml中使用 根据官网,下面我创建一个普通Maven项目,引入依赖: <dependency> <groupI ...

  9. Tailscale 基础教程:Headscale 的部署方法和使用教程

    Tailscale 是一种基于 WireGuard 的虚拟组网工具,它在用户态实现了 WireGuard 协议,相比于内核态 WireGuard 性能会有所损失,但在功能和易用性上下了很大功夫: 开箱 ...

  10. C# 将Word转为PDF时,设置PDF文档保护

    本文以C#代码示例展示如何将Word转为PDF时,设置PDF文档保护,可设置PDF文档打开密码保护以及权限密码保护.附VB.NET代码,有需要可供参考. 程序环境: 1.Word测试文档:.docx ...