具有多列聚合的时间序列数据库

时间:2017-05-03 03:39:21

标签: database time-series amazon-rds druid riak-ts

我正在尝试设计一个具有时间序列数据的系统。以下是系统的要求:

  • 数据随时从多个城市和部门进入系统。
  • 这些个人记录应该终身可用。 (可选)
  • 大多数查询都是聚合。但是,它们发生在多个列上。示例查询:
    • 特定城市特定日期所有测量值的总和
    • 部门(最后)月内所有测量的总和
    • 某个城市的(最后一周)所有测量值的总和
    • 州内某一天的所有测量值的总和(州也将成为记录的一部分)
  • 所有查询都应以非常低的延迟(<300-500 ms)计算

以下是我的约束:

  • 我浏览了多个时间序列数据库。根据我的理解,所有这些都需要昂贵的硬件。我想知道是否有办法在商品硬件上运行它。
  • 我不确定一开始会有多少数据可用。理想情况下,峰值(每天)约为100 MB。所以,我不愿意在开始时花费数百美元。
  • 我一直在考虑的另一个想法是拥有一个Amazon RDS实例并在各个列上有多个索引并根据需要聚合它们。我不确定这是不是一个好主意。

2 个答案:

答案 0 :(得分:1)

你可以尝试Akumuli(警告:我是作者)。 Akumuli可以非常快速地执行聚合(亚毫秒),因为它是一个面向列的数据库,它会为您预先计算一些聚合。它可以执行您需要的所有查询,例如如果你的系列看起来像这样:

${measurement_name} city=${city_name} dept=${department_name} state=${state_name}

实际数据看起来像这样(例如,这是以瓦特为单位测量的功耗数据):

W city=Jersey_City state=New-Jersey dept=1
W city=Jersey_City state=New-Jersey dept=2
W city=Paris state=Iowa dept=1
W city=Paris state=Iowa dept=2
W city=Texas state=Texas dept=1
W city=Texas state=Texas dept=3
W city=Paris state=Arkansas dept=1
W city=Paris state=Arkansas dept=2

您可以使用以下查询汇总dept=1dept=2代码的所有数据:

{
    "aggregate": { "W": "sum" },
    "range": { "from": "20170501T000000",
               "to": "20170502T000000" },
    "group-by": [ "dept" ],
    "where": { "dept": [1, 2] }
}

您将获得每个部门的总和,但只包括部门1和部门。

您可以按城市划分:

{
    "aggregate": { "W": "sum" },
    "range": { "from": "20170501T000000",
               "to": "20170502T000000" },
    "group-by": [ "city" ],
}

您将获得每个城市名称的总和(将加入一个城市的所有部门)。当然,您可以使用where子句按标签过滤。

如果您有多个同名城市(例如爱荷华州和阿肯色州的巴黎),您可以按城市和州分组价值:

{
    "aggregate": { "W": "sum" },
    "range": { "from": "20170501T000000",
               "to": "20170502T000000" },
    "group-by": [ "city", "state" ],
}

您将获得巴黎阿肯色州的一个价值和巴黎爱荷华州的另一个价值。

答案 1 :(得分:0)

您概述的汇总是相当标准的。很难找到不支持它们的数据库。

您可以尝试Axibase TSD。它可以在用户定义的时区中有效地计算具有多个维度的日历聚合(例如,每日总计)。如果您收集的指标是由最终用户活动驱动的,那么这将非常有用:

SELECT date_format(time, "yyyy-MMM-dd", "US/Eastern"), 
  entity AS 'city', SUM(value)
FROM "email.active_sessions"
  WHERE datetime >= current_year
  AND entity.tags.state = 'PA'
GROUP BY entity, PERIOD(1 DAY, "US/Eastern")

可以使用扩展的关键字/功能方便地指定间隔。以下是'(最后)周'的情况:

WHERE datetime >= previous_week AND datetime < current_week

有关其他示例,请参阅SQL docs

ATSD可在大多数Linux发行版上运行,并且可以在独立模式和分布式模式下执行。

披露:我为Axibase工作。