4.Prometheus之存储及WAL
- 一、整体介绍
- 二、block
- 2.1 head block
- 三、WAL(Write-ahead logging, 预写日志)
- 3.1 数据流向
- 四、和存储相关的启动参数
- 五、总结
一、整体介绍
Prometheus 2.x 采用自定义的存储格式将样本数据保存在本地磁盘当中。如下所示,按照两个小时(最少时间)为一个时间窗口,将两小时内产生的数据存储在一个块(Block)中,每一个块中包含该时间窗口内的所有样本数据(chunks),元数据文件(meta.json)以及索引文件(index)。
[mingming.chen@m162p65 data]$ tree |
二、block
TSDB将存储的监控数据按照时间分成多个block存储,默认最小的block保存时间为2h,后台程序还会将小块合并成大块,减少内存中block的数量,便于索引查找数据,可以通过meta.json查看,可以看到01E2MA5GDWMP69GVBVY1W5AF1X被压缩1次,source有3个block,那么2*3=6小时的数据量。

关于block压缩:
- 最初的两个小时的块最终会在后台压缩为更长时间的块;
- 压缩的最大时间块为数据保留时间的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, 预写日志)

3.1 数据流向
prometheus将周期性采集到的数据通过Add接口添加到head block,但是这些数据暂时没有持久化,TSDB通过WAL将数据保存到磁盘上(保存的数据没有压缩,占用内存较大),当出现宕机,启动多协程读取WAL,恢复数据。
四、和存储相关的启动参数
--storage.tsdb.path: This determines where Prometheus writes its database. Defaults to data/. |
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的更多相关文章
- Prometheus TSDB存储原理
Prometheus 包含一个存储在本地磁盘的时间序列数据库,同时也支持与远程存储系统集成,比如grafana cloud 提供的免费云存储API,只需将remote_write接口信息填写在Prom ...
- Prometheus学习系列(九)之Prometheus 存储
前言 本文来自Prometheus官网手册 和 Prometheus简介 存储 Prometheus是一个本地磁盘时间序列数据库,但也可选择与远程存储系统集成,其本地时间序列数据库以自定义格式在磁盘上 ...
- Prometheus存储模型分析
Prometheus是时下最为流行的开源监控解决方案,我们可以很轻松地以Prometheus为核心快速构建一套包含监控指标的抓取,存储,查询以及告警的完整监控系统.单个的Prometheus实例就能实 ...
- Prometheus存储原理及数据备份还原
prometheus将采集到的样本以时间序列的方式保存在内存(TSDB 时序数据库)中,并定时保存到硬盘中.与zabbix不同,zabbix会保存所有的数据,而prometheus本地存储会保存15天 ...
- Prometheus时序数据库-内存中的存储结构
Prometheus时序数据库-内存中的存储结构 前言 笔者最近担起了公司监控的重任,而当前监控最流行的数据库即是Prometheus.按照笔者打破砂锅问到底的精神,自然要把这个开源组件源码搞明白才行 ...
- 如何精简 Prometheus 的指标和存储占用
前言 随着 Prometheus 监控的组件.数量.指标越来越多,Prometheus 对计算性能的要求会越来越高,存储占用也会越来越多. 在这种情况下,要优化 Prometheus 性能, 优化存储 ...
- Prometheus运⾏框架介绍
框架结构的展⽰图 • 我们先来看下这个部分 这⾥是 prometheus的服务端也就是核⼼ prometheus本⾝是⼀个以进程⽅式启动,之后以多进程和多线程实现监控数据收集 计算 查询 更新 存储 ...
- 时序数据库连载系列:指标届的独角兽Prometheus
简介 Prometheus是SoundCloud公司开发的一站式监控告警平台,依赖少,功能齐全.于2016年加入CNCF,广泛用于 Kubernetes集群的监控系统中,2018.8月成为继K8S之后 ...
- Prometheus TSDB分析
Prometheus TSDB分析 概述 Prometheus是著名开源监控项目,其监控任务调度给具体的服务器,该服务器到目标上抓取监控数据,然后保存在本地的TSDB中.自定义强大的PromQL语言查 ...
- Kubernetes容器集群管理环境 - Prometheus监控篇
一.Prometheus介绍之前已经详细介绍了Kubernetes集群部署篇,今天这里重点说下Kubernetes监控方案-Prometheus+Grafana.Prometheus(普罗米修斯)是一 ...
随机推荐
- 如何 使 Java、C# md5 加密的值保持一致
Java C# md5 加密值保持一致,一般是编码不一致造成的值不同 JAVA (加密:123456) C#(加密:123456) UTF-8 e10adc3949ba59abbe56e057f20f ...
- 聊聊流式数据湖Paimon(一)
翻译自 Apache Paimon官方文档 概览 概述 Apache Paimon (incubating) 是一项流式数据湖存储技术,可以为用户提供高吞吐.低延迟的数据摄入.流式订阅以及实时查询能力 ...
- 【C#】【串口通信(Serial Port)】无法使用(using System.IO.Ports;)命名空间<Error:SerialPort不存在上下文>
1.包缺失导致--安装相应包: 2.等待命令行初始化--输入命令: Install-Package Microsoft.Windows.Compatibility -Version 5.0.2 参考网 ...
- 创建一个双模式跨运行时的 JavaScript 包
本文将指导你发布双模式.跨运行时的 JavaScript 包.了解如何创建与 ESM 和 CommonJS 以及 Node.js.Deno 和浏览器等不同运行时兼容的库. 随着 JavaScript ...
- JavaScript forEach 方法跳出循环
for循环 JavaScript中,for循环可以使用 break 和 continue 来跳出: continue:跳出本次循环 break:结束循环 for (let i = 0; i < ...
- 听说生鲜领军企业k8s集群都上云了,鱼会飞了?
在这个中秋都和国庆在一起的双节里,我们的小明还在辛辛苦苦的找工作,听说他经历了一段"难忘"的面试. 小明面对着面试官的"层层拷问",游刃有余的化解了这些难题. ...
- Not on FX application thread(八)
Not on FX application thread(八) JavaFX 从入门到入土系列 当你不在主线程中操作UI时会出现以下异常: Not on FX application thread 可 ...
- MyBatis入门操作
MyBatis入门操作,其实是我只想验证一下instanceof是否能在xml中使用 根据官网,下面我创建一个普通Maven项目,引入依赖: <dependency> <groupI ...
- Tailscale 基础教程:Headscale 的部署方法和使用教程
Tailscale 是一种基于 WireGuard 的虚拟组网工具,它在用户态实现了 WireGuard 协议,相比于内核态 WireGuard 性能会有所损失,但在功能和易用性上下了很大功夫: 开箱 ...
- C# 将Word转为PDF时,设置PDF文档保护
本文以C#代码示例展示如何将Word转为PDF时,设置PDF文档保护,可设置PDF文档打开密码保护以及权限密码保护.附VB.NET代码,有需要可供参考. 程序环境: 1.Word测试文档:.docx ...