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,可以看到上述过程如下:

  1. 一开始内存中没有任何时序数据
  2. 此时来了两个样本,一个是时序为600的样本,另一个是时序为750的样本,它们作为一个有序的chunk
  3. 来了30个时序为1到150之间的乱序样本
  4. 来了10个样本,由于前面的chunk已经满了,因此需要为乱序数据创建一个新的chunk
  5. 随着样本的增加,需要创建更多的chunks。注意chunk1和chunk2有一个重叠的值,300
  6. 来了一个新的以时序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:支持乱序的指标采集的更多相关文章

  1. Wireshark抓包实例分析TCP重复ACK与乱序

    转载请在文首保留原文出处: EMC 中文支持论坛https://community.emc.com/go/chinese 介绍 TCP 的一大常见问题在于重复 ACK 与快速重传.这一现象的发生也是由 ...

  2. 关于乱序(shuffle)与随机采样(sample)的一点探究

    最近一个月的时间,基本上都在加班加点的写业务,在写代码的时候,也遇到了一个有趣的问题,值得记录一下. 简单来说,需求是从一个字典(python dict)中随机选出K个满足条件的key.代码如下(py ...

  3. Python中,os.listdir遍历纯数字文件乱序如何解决

    Python中,os.listdir遍历纯数字文件乱序如何解决 日常跑深度学习视觉相关代码时,常常需要对数据集进行处理.许多图像文件名是利用纯数字递增的方式命名.通常所用的排序函数sort(),是按照 ...

  4. JDK之集合乱序源码分析

    在JAVA的JDK中Collections类提供了shuffle方法用来对给定的集合参数进行乱序重排,之前面试也被问到过类似的问题,看了一下JDK的源码实现做个记录 1. 方法签名: Collecti ...

  5. VC6.0 多线程输出乱序问题

    今天尝试编写多线程最简单的例子 #include "stdafx.h" #include "windows.h" #include <iostream&g ...

  6. java property 配置文件管理工具框架,避免写入 property 乱序

    property property 是 java 实现的 property 框架. 特点 优雅地进行属性文件的读取和更新 写入属性文件后属性不乱序 灵活定义编码信息 使用 OO 的方式操作 prope ...

  7. 【操作系统之十一】任务队列、CPU Load、指令乱序、指令屏障

    一.CPU Loadcpu load是对使用或者等待cpu进程的统计(数量的累加):每一个使用(running)或者等待(runnable)CPU的进程,都会使load值+1;每一个结束的进程,都会使 ...

  8. Spring Boot+STOMP解决消息乱序问题

    当我们使用Spring Boot+websocket进行前后端进行通信时,我们需要注意:服务器可以随时向客户端发送消息.默认的情况下,不保证:服务器发送的消息与到达客户端的消息的顺序是一致的.可能先发 ...

  9. 关于使用map存放数据乱序”问题“

    今天做项目中遇到了一个比较低级的错误,如果没注意将会变的更麻烦... 其实吧,也不难,要求就是将list中的值转为map后,再顺序输出map中的值,list的顺序怎样,加入到map的顺序也应怎样,不能 ...

随机推荐

  1. docker实时查看日志

    docker logs -f --tail=10 fo-order -f : 查看实时日志 --tail=10 : 查看最后的10条日志. fo-order: 容器名称

  2. Lambda表达式有参数有返回值的练习(自定义接口)和Lambda省略格式&Lambda使用前提

    给定一个计算器Calculator接口,内含抽象方法calc可以将两个int数字相加得到和值 使用L ambdo的标准格式调用invokeCalc方法,完成120和130的相加计算 public in ...

  3. STC8H开发(十四): I2C驱动RX8025T高精度实时时钟芯片

    目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...

  4. IDEA快捷键之html篇-1

      前端IDE中Emmet插件快捷输入HTML代码 前端IDE如VSCode.Atom.Sublime Text和Intellij Idea中使用Emmet插件快捷输入HTML代码的介绍 前端IDE中 ...

  5. docker容器管理操作

    Docker容器的四种状态: 运行 已暂停 重新启动 已退出 1.容器的创建 容器创建:就是将镜像加载到容器的过程. 创建容器时如果没有指定容器名称,系统会自动创建一个名称. 新创建的容器默认处于停止 ...

  6. 网格动物UVA1602

    题目大意 输入n,w,h(1<=n<=10,1<=w,h<=n).求能放在w*h网格里的不同的n连块的个数(平移,旋转,翻转算一种) 首先,方法上有两个,一是打表,dfs构造连 ...

  7. 在CDH webUI中部署HDFS HA

    一.点击hdfs按钮进入hdfs配置界面 二.开始部署hdfs ha 三.分配角色 设置存储路径,这个可以自定义,我还在学习阶段我就默认了,之前改过,没起来,默认就好了:

  8. 2022-7-19 第五组 pan小堂 封装和 this

    this关键字 this关键字由来和使用: A:this:代表所在类的对象引用方法被哪个对象调用,this就代表那个对象 B:什么时候使用this呢 ? 局部变量和成员变量重名 set 和 get 方 ...

  9. Python3的单元测试模块Mock与性能测试模块CProfile

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_92 我们知道写完了代码需要自己跑一跑进行测试,一个写好的程序如果连测试都没有就上到生产环境是不敢想象的,这么做的人不是太自信就是太 ...

  10. 虚言妙诀终虚见,面试躬行是致知,Python技术面试策略与技巧实战记录

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_183 2021年,对于正在找工作的朋友来说,笼罩在新冠肺炎疫情之下,今年的就业季显得更加具有挑战性,更有意思的是,每当这个时候,各 ...