Grafana Mimir:支持乱序的指标采集
Grafana Mimir:支持乱序的指标采集
译自:New in Grafana Mimir: Introducing out-of-order sample ingestion
很早之前在使用thanos和多实例的Prometheus时经常会在thanos日志中看到时序数据乱序的问题。当时唯一的办法就是从对象存储中手动删除这部分数据,非常不方便。Grafana Mimir中对乱序数据的支持是一个很大的改进。
传统的Prometheus TSDB仅支持接收1小时内的有序采样,然后丢弃其他样本。这种方式可以让Prometheus高效地存储样本。但在实际中,Prometheus的拉取模式(以一定节奏从被观察的目标中提取数据)也给用户的使用带来了很多限制。
在一些使用场景下可能会存在乱序数据,如:
- 异步启动并写入指标的IoT设备
- 使用消息总线(如使用随机分片的Kafka)的复杂传递架构,可能存在拥塞延迟。
- 某些情况下受网络连接而孤立的Prometheus实例会尝试推送老的样本。
支持乱序的设计方案
我们和Dieter Plaetinck编写了一个设计文档来解决乱序问题。
数据的摄取
Prometheus TSDB有一个内存区域,称为head block。我们通过共享该head block来避免产生重复的内存索引,同时可以减低内存消耗。对于head block中的每个时序,我们在内存中保存了过去30个未压缩的乱序样本,并将其与有序样本完全隔离开来。当内存chunk中的乱序样本达到30个之后,它将会被压缩并刷新到磁盘,并从head block开始内存映射。
这一点类似head block处理有序样本的方式:内存中的有序样本会保存在一个压缩的chunk中,最大可以保存120个样本。由于需要保存到内存中,且乱序的chunk是未压缩的,因此我们将样本数限制为30,防止消耗过多的内存。
我们还引入了一个新的方式,称为Write-Behind-Log (WBL)。WBL类似Prometheus TSDB中的Write-Ahead-Log (WAL)。在WBL中,当在TSDB中添加样本之后才会写数据,而WAL是在TSDB数据变更前写数据。我们使用WBL来记录摄取的乱序样本,因为在摄取样本前,我们并不知道样本是有序的还是乱序的。
下图展示了该过程。注意乱序chunk之前可能会重叠(下图中:OOO = Out of Order)。

白色表示内存映射的乱序chunk,黄色表示活动状态(表示新来的样本,活动状态的样本可能会被合并)的乱序Head Chunk,而蓝色表示有序的Head Chunk,可以看到上述过程如下:
- 一开始内存中没有任何时序数据
- 此时来了两个样本,一个是时序为600的样本,另一个是时序为750的样本,它们作为一个有序的chunk
- 来了30个时序为1到150之间的乱序样本
- 来了10个样本,由于前面的chunk已经满了,因此需要为乱序数据创建一个新的chunk
- 随着样本的增加,需要创建更多的chunks。注意chunk1和chunk2有一个重叠的值,300
- 来了一个新的以时序0开始的样本,它被插入了chunk3,此时chunk3与chunk0、1、2重叠
查询
Prometheus TSDB有一个有用的抽象-查询器,它将head block和磁盘的持久块上的所有内容视为“块读取器”。TSDB使用一个head block包装器来读取固定时间范围内的有序数据。类似地,我们实现了另一个围绕head block且仅读取乱序chunk的包装器。这样,head block可以体现为两种块读取器:仅读取有序数据的,和仅读取乱序数据的。
现有的查询逻辑可以无缝地处理块读取器和其他持久块数据的合并结果。但查询器要求块读取器按排序提供非重叠的块。这样,head block的乱序块读取器需要在查询时合并重叠的chunks(如下图)。当访问样本时,会发生合并,但不会重新创建块。

压缩
TSDB中的持久块会与2小时Unix时间戳对齐。对于有序数据,每过2小时,我们会获取head block中的2小时内的老数据,并将其转变为持久块,这个称为head block的压缩过程。在压缩完有序数据后,也会对乱序数据进行压缩。
由于乱序数据的特点,其可能包含跨2个小时块的样本。因此,根据需要,我们在单次乱序数据的压缩过程中会生成多个持久块,如下所示。该持久块与其他持久块类似。在压缩之后,会根据需要清理WBL和其他内容。这些块可能会与磁盘中已有的块或head block中的有序数据重叠。

一旦产生了这些块,就完成了乱序代码的处理。TSDB能够从重叠的块中请求数据,并在需要时合并重叠的块。
Grafana Mimir 和 Grafana Cloud中的乱序样本摄取
我们引入了一个名为out_of_order_time_window的配置参数来指定可以支持多老的乱序样本。默认为0,即不支持乱序样本。如果设置为1小时,则Grafana Mimir 会摄取过去1小时内的所有乱序样本。
性能特征
性能取决于:
- 摄取乱序样本的模式
- 乱序样本的数目
- 摄取的乱序样本率
在很多情况下,所有上述条件都会导致摄取器的CPU使用率增加。在有限验证的条件下,我们发现除处理乱序样本的摄取器(摄取和查询)上的CPU利用率为50%外,其他组件没有看到CPU变动。
在我们的环境中,内存的增加并不明显。但当时间序列的很大比率为乱序样本时会导致内存变化,但总体增长应该仍然很小。
Grafana Mimir:支持乱序的指标采集的更多相关文章
- Wireshark抓包实例分析TCP重复ACK与乱序
转载请在文首保留原文出处: EMC 中文支持论坛https://community.emc.com/go/chinese 介绍 TCP 的一大常见问题在于重复 ACK 与快速重传.这一现象的发生也是由 ...
- 关于乱序(shuffle)与随机采样(sample)的一点探究
最近一个月的时间,基本上都在加班加点的写业务,在写代码的时候,也遇到了一个有趣的问题,值得记录一下. 简单来说,需求是从一个字典(python dict)中随机选出K个满足条件的key.代码如下(py ...
- Python中,os.listdir遍历纯数字文件乱序如何解决
Python中,os.listdir遍历纯数字文件乱序如何解决 日常跑深度学习视觉相关代码时,常常需要对数据集进行处理.许多图像文件名是利用纯数字递增的方式命名.通常所用的排序函数sort(),是按照 ...
- JDK之集合乱序源码分析
在JAVA的JDK中Collections类提供了shuffle方法用来对给定的集合参数进行乱序重排,之前面试也被问到过类似的问题,看了一下JDK的源码实现做个记录 1. 方法签名: Collecti ...
- VC6.0 多线程输出乱序问题
今天尝试编写多线程最简单的例子 #include "stdafx.h" #include "windows.h" #include <iostream&g ...
- java property 配置文件管理工具框架,避免写入 property 乱序
property property 是 java 实现的 property 框架. 特点 优雅地进行属性文件的读取和更新 写入属性文件后属性不乱序 灵活定义编码信息 使用 OO 的方式操作 prope ...
- 【操作系统之十一】任务队列、CPU Load、指令乱序、指令屏障
一.CPU Loadcpu load是对使用或者等待cpu进程的统计(数量的累加):每一个使用(running)或者等待(runnable)CPU的进程,都会使load值+1;每一个结束的进程,都会使 ...
- Spring Boot+STOMP解决消息乱序问题
当我们使用Spring Boot+websocket进行前后端进行通信时,我们需要注意:服务器可以随时向客户端发送消息.默认的情况下,不保证:服务器发送的消息与到达客户端的消息的顺序是一致的.可能先发 ...
- 关于使用map存放数据乱序”问题“
今天做项目中遇到了一个比较低级的错误,如果没注意将会变的更麻烦... 其实吧,也不难,要求就是将list中的值转为map后,再顺序输出map中的值,list的顺序怎样,加入到map的顺序也应怎样,不能 ...
随机推荐
- 不要使用短路逻辑编写 stl sorter 多条件比较
前言 最近工期紧.任务多,没有时间更新博客,就水一期吧.虽然是水,也不能太水,刚好最近工作中遇到一个 sorter 多条件排序的问题,花费了半天时间来定位解决,就说说它吧. 背景 公司产品是一个跨端的 ...
- docker删除镜像报错 Error response from daemon: conflict: unable to delete f73fe6298efc (cannot be forced) - image has dependent child images
方法1 docker rmi 镜像ID 方法2 docker rmi -f 镜像ID 方法3 docker rmi 镜像仓库名:tag
- 记一次 Druid 超时配置的问题 → 引发对 Druid 时间配置项的探究
开心一刻 一天在路边看到一个街头采访 记者:请问,假如你儿子娶媳妇,给多少彩礼合适呢 大爷:一百万吧,再给一套房,一辆车 大爷沉思一下,继续说到:如果有能力的话再给老丈人配一辆车,毕竟他把女儿养这么大 ...
- Solution -「BZOJ3894」文理分科
Sol. 说实话,对于一个初学者,这道题很难看出是一道网络流-最小割.对于一个熟练者,这是比较套路的一种模型. 最小割,可以看做是在一个图中删掉最小的边权和使得源点.汇点不连通.或者换一个角度,可以看 ...
- Solution -「Luogu 4135」作诗
写在前面 & 前置芝士 好像是好久没有打理 blog 了.感觉上学期是有点颓.嘶,初三了好好冲一次吧. 那么回到这道题目.你会分块就能看懂. 题目大意 先挂个来自洛谷的 link. ...
- 2.Android高仿网易云音乐-引导界面和广告界面实现
效果图 效果图依次为图片广告,视频广告,引导界面. 系列文章目录导航 目录 1.实现分析 广告界面就是显示图片和视频,所以可以放一个图片控件,视频控件,然后跳过按钮,提示按钮,WiFi预加载提示都是放 ...
- 基于串口校时的数字钟设计(verilog实现)
任务: 电路图设计: 设计: 模块1:1.先设计一个计数时钟,为了仿真方便,这里把1000ns当作1s. 创建一个计数器second_lim,当计数到1000/20时清零,即1s. 秒显示器secon ...
- 在 Windows msys2 下编译 scryer-prolog
by chesium 2022/7/24 深夜 参考:https://github.com/mthom/scryer-prolog/blob/master/README.md 采用 msys2 环境编 ...
- 没错,请求DNS服务器还可以使用UDP协议
目录 简介 搭建netty客户端 在netty中发送DNS查询请求 DNS消息的处理 总结 简介 之前我们讲到了如何在netty中构建client向DNS服务器进行域名解析请求.使用的是最常见的TCP ...
- PHP小工具
防SQL注入 function clean($input) { if (is_array($input)) { foreach ($input as $key => $val) { $outpu ...