在组织 InfluxDB 数据库时,这两种方法中的哪一种最受青睐?

Posted

技术标签:

【中文标题】在组织 InfluxDB 数据库时,这两种方法中的哪一种最受青睐?【英文标题】:When organising an InfluxDB database, which of these two approaches would be most preferred? 【发布时间】:2020-09-12 06:56:09 【问题描述】:

我正在尝试决定如何在 InfluxDB 数据库中组织测量(我相信他们称之为 schema design and data layout),但我认为这可能是一个更一般的数据库类型问题。

让我们举个简单的例子,我在两个位置测量两个量,温度湿度(想象一下,我知道!),客厅 外面

InfluxDB 有 syntax 用于插入数据点:

测量tag_key=tag_value field_key=field_value

因此有两个明显的(至少对我而言)选项。简而言之,第一个选项会像这样插入一个数据点:

INSERT temperature,location=outside value=15
INSERT humidity,location=outside value=50

而第二个选项会这样做:

INSERT sensor_measurements,location=outside temperature=15,humidity=50

我的问题更高级:

是否有首选/接受的方法来解决这个问题? 如果我尝试将其扩展到更多数量/位置/数据类型,我会遇到其中任何一个问题吗? 如果我稍后尝试在 Grafana 中绘制这些东西,或者如果我稍后尝试实现许多 InfluxQL functions 中的一些,这两种方法是否提供优势? 有人对此有什么一般性建议吗?

我自己的想法:

在我看来,选项 1 更像是 InfluxDB 描述“测量”所暗示的内容。温度和湿度都是独立的量。但是仅仅将其称为“价值”似乎有点笨拙。

选项 2 似乎具有湿度和温度共享完全相同的时间戳的优点。这将很有用,例如,如果我想将数据导入其他软件并在两个数量之间进行关联,这意味着我不必进行任何插值或分箱来使它们匹配。

我不确定选项 2 是否只是一个名为 sensor_measurements 的通用测量值是否是一个坏主意,并且以后很难维护。

详细说明:


选项 1

温度湿度各有一个单独的“测量”,使用位置作为“标签”,只需命名“字段”作为

在时间t1,插入数据:

INSERT humidity,location=outside value=50
INSERT temperature,location=outside value=15
INSERT humidity,location=living_room value=65
INSERT temperature,location=living_room value=28

在时间t2,插入一些不同的数据:

INSERT humidity,location=outside value=50
INSERT temperature,location=outside value=15
INSERT humidity,location=living_room value=65
INSERT temperature,location=living_room value=28

然后我可以通过查询以下内容来获取客厅温度:

> SELECT value FROM temperature WHERE location='living_room'

name: temperature
time                value
----                -----
1590416682017481091 28
1590416723963187592 29

我也可以使用group by function 来做这样的事情:

SELECT value FROM temperature GROUP BY "location"

选项 2

有一个名为 sensor_measurements 的组合“测量”,例如,为 location 使用一个“标签”,然后为每个 使用单独的“字段”温度湿度

在时间t1,插入数据:

INSERT sensor_measurements,location=outside temperature=15,humidity=50
INSERT sensor_measurements,location=living_room temperature=28,humidity=65

在时间t2,插入一些不同的数据:

INSERT sensor_measurements,location=outside temperature=14,humidity=56
INSERT sensor_measurements,location=living_room temperature=29,humidity=63

我现在可以通过以下查询获得客厅温度:

> SELECT temperature FROM sensor_measurements WHERE location='living_room'

name: sensor_measurements
time                temperature
----                -----------
1590416731530452068 28
1590416757055629103 29

我现在可以使用group by function 执行以下操作:

SELECT temperature FROM sensor_measurements GROUP BY "location"

【问题讨论】:

【参考方案1】:

我会使用提供的选项中的选项 2,因为更少的记录 = 更少的资源 = 更好的查询响应时间(理论上)。一般来说,这两种方法看起来都不错。

但我会在现实世界中使用更通用的第三个选项。带有标签metric,location 和字段value 的单个通用metrics 测量:

INSERT metrics,metric=temperature,location=outside value=15
INSERT metrics,metric=humidity,location=living_room value=50
INSERT metrics,metric=temperature,location=living_room value=28
INSERT metrics,metric=humidity,location=living_room value=65

这让我有机会创建单个通用 Grafana 仪表板,用户可以在其中选择通过仪表板变量(直接从 InfluxDB 生成,例如SHOW TAG VALUES WITH KEY = "metric")选择可视化指标/位置。任何新插入的指标(例如“照度”、“压力”、“风速”、“风向”……)或位置都可以在这个通用仪表板中立即可视化。最终,一些指标可能还有额外的标签。这很好,我将能够使用 ad-hoc Grafana 变量,因此用户将能够动态指定任意数量的键/值过滤器。 Grafana doc.

【讨论】:

谢谢,这很有趣 - 我不会考虑这样做。 Grafana 模板是我将阅读的更多内容 - 它看起来是一个非常有用的功能。我想我唯一犹豫的是,InfluxDB 用户指南中的大多数示例都与选项 1 类似,并且他们似乎建议将各个指标名称用于“测量”名称。如果存在现有标准,我不想不遵循现有标准。谢谢你的回答。 @teeeeee 恕我直言,文档使用选项 1,因为 telegraf(来自 InfluxData 的另一个数据收集项目)。它将所有指标写入measurement,默认基于插件名称,因此cpu指标将在cpu measure中,等等。 我明白了。所以在那个例子中,Telegraf 使用测量名称“cpu”,你会保留它吗?或者您会将其更改为您的答案中给出的格式,即 measurement = metrics, metric = cpu, etc ?如果答案是“保留原始 Telegraf 格式”,那么在限制您的 Grafana 模板选择方面是否会产生同样的问题? @teeeeee 这是基于意见的问题。在这种情况下,我会使用 telegraf 默认选项,因为已经为默认的 telegraf 行为准备了许多 Grafana 就绪仪表板。 抱歉,我一直等到赏金结束才看是否还有贡献。谢谢你的回答 - 我现在已经接受了。

以上是关于在组织 InfluxDB 数据库时,这两种方法中的哪一种最受青睐?的主要内容,如果未能解决你的问题,请参考以下文章

一种每隔 X 秒将 localhost 中的 InfluxDB 数据在线复制到 InfluxDB 的方法?

在influxdb中查询时如何写case?

特征点法,光流法,这两种方法在图像点跟踪中的实现

C#堆栈和队列

为啥这两种方法不一样? [关闭]

InfluxDb 中的系列和存储桶是啥