【问题标题】:using one tag per value in influxdb在 influxdb 中每个值使用一个标签
【发布时间】:2020-02-20 15:36:32
【问题描述】:

我正在阅读一些遗留代码,我发现 influxdb 中的所有插入都是以这种方式完成的(此处为简化代码):

influxDB.write(Point.measurement(myeasurement)
  .time( System.currentTimeMillis(), TimeUnit.MILLISECONDS)
  .addField("myfield", 123)
  .tag("rnd",String.valueOf(Math.random() * 100000)))
  .build())

你可以猜到,标签“rnd”的标签值对于每个值都是不同的,这意味着我们可以有 100k 个不同的标签值。实际上,现在我们的值比这要少,所以我们最终应该为每个值拥有一个不同的标签值......

我不是 influxdb 方面的专家,但我的理解是 influxdb 使用标签将相关值组合在一起,例如其他工具中的分区或分片。 100k 个标签值似乎很多...

真的有我想的那么可怕吗?或者这种插入有没有可能对某些东西有用?

编辑:我刚刚意识到 Math.random()* 是双精度数,所以 * 100000 是没用的。作为 String.valueOf()。实际上,每个值在数据库中有一个系列,我无法想象这怎么可能是一件好事:(

【问题讨论】:

  • 长话短说:我也不是。如果它是 UUID,我可以看到一些(异国情调的)用例。但是用一个简单的随机值,串通的几率就很高。

标签: influxdb


【解决方案1】:

这是不好的和不必要的。
不必要,因为您写入 influxdb 的每个点都由其时间戳 + 一组应用标签值唯一标识。
不好,因为每组标签值都会创建一个单独的系列。 Influxdb 为该系列保留一个索引。每个数据点都有一个唯一的标签值会增加您的系统资源需求并减慢数据库的速度。除非您没有那么多数据点,否则您实际上并不需要时间序列数据库,或者根本不在乎。

正如 OP 所说。标签用于分组或过滤。
这里有一些关于这个主题的好读物
https://docs.influxdata.com/influxdb/v1.7/concepts/tsi-details/
https://www.influxdata.com/blog/path-1-billion-time-series-influxdb-high-cardinality-indexing-ready-testing/

根据文档,upper bound [for series or unique tag values] is usually somewhere between 1 - 4 million series depending on the machine used. 很容易成为一天的高分辨率数据。

【讨论】:

    猜你喜欢
    • 2021-02-11
    • 2017-10-01
    • 2020-08-08
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-27
    相关资源
    最近更新 更多