博客/工程

如何Grafana米密尔的split-and-merge压缩机使扩展指标10亿活跃系列

2022年4月19日15分钟

Grafana米密尔,我们的新开源的时间序列数据库水平,介绍了一种可伸缩split-and-merge压实机,可以很容易地处理大量的系列。在之前的博文中,我们描述了我们所做的广泛的负载测试以确保高性能10亿系列活动。

在本文中,我们将讨论与现有普罗米修斯的挑战和皮质压实工具的新特性Grafana米密尔的压缩机。这些特性使我们能够轻松地横向扩展到允许我们摄取10亿活跃系列,内部复制30亿时间序列冗余,紧凑又回到10亿年长期储存。

问题,问题无处不在

我们如何摄取10亿系列Grafana米密尔?有一点是明确的——我们需要很多ingesters !如果一个摄取可以处理1000万个活动系列,我们也使用3 x复制,以确保容错和保证耐用性,我们需要运行300个。但这许多ingesters,我们有一个新问题:每个摄取将产生一个TSDB块每2小时。每天都是3600新的TSDB块。~ 5.5 GB / TSDB块1000万系列,每天大约20 TB的数据。

我们不能有效地从长期存储搜索所有这些块当用户运行一个查询或在Grafana打开仪表板。米密尔使用压实来解决这个问题。压缩减少存储块的数量,也加速了查询和删除处理样品。我们需要删除处理因为由于使用3 x复制样品,每个样品接受了三个不同的ingesters和存储在三个不同的ingester-generated块。

原来的压缩机在皮质很有限——虽然可以运行压实机的多个实例,每个实例必须工作在一个不同的租户。最近改善大脑皮层压缩机解决这个问题,并允许并行压缩一个租户的多个实例。但压实300年ingester-generated块一起仍然带来了多重挑战:

一是题下载、压实和上传300块,每个都有10 m系列,需要大量的时间和空间。这样一块覆盖2小时的数据需要大约5.5 GB的磁盘空间,所以300人需要1.5 TB的磁盘空间。压实是单线程的任务,和压实300块在一起需要几个小时,甚至几天——如果它会成功。我们想要压实跑得更快,以避免尽快处理未压实的街区,因为压力未压实的块添加到查询器和store-gateways,缓慢的查询。

Grafana米密尔:压缩图

另一个问题是,即使我们能合并成一个300块,结果输出块将普罗米修斯TSDB格式的极限。TSDB块总索引大小的限制64镶条和4镶条每个索引部分。压实尝试然后失败的“紧凑型街区…超过最大大小为64直布罗陀”错误消息。不幸的是,这些限制不可能储存1 b系列成一个TSDB块。限制可能会避免在未来通过引入一个更新的格式TSDB指数,但这也需要仔细设计和讨论普罗米修斯在更广泛的社区。

米密尔的压缩机其多个特性高招来解决这些问题。

功能1:如何Grafana米密尔组输入块

米密尔的压缩机不紧凑所有ingester-generated块。压缩机将把所有块分成组,每组和紧凑的单独的块。例如,而不是一个大压实300块,我们可以运行15小紧凑排列,每个合并20块。这是一个更容易的任务需要完成,用更少的块下载和合并/压实,和并行紧凑的组织能力!

然而,压实随机块在一起不是很高效的重复数据删除时。高效的重复数据删除,我们需要紧凑的同一系列不同的块。让我们看看其他功能帮助我们。

Grafana米密尔:划分块

功能2:如何Grafana米密尔碎片(分裂)系列

下一个功能米密尔所使用的压缩机是分片系列在压实。传统的压实机需要多个输入块和产生一个输出块。米密尔的压缩机可以产生多个块,每一块只包含输入系列的一个子集。系列分片到输出块基于散列和配置的输出块的数量。例如,而不是存储所有1 b系列成一个块,我们可以把这个系列分为32个输出模块。每个输出块被分配一个“碎片ID”像“5 _of_32”,意思是这32块第五碎片。这个解决问题与TSDB格式限制。

Grafana米密尔压缩机:切分图

上面的图和那些跟随展示的例子当Grafana米密尔split-and-merge压实机配置了3个碎片。

分裂系列的有几个好处:

  1. 可配置数量的碎片使我们能够容纳大量的系列活动,否则不适合一个块。
  2. 我们确切地知道哪些系列在每个街区。例如,一个块碎片ID“5 _of_32”将只包含那些series.hash系列()国防部32 = = 5。
  3. 合并多个块碎片ID将保留其碎片ID相同的!让我们讨论一下这意味着什么…

功能3:如何Grafana米密尔合并碎片

我们提到合并相同的块碎片ID将保留这个碎片ID。例如,如果我们有一块覆盖的时间范围“今天从6点到8点,碎片ID 5 _of_32,”还有一块数据“今天8点到10点之间,碎片ID 5 _of_32,”我们可以合并这两块组合进一个更大的块覆盖时间范围:“今天,从6点到10点,碎片ID 5 _of_32。”每个系列包含在该块的属性series.hash()国防部32 = = 5仍然占据!这个特性允许我们做传统的块合并成12小时或24小时块——一个碎片。

这是一个可重复的操作。再次做相同的数据产生相同的结果。还记得我们3 x摄取复制吗?这种设计保证重复数据删除复制样本有效工作,作为数据总是会静止在相同的碎片。

一个警告:这种机制取决于模操作。如果我们改变模,改变一切。如果数据量的增加,我们需要增加碎片的数量,我们不能合并产生的碎片了。例如,国防部32碎片只能与其他合并国防部32的人;如果我们介绍国防部48碎片之后,他们只能与其他合并国防部48的人。

如何Grafana米密尔压缩机工作吗?

米密尔压缩机使用这些特性在一起为了扩展到大量的系列。每个压缩机实例运行计划。规划师将查看所有可用的存储块,找块需要压实,然后计算出压实工作。

有两种类型的工作,压缩机可以执行:

  • 分工作:块生成的摄取是第一个分组,每组块然后分别压实(特征1)。在此压实,我们也碎片系列到输出模块(功能2),这就是为什么我们称这些工作“分裂”的工作。
  • 合并工作:合并工作使用相同的传统块合并紧凑排列的限制,我们只能合并相同的块碎片ID(功能3)。如果块未分裂,他们有一个空的碎片ID,可以匹配和合并。

每个压缩机实例运行计划和计算所有分割和合并工作,根据当前状态的块存储计划运行时。然而,压缩机实例只会执行工作实例“拥有”,基于哈希环。

Grafana米密尔的split-and-merge压缩机可以很容易地分发分裂和合并工作在许多压实机情况下,加快整个压实过程!这也允许我们横向规模压缩机:压实工具我们添加越多,越快整体压实可以运行!

为更多的细节,超出了这篇文章的范围,请看到我们文档在压实工作原理Grafana米密尔。

压实是如何工作的

让我们在实践中看看它是如何工作的。300 ingesters继续我们的例子中,每个摄取~ 10 m系列,假设我们使用15组当压实摄取和32块碎片。

每两个小时,300 ingesters产生一个单块。上传到存储块后,压实工具开始发现这些块,他们开始压实发现块。在第一步中,我们需要执行15件(“分裂”工作),每个20国集团(g20)一个阻塞- 300随机分为15组每组20个街区。如果组太大,紧凑排列运行太慢,我们可以简单地使用多组(用更少的块)和添加更多的压实工具。这些紧凑排列会产生输出32块与分片系列。

这一步完成后:

  • 我们有15件“分裂”,执行生产分片块“1 _of_32”到“32 _of_32。”
  • 我们一共产生了15 * 32 = 480新块和删除原始摄取300块。

但压实工具还没有完成。当他们发现新的分片块,压实工具知道这样的块可以合并。我们需要运行一个压实/碎片,这意味着32件。这一次我们也删除处理样品(因为我们是压实同一系列),产生一个输出块碎片。

在这一点上:

  • 我们有32执行额外的“合并”件,每个合并所有块与给定碎片ID(例如。“5 _of_32”)。
  • 我们有生产32新块(每个碎片一个ID)和删除前面的480块。
Grafana米密尔压缩机:重复数据删除图

所有的这一切发生的时候每两个小时。所有分割工作可以并行运行,这同样适用于所有合并工作对于一个给定的时间范围内。(合并工作将不会开始如果还有分割工作相同的时间范围)。这使得更好的压实工具的水平扩展。

Grafana米密尔压缩机:最后的压实块图

12个小时后,我们现在可以很容易地合并所有块和相同的碎片ID在一起产生一个12 h为每个切分块。24小时后我们可以做同样的事情。一天几百件后,我们每天只有32压紧块,每个块包含1 b / 32 = ~ 31 m系列。

查询切分和压缩机分片

但还有更多!前面几节中,我们说我们确切地知道哪些系列的块。Grafana米密尔用这一事实来加快系列查找查询时查询切分加速!

Grafana米密尔可以加快许多类型的PromQL通过利用他们的内部结构和查询运行部分并行查询。作为一个简单的例子,简单的查询“总和(率(指标[1 m]))”可以执行:

sum (concat(总和(率(公制{__query_shard__ =“1 _of_4”} [1 m]))和(率(公制{__query_shard__ =“2 _of_4”} [1 m]))和(率(公制{__query_shard__ =“3 _of_4”} [1 m]))和(率(公制{__query_shard__ =“4 _of_4”}(1米)))))

(注意:concat用于显示部分查询结果时连接/ query-frontend合并。)

每一个sum(率(公制{…}))然后执行部分查询作为一个单独的查询,它允许米密尔并行运行这些查询部分。

当查询器获取的数据指标{__query_shard__ = " 2 _of_4 "},它知道只有四个指标在第二个碎片。该算法,以检查是否属于给定一系列碎片是一样的一个压缩机使用的:series.hash()国防部4 = = 2

如果压缩机使用的碎片的数量和查询切分是完全一样的,然后查询器可以看有关block-shard找到系列寻找。

压实机碎片比查询碎片

如果碎片不同,我们仍然可以从压缩机分片中获益。例如,假设查询碎片的数量是4,但压实机使用32个碎片。在这种情况下,查询器只能查询8块的32,特别是块与压实机碎片ID2 _of_32 6 _of_32 10 _of_32,最多…30 _of_32。块与其他碎片id不可能包含任何系列,将属于“2 _of_4“碎片所使用的查询,查询器正在运行。

Grafana米密尔压缩机:压缩机碎片比查询碎片

多个查询碎片比压缩机碎片

情况类似当查询碎片的数量高于压实机碎片的数量。只有4压缩机碎片,查找指标{__query_shard = " 5 _of_8 "}必须打块碎片ID“3 _of_4”。同时,查找指标{__query_shard = " 6 _of_8”}必须使用相同的“3 _of_4”块中。

Grafana米密尔压缩机:查询碎片比压缩机碎片图。

在任何情况下,压缩机系列分片的帮助我们减少块的数量,我们需要查询从长期存储,即使查询切分和压缩机之间的碎片数量分片并不是完全相同的。一般来说,我们可以执行这个如果碎片的数量在减少查询切分是整除压缩机碎片的数量,反之亦然。

启用查询切分,Grafana米密尔将计算一个给定查询的查询碎片数量根据配置选项,查询的范围也压实机碎片,所以在这一节中描述的优化可以自动工作。

结论

通过使用上面描述的技术和一些额外的压实机的改进,该Grafana米密尔压缩机能够跟上定期到达街区30亿系列来自ingesters,彻底删除下来到10亿。在我们的设置600 ingesters 48块组,和48压实机碎片,我们看到10至100压实工具压缩块租户在任何给定的时刻,为租户和稳定数量的块。

在一天之内的活动压实工具:


块的数量超过一天(同一时期以前的图):

关于米密尔压缩机的常见问题

有什么限制和未来可能的改进在米密尔压缩机吗?

我们看到了一个可能的改善与压实工作是如何分布在压缩机实例。现在所有压实工具做自己的计划和决定哪些工作运行基于环。这个工作,但也有一些问题,因为有工作之间的依赖关系。例如,压实工具计划之前所有的“分裂”工作计划任何“合并”工作。有时多个分割工作下降到相同的压实机(由于哈希和环),然后这些工作需要等待对方。

解决这个问题的方法之一是引入一个全球压缩机工作队列,而不是依赖于环。这将使压实工具之间的工作分配更公平的方法,只要有免费压缩机实例,它将避免阻塞压实工作。

我们每天会有多个块。影响查询器和store-gateways如何?

查询器和store-gateways现在需要处理更多的块。查询器不做很多工作,但store-gateways下载和(延迟)加载到内存块。然而,如果我们知道,我们可以在时间紧凑的块,我们可以使用新引入store-gateways选项忽略块yet-uncompacted时间范围(例如,从最后一块6 h)。

每天还帮助store-gateways拥有多个块。每天一块,如果我们查询特定的一天,这个查询将达到一个store-gateway。每天与多个块,块将跨多个store-gateways分片,查询可以达到,从而传播查询工作负载。

发生了什么当我们重新配置的组数分裂,或数量的碎片?

重新配置的组数分裂可能导致一些块分裂由多个压实工作。压实工具这种临时增加了额外的工作,但却无害——所有块最终将压实和样品将被正确删除处理。

改变碎片的数量也是一个安全运行。每个块生成的分割阶段都有自己的“压实机碎片ID”,还包括碎片的总数。当这个碎片的总数变化(说,从A到B),块使用的前一个值(A)将不会被并入新块(使用B)。这意味着,对于一个给定的一天,将会有两块流,和将会有+ B总块毕竟件完成,而不是在“数量”的块(变化前)或“B”(更改后)。所有查询都将正常工作。

压实机如何处理旧街区没有分裂吗?

块分割,没有空“压实机碎片ID”,只能与其它块合并不分裂。这些模块可以查询。

我们如何配置这个米密尔安装?

split-and-merge压缩机是唯一可用的压实机在Grafana米密尔。有一些新的选项,可以设置:

  • -compactor.split-groups:数量的组使用在分裂阶段
  • -compactor.split-and-merge-shards:数量的系列碎片在分相产生
  • -compactor.compactor-tenant-shard-size:压实机的实例数量,一个租户可以使用。有用的多租户系统。

这些值也可以设置/租户,租户如此不同的需求将使用一系列不同数量的分裂组织和碎片。看到Grafana米密尔配置参数文档。

你有推荐值分裂组织和合并碎片?

现在我们的推荐是目标~ 25 m系列/块。100系列的租户,这意味着使用4系列碎片。分裂组织的数量取决于ingesters的数量和时间的压缩,但首先我们建议分裂组织的数量等于系列碎片的数量。

我可以用块由米密尔在普罗米修斯或Thanos,或有兼容性问题?

块由Grafana米密尔在压实系列分片是相同的普罗米修斯所使用或Thanos TSDB块。Grafana米密尔添加了一个额外的标签这样块元的“Thanos”一节。json文件。普罗米修斯将尝试合并块覆盖同一时间范围,这可能触及TSDB指数限制如上所述。Thanos将使用额外的元数据作为“外部标签。”

除了这些小问题,阻塞是常规普罗米修斯TSDB, TSDB-related工具与他们合作得很好。

利用Grafana米密尔为自己

更多地了解米密尔以及如何部署它自己:

如果你感兴趣帮助我们规模米密尔到下一个数量级,我们正在招聘!

Grafana云是最简单的方法开始使用指标、日志、痕迹和仪表板。我们有一个慷慨的自由永远层和每个用例的bob体育手机二维码计划。现在免费注册!