时间序列数据、基数与InfluxDB

导航到

什么是基数?

在数据库的世界里,基数指的是数据库中存储的唯一数据集的数量。如果我们再深入一点,可以将基数视为表列或数据库中可能存在的唯一值的总数。

当考虑时间序列数据时,我们可以就基数提出一些具体问题。实践中的基数是什么样的?何时基数会成为一个问题?我们如何预防基数问题?

本文将探讨这些问题,并更多。我们将分析基数问题的根源,并最终讨论InfluxDB的IOx数据库引擎如何解决时间序列数据的基数问题。

InfluxDB中的基数

为了了解基数问题是如何产生的,我们首先需要了解InfluxDB数据模型,称为行协议

行协议有四个组成部分

  1. 度量:这相当于关系数据库中的表。
  2. 标签:这些是元数据,由键值对组成,用于上下文化您的数据。InfluxDB索引标签,标签值可以是字符串。
  3. 字段:字段是您收集的实际数据点的键值对。字段可以是整数、浮点数、字符串或布尔值。
  4. 时间戳

在InfluxDB中,每个唯一的测量和标签集组合创建一个系列。如果您有很多这样的唯一组合,那么您的数据集就具有高基数。现在,重要的是要记住,高基数本身并不是一个问题。

您可能有很多测量/标签组合的原因是因为您的标签值包含无界数据。

让我们看一个例子。在一个传统的网络监控用例中,假设我们在监控一些服务器机架。我们希望识别服务器的地理位置,所以我们可能会得到一个类似这样的标签:location=CA1。我们还需要跟踪每个单独的服务器机箱,包括与每个单元关联的唯一IP地址。如果我们有一个标签键ip,标签值可以是1.1.1.11.1.0.1,结果是键值对ip=1.1.1.1ip=1.1.0.1等。每个唯一的标签值都可能创建一个新的测量/标签集组合,从而增加数据集的基数。

那么这有什么意义呢?InfluxDB的TSM引擎将系列键存储在内存索引中,并定期持久化到磁盘。因此,您的硬件决定了您的基数阈值,因为一旦磁盘填满,它就会对数据库性能产生负面影响。

模式和基数

为了避免基数问题,有必要考虑您的数据模式。

现在,InfluxDB是一个写入时模式数据库。这意味着在将数据放入InfluxDB之前,您不必创建结构化模式。如果您的数据遵循行协议,InfluxDB会自动创建模式。如果您在流程中引入了新的设备/传感器/源,它带来了新的标签或字段键,InfluxDB会自动调整模式以包含新数据。

这有点讽刺,因为一个在数据形状方面具有如此灵活性的数据库迫使您考虑基数。然而,这与关系型数据库和其他数据库非常不同,这些数据库要求用户在写入数据之前定义模式。在这些解决方案中,如果数据形状发生变化,更新模式可能是一个大麻烦。

但是,如果您想调整InfluxDB中的模式,那会是什么样子呢?好吧,这通常归结为您将哪些值分配为标签,以及将哪些值分配为字段。如上所述,标签值仅是字符串类型。如果您有生成无界标签值的数据,这将导致高基数。一些用例,如跟踪和日志,往往会产生这种类型的高基数数据。

同时,您可能不希望将标签值更改为字段值。那么怎么办呢?

解决基数问题

InfluxDB一直处理度量值很好,但由于基数问题,像跟踪这样的用例可能成功也可能失败。InfluxDB的TSM引擎将每个系列存储在磁盘上的一个列中。为了将InfluxDB打开到全范围的时间序列用例,我们重建了核心数据库引擎。

我们构建了InfluxDB,它以IOx作为列式数据存储,使用各种开源工具(例如Apache ArrowApache Parquet等)来设计一个能够处理大量、高基数时间序列数据的数据库,而不会影响性能。与将每个序列存储在列中不同,IOx引擎将每个标签和字段存储为列。这显著减少了总列数,从而提高了性能。

有了这种新技术作为InfluxDB的支撑,用户现在可以期待在各种时间序列工作负载中保持一致的性能,无论是处理指标、原始事件数据、跟踪还是日志。

在IOx引擎中,仍然需要考虑一些模式问题,但围绕它们的根本问题要简单得多:你的模式是否太宽或太稀疏?

宽模式有很多列,这可能影响性能。这也是最初基数问题的根本原因。为了确保查询保持高性能,InfluxDB IOx存储引擎对每个度量限制为200列。对于宽模式的快速修复是将数据分割成多个度量。例如,如果你正在从工厂中的机器收集数据,而不是将整个工厂地面的所有数据都放入一个度量中,为每台机器创建一个度量。

稀疏模式是指许多行都包含空值。这迫使查询引擎在执行时评估所有这些空列,给存储和查询数据增加了不必要的开销。

结论

长期以来,基数一直是InfluxDB的“脚趾上的石头”。当然,它仍然可以运行,但并不像它本可以那样舒适。随着InfluxDB IOx引擎的出现,性能成为重点,随着基数不再是以前那样的问题,InfluxDB可以实时处理和分析大量工作负载。

因此,无论你是经验丰富的InfluxDB专家,还是刚刚开始接触它,尝试新的InfluxDB IOx引擎看看它如何加速你的“酷炫”速度。