【问题标题】:InfluxDB performanceInfluxDB 性能
【发布时间】:2015-04-24 22:07:05
【问题描述】:

就我而言,我需要为设备捕获 15 个性能指标并将其保存到 InfluxDB。每个设备都有一个唯一的设备 ID。

Metrics 通过以下方式写入 InfluxDB。这里我只展示一个作为例子

new Serie.Builder("perfmetric1")
    .columns("time", "value", "id", "type")
    .values(getTime(), getPerf1(), getId(), getType())
    .build()

写入数据既快速又简单。但是当我运行查询时,我发现性能很差。我正在尝试获取过去一小时的所有 15 个指标值。

select value from perfmetric1, perfmetric2, ..., permetric15
where id='testdeviceid' and time > now() - 1h

一个小时内,每个指标有 120 个数据点,总共有 1800 个数据点。在 c4.4xlarge EC2 实例空闲时,查询大约需要 5 秒。

我相信 InfluxDB 可以做得更好。这是我的架构设计的问题,还是其他问题?将查询拆分为 15 个并行调用会更快吗?

【问题讨论】:

    标签: time-series influxdb


    【解决方案1】:

    正如@valentin 回答所说,您需要为 InfluxDB 的 id 列构建索引以有效地执行这些查询。

    在 0.8 稳定版中,您可以使用 continuous fanout queries 执行此“索引”。例如,以下连续查询会将您的perfmetric1 系列扩展为perfmetric1.id 形式的多个系列:

    select * from perfmetric1 into perfmetric1.[id];
    

    稍后你会这样做:

    select value from perfmetric1.testdeviceid, perfmetric2.testdeviceid, ..., permetric15.testdeviceid where time > now() - 1h
    

    此查询将花费更少的时间来完成,因为 InfluxDB 不必执行时间序列的完整扫描来获取每个 testdeviceid 的分数。

    【讨论】:

      【解决方案2】:

      在 id 列上建立索引。似乎他的引擎对表使用全扫描来检索数据。通过将查询拆分为 15 个线程,引擎将使用 15 次全扫描,性能会差很多。

      【讨论】:

      • 感谢您的快速回复!我对 InfluxDB 还很陌生,基本上只是在试验。这一切都说得通。我有点惊讶,因为这似乎是一个非常常见的用例。标签索引是 0.9.0 版本的新功能 - 我目前正在运行稳定的 0.8.8。 “为了启用标签和对特定列值的快速查找等功能,我们将添加对列索引的支持。这是跟踪列索引的问题。”
      • 该软件处于 alpha 开发状态,因此缺少很多东西和很多错误
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多