【问题标题】:How do I find latest item for timeseries data?如何找到时间序列数据的最新项目?
【发布时间】:2021-02-22 00:19:54
【问题描述】:

例如,有诸如根分区利用率之类的时间序列数据。数据结构如下:

name: root_disk_utilizatoin
ip: 1.1.1.1
timestamp: 1234567890
value: 0.5

我们有数百万台服务器每隔几分钟就会报告这些数据。 我的期望是找到每台服务器的最新数据。

第一个想法是将这些时间序列数据存储在一些存储中,例如 elasticsearc 或 tsdb(influxdb/opentsdb)。然后查询存储以获取结果。但我担心性能。无论我选择什么存储,他们都必须执行以下两个步骤来归档结果。

  1. 按 ip 分组数据
  2. 按时间戳对数据进行排序并返回最新的数据

我想这将是一个非常昂贵的过程(花费很多时间)。

所以我想这可能不是一个好主意。

  • 您是否有类似的需求以及如何解决?
  • 对于像 influxdb 这样的 timeseries db 会不会有问题?

【问题讨论】:

  • 必须先指定数据输入的速率?然后根据输入速率和查询类型,决定哪些数据库可以处理您的任务。也许 apache cassandra 适合你。

标签: database elasticsearch time-series data-analysis


【解决方案1】:

您可以将terms aggregationmax aggregation 结合使用

添加一个包含索引数据、搜索查询和搜索结果的工作示例

索引数据:

{
  "name": "root_disk_utilizatoin",
  "ip": "1.1.1.2",
  "timestamp": 1234567891,
  "value": 0.5
}
{
  "name": "root_disk_utilizatoin",
  "ip": "1.1.1.1",
  "timestamp": 1234567890,
  "value": 0.5
}

搜索查询:

    {
  "size":0,
  "aggs": {
    "unique_id": {
      "terms": {
        "field": "ip.keyword",
        "order": {
          "latestOrder": "desc"
        },
        "size":1
      },
      "aggs": {
        "latestOrder": {
          "max": {
            "field": "timestamp"
          }
        }
      }
    }
  }
}

搜索结果:

"aggregations": {
    "unique_id": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 1,
      "buckets": [
        {
          "key": "1.1.1.2",
          "doc_count": 1,
          "latestOrder": {
            "value": 1.234567891E9
          }
        }
      ]
    }

【讨论】:

  • OP 说“每隔几分钟就有数百万台服务器报告”......具有数百万桶的术语聚合的构建成本很高
  • 是的@Val,这将是一个昂贵的解决方案,但 OP 也想要group data by ip,据我所知,它只能通过术语聚合来实现。还有其他方法可以实现吗?
  • 在这种情况下,我可能会利用 composite 聚合(使用 terms 源),这样 OP 可以有效地对结果进行分页...
  • 他没有决定要使用什么数据库。在谈到大数据时,他不知道 mysql 已经出局了。 :))
  • @Kramer Li 你有机会看一下我的回答吗,期待得到你的反馈:)
猜你喜欢
  • 1970-01-01
  • 2022-11-14
  • 2016-08-29
  • 2020-09-26
  • 1970-01-01
  • 2012-01-08
  • 1970-01-01
  • 2012-02-19
  • 2020-04-15
相关资源
最近更新 更多