InfluxDB IOx如何管理时间序列数据的生命周期

导航到

上个月我们发布了InfluxDB IOx(发音:eye-ox),它是InfluxDB的新Rust和Apache Arrow核心。虽然InfluxDB IOx是建立在对象存储之上的列式数据库,但这只是其角色的一部分。除了查询功能外,InfluxDB IOx的另一个主要目标是通过管理时间序列数据的生命周期来帮助。本文将介绍InfluxDB IOx计划如何管理该数据生命周期。

时间序列数据的生命周期通常涉及某种实时摄取、为异步复制和订阅而缓冲数据、内存数据以查询,以及以压缩格式写入大量不可变数据。加上数据在内存和对象存储之间移动,移除高精度数据以释放空间,这就是InfluxDB IOx考虑的数据生命周期的大部分内容。删除也得到了处理,但那些细节将留待下篇文章介绍。

InfluxDB IOx针对时间序列数据的实时方面进行了优化,用于监控、ETL和可视化最近的数据。由于InfluxDB IOx使用对象存储和Parquet作为其持久化格式,我们可以将更大规模和更专门的处理推迟到适合这项任务的系统。

InfluxDB IOx 定义了API和配置来管理数据在到达时以及在后台定期移动。这些可以用来将数据发送到其他InfluxDB IOx服务器进行处理,查询或将它以写入前日志段或Parquet文件及其摘要的形式发送到对象存储。

数据是如何逻辑组织的

可查询的数据分为可变缓冲区、读取缓冲区或对象存储。可变缓冲区是实时写入的地方。它针对写入进行了优化,但也可以进行查询。读取缓冲区是保留来自可变缓冲区或对象存储的数据块的地方,针对压缩和查询速度进行了优化。最后,对象存储是存储压缩格式的不可变数据块(Parquet文件)及其数据摘要的地方,以加快查询时间和缓存预热。

无论数据在可变缓冲区、读取缓冲区还是对象存储中,它都有一个描述其的连贯逻辑组织。查询应该适用于所有来源并在查询时组合。实时写入只能写入到可变缓冲区,然后可以将其转换为以Parquet文件及其摘要形式存储在对象存储中的不可变块,或者作为包含汇总统计数据的只读内存块保存在读取缓冲区中。

以下是一个示例,说明了在按天定义分区的情况下数据的逻辑组织方式

在InfluxDB IOx中设置的时间序列数据的逻辑组织方式<figcaption>在InfluxDB IOx中设置的时间序列数据的逻辑组织方式</figcaption>

分区通过其分区键定义,该键是写入每行数据时生成的字符串。分区的作用是在数据写入数据库或复制到其他服务器时分离数据。分区键可以使用表名(度量)、列值(标签或字段)或时间列或任何具有时间数据类型的列的格式化时间字符串的任何组合。

数据块是一组数据。一个数据块中的所有行都具有相同的分区键值。它们由包含在其中的表、其模式和其汇总统计(最小值、最大值、计数)定义。数据块对于缓冲数据很有用,以后可以将它们更改为不可变,以便将它们移动到读取缓冲区或对象存储。

在一个分区内部,数据块具有单调递增的标识符。这里的目的是帮助确定数据写入的顺序,如果稍后的写入覆盖了一个分区中较旧数据块的数据,则会这样做。InfluxDB IOx在与对象存储交互时遵循单写多读的语义。这意味着InfluxDB IOx服务器可以在没有分布式协调的情况下写入并确保数据块顺序。然而,分区可以分散到多个写者。

虽然上图中的示例具有互斥的分区键,但这不是严格的要求。生成分区键的规则可能会随时间变化,并且可能因服务器而异。

管理数据移动到对象存储

当数据写入InfluxDB IOx时,它将落在WAL缓冲区或可变缓冲区中。WAL缓冲区不可查询,仅用于缓冲数据库的写入和修改。此缓冲区在处理数据大致到达时的订阅请求或作为将数据缓冲到WAL段的方式很有用,该段随后写入对象存储。

每个InfluxDB IOx服务器都有一个唯一的标识符,该标识符用作写入对象存储的任何文件的路径前缀。这种设计使得InfluxDB IOx与对象存储的交互具有单写多读的语义。这意味着写者无需进行任何协调即可进行工作,并且可以根据需要扩展读取器,而无需影响或与写者管道交互。

可变缓冲区可用于处理查询负载,或作为写入数据的中转区域,直到它被滚动并转换为对象存储或读取缓冲区的块。

操作员可以通过API调用或基于配置来控制此数据移动。配置可以指定基于以下一个或多个条件的滚动事件和对象存储传输:

  • 行数(或WAL条目数)
  • 字节大小(达到此数字后滚动)
  • 自首次写入以来经过的时间(X时间后在此段或块中打开时滚动)

在WAL缓冲区中,滚动将简单地创建下一个段号,并让新的段接受传入的WAL条目。刚刚滚动的段可以复制到对象存储中。操作员可以定义何时删除旧的WAL段。这可以由请求触发,由时间(过时旧段)触发,或者基于当段完全被已持久化到对象存储的块捕获时。

在可变缓冲区中,滚动将当前打开的给定分区内的块转换为只读。如果在此之后对该分区有写入请求,将创建具有下一个ID的新块。一旦较旧的块变为只读,它就可以以Parquet文件的形式写入对象存储,并且其摘要可以转换为读取缓冲区。如果转移到读取缓冲区,从可变缓冲区块到读取缓冲区块的切换是原子的,这样查询只会击中一个或另一个。

尽管可变缓冲区和对象存储中的数据按分区组织,但WAL存在于整个逻辑数据库中。对不同分区的写入将落在同一个WAL中,该WAL的滚动与可变缓冲区中分区的块旋转时间无关。

总结

目前大部分工作正在进行中。本文博客的细节是从我们正在工作的内部设计文档中提取的。我们还没有生产InfluxDB IOx的版本,因为还有很多工作要做。我们的目标是于2021年2月初提供alpha版本和文档。我们将随着工作的进行,更多地撰写有关InfluxDB IOx的设计选择。

如果您对随着发展的更多细节感兴趣,请加入我们,于2021年1月13日星期三上午8点太平洋时间参加下一场每月InfluxDB IOx技术讲座和社区办公时间。如果您错过了上周的InfluxDB IOx技术讲座,请点击此处观看录像