使用 InfluxDB IOx 进行追踪

导航至

追踪一直是时序数据的关键用例。但诚然,它也是 InfluxDB 过去版本无法像我们希望的那样处理得很好的用例之一。一个障碍是 基数 问题。追踪数据几乎由定义就是高基数数据,在 InfluxDB IOx 之前,高基数数据可能会影响查询性能。

InfluxDB IOx 消除了基数限制,使 InfluxDB 平台能够以高效的方式处理更广泛的应用场景,如追踪和日志。因此,让我们回答一些关于追踪的基本问题,并探讨 InfluxDB IOx 如何实现这些功能。

什么是追踪?

当你有一个分布式系统时,通常,你想要了解所有不同的组件是如何相互关联地运作的。一些流程和服务可能依赖于其他服务,所以错误、延迟和瓶颈可能会影响整个系统的性能。

为了理解所有这些不同的部分是如何共同工作的,我们使用一种称为追踪的可观察性形式。追踪提供了一种查看请求、任务、操作、作业或其他有用工作单元的方式,当它在分布式系统中工作时。任何数量的子任务(算法、网络调用、数据库事务、缓存查询等)协调以满足请求。这些子任务中的每一个都是一个跨度。

因此,追踪是一系列跨度,提供了关于请求更细微细节的时间信息。

追踪是如何工作的?

跨度可以有零个或多个子跨度,称为子跨度或子代。一个子跨度可以有它自己的子代,依此类推。

追踪从一个根跨度开始,没有父代。因为根跨度是追踪中所有其他跨度的递归父代,所以根跨度的时间长度代表了追踪的总时间。

Tracing-with-InfluxDB-IOx-Diagram 11.08.2022v4

如图所示,单个追踪中存在许多潜在的跨度。

为了从所有这些跨度中构建一个追踪,并确保所有内容都正确地放在一起,每个跨度都需要识别信息。为此,每个跨度都有一个追踪 ID、跨度 ID,以及适用时的父跨度 ID。

这些构建块创建了一个子任务的分层树,为构建追踪提供了关键结构。

这与基数有什么关系?

在 IOx 之前,InfluxDB 的时序合并树(TSM)以 系列列 存储数据。一个系列是由测量、标签和一个字段组成的唯一组合。在这个模型中,基数是系列的总数,即磁盘上存储的列数。所以,如果你有两个系列,你的基数是两个。高基数通常会成为问题,因为它与较慢的查询性能相关。

为了避免预-IOx InfluxDB中的基数膨胀,系列数量必须受到限制。追踪的挑战在于每个追踪和跨度都会生成一个唯一的ID(对于追踪,大多数数据库模式认为这些ID是标签),从而创建无界的标签值。结合追踪数据的数量和速度,就会产生基数膨胀。

IOx:解决基数问题

InfluxDB的早期版本将每个系列存储为一个列,这可能导致大量列。随着InfluxDB IOx的引入,度量时间戳、标签和字段都分别保存在各自的列中,因此具有两个标签键和三个字段的度量表示为六个列。这种设计大大减少了数据库需要处理的列的数量。

IOx将表的列存储在Parquet文件中。当更多数据到达时,IOx将这些表的列写入新的Parquet文件。Parquet文件非常有效地压缩数据列,IOx将这些文件存储在对象存储(S3)中,具有极高的可扩展性。InfluxDB云查询层会随着您的查询负载自动扩展。

Parquet文件格式还提供了出色的查询性能。例如,当IOx将数据列写入Parquet时,它会在Parquet元数据中包含提示来描述列内容。这样,查询引擎可以在查询时跳过整个Parquet文件,以及/或Parquet文件中无用的部分。

InfluxDB存储引擎、持久化格式和存储查询层的这些更新结合起来,提供了无限的基数并解锁了诸如追踪之类的用例。

要开始使用InfluxDB IOx并了解无限基数能为您做什么,请注册InfluxDB IOx beta项目