InfluxDB 3 如何实时查询数据?

导航至

InfluxDB 3 构建于开源技术之上——Flight、DataFusion、Arrow 和 Parquet——但即使开发者使用相同的技术构建自己的时间序列数据库,他们也无法复制 InfluxDB 3。FDAP 堆栈提供了高性能数据库所需的许多构建模块,例如定义 InfluxDB 3 的快速、多线程、流式、列式执行引擎。然而,它不包括 InfluxDB 3 中使用的所有低延迟和时间序列专业化。这些专业化部分包括自定义的摄取器和压缩器,用于快速组织传入数据以进行查询,针对时间序列优化的文件组织,以及允许用户实时查看和分析数据的专用缓存。

实时分析

什么是实时分析,以及为什么它对时间序列数据如此重要?时间序列实时分析是指在摄取时间戳数据后立即对其进行分析和提取洞察的过程,延迟极低。它通过即时趋势、异常和事件检测来增强快速决策能力。实时分析使组织能够监控事件并在事件发生时做出响应。数据摄取期间的任何延迟都会增加事件与干预之间的时间,从而在一个毫秒至关重要的过程中浪费时间。

实时分析和 InfluxDB 3

InfluxDB 3 的高性能分析由自定义摄取器、压缩器、目录、缓存和支撑数据库的自定义文件组织相结合支持。这三个组件协同工作,以实现速度和效率。

在深入探讨摄取器之前,让我们先讨论一下这项技术。如前所述,InfluxDB 3 构建于 FDAP 堆栈——Flight、DataFusion、Arrow 和 Parquet——这显着提高了查询性能。除了 InfluxDB 工程团队完成的自定义工程之外,这些技术还为快速查询历史数据奠定了坚实的基础。自定义工程包括对 DataFusion 本身和 InfluxDB 3 的上游贡献。

什么是 FDAP 堆栈?

基础:DataFusion,查询引擎

DataFusion 是一个用 Rust 编写的开源查询执行框架,可高效处理大规模数据。它提供了一个现代 SQL 接口用于查询数据,支持多个数据源,并包括分布式查询执行和向量化处理等功能,以实现高性能。作为 Apache Arrow 生态系统的一部分,DataFusion 与 Arrow 的内存列式格式无缝集成,并与 Parquet 文件原生工作。这种兼容性使得能够对以列式格式存储的大型数据集进行快速高效的分析,并使 DataFusion 成为分析、ETL 管道和大数据处理的理想选择。

DataFusion 使用 Arrow 作为其内存格式,并且可以读取 Parquet 以及许多其他文件格式。DataFusion 被认为是高级库,而 Arrow 和 Parquet 是低级库,可提供对数据存储和系统性能的更多控制。高级库提供了简化的接口来执行特定任务,从而抽象化了复杂性,而低级库允许更详细的自定义,但代价是需要更多的技术专业知识。DataFusion 的部分速度来自于构建在 Arrow 和 Parquet 提供的基础之上。

InfluxData 对 DataFusion 的贡献

尽管 DataFusion 支持各种数据源,但它最初的设计并没有考虑到时间序列数据。当 InfluxDB 采用 DataFusion 时,InfluxData 工程师在添加构建针对时间序列数据优化的查询引擎所需的相关扩展 API 方面发挥了关键作用。这些上游贡献极大地提高了 DataFusion 的性能,最近使其成为查询 Apache Parquet 文件的最快引擎。InfluxData 通过 DataFusion 的扩展机制添加了多个 时间序列特定的优化,使其更适合对时间序列数据进行实时、高性能查询。

随着 DataFusion 的采用,InfluxDB 3 以及任何其他采用它的组织都将拥有一个闪电般快速的时间序列数据查询引擎。添加实时查询功能引入了额外的复杂性,因为数据必须在摄取后立即可查询——这对于时间序列数据至关重要。重要的是要注意,在摄取后立即查询数据和针对大型历史数据集获取结果是两个不同的挑战。InfluxDB 3 工程师花费了大量时间优化摄取过程,因为没有闪电般快速的实时摄取,实时分析就不存在。这就是为什么任何熟练的工程师都可以使用 FDAP 堆栈构建用于查询历史数据的高性能引擎,但实时查询需要更高级的解决方案,例如 InfluxDB 3。

摄取器

摄取器是为处理时间序列数据的特定需求而定制构建的,特别是成功摄取所需的大量数据和高速率。InfluxDB 3 的摄取器包括用于行协议文件格式的自定义解析器、面向时间序列的预写日志 (WAL) 文件以及支持快速写入摄取的权衡。速度对于时间序列工作负载至关重要,因此摄取器优先考虑速度而不是持久性和 ACID 合规性提供的严格一致性。

当数据进入 InfluxDB 3 时,它不会立即进入 Parquet。相反,数据进入一个专门的缓冲区,该缓冲区也基于 Arrow,然后最终写入对象存储(Parquet)。该系统允许更快的数据写入,绕过等待数据放置在对象存储中才能响应客户端的等待时间。数据在写入后立即可读,无需等待写入对象存储。数据最终以批处理形式写入对象存储。这种设计避免了将对象存储通信添加到写入和查询路径中,这有助于避免如果数据实时写入对象存储时发生的不可避免的性能瓶颈。

Workflow for Ingest, Metadata, and Storage

分布式产品中的数据摄取权衡

在其分布式产品(Cloud Serverless、Cloud Dedicated 和 Clustered)中,InfluxDB 3 有意权衡了摄取速度和持久性。通过首先将数据写入本地磁盘,然后再写入对象存储,它使用户能够快速摄取和查询海量数据,而无需等待对象存储持久化每个记录。虽然这种方法牺牲了即时持久性,但它确保系统将处理高写入吞吐量,这对于时间序列数据至关重要。

InfluxDB 3 的分布式架构还消除了在摄取数据时对复杂共识协议的需求。相反,它专注于最大化写入速度,最终一致性通过压缩器或在读取时处理。这种设计允许快速、高效的数据摄取,而不会牺牲可扩展性或性能。

实时查询和数据组织

除了摄取器之外,InfluxDB 3 中的实时查询还严重依赖于 Parquet 文件中的数据组织和高级缓存技术。DataFusion 在灵活的 Parquet 文件上工作,这些文件为工程师提供了许多数据组织选项,包括自定义排序和数据分区。InfluxDB 的 CTO Paul Dix 花费了大量时间优化数据在这些文件中的划分方式,在写入速度和查询性能之间取得平衡,以确保实时查询保持快速,即使摄取的数据量不断增长。InfluxDB 3 将数据组织到 Parquet 文件中,以优化查询速度和高效存储,确保在高效处理大规模数据摄取的同时,提供高性能分析。

后续步骤

FDAP 堆栈和自定义工程的结合实现了卓越的时间序列体验。虽然摄取器和 FDAP 堆栈本身都很强大,但它们共同提供了任何一方都无法单独实现的功能。InfluxDB 3 代表了时间序列数据库技术的突破,它将 FDAP 堆栈的强大功能与广泛的自定义工程相结合,为实时分析提供高性能。通过利用 DataFusion、Arrow 和 Parquet 等开源工具,并通过定制优化对其进行增强,InfluxData 创建了一个平台,该平台在高速数据摄取和实时查询执行方面都表现出色。其创新的摄取器和自定义文件组织在速度、可扩展性和效率之间取得了关键平衡,因此 InfluxDB 3 可以在不影响性能的情况下处理海量时间序列工作负载。

有关 InfluxDB 3 架构的更多阅读资料,请查看我们的工程团队撰写的这篇文章。通过InfluxDB Cloud Serverless免费开始云端体验,试用我们新的开源产品 InfluxDB 3 Core 的 Alpha 版本,或联系销售以获取自定义 POC。