Database 具有多列聚合的Timeseries数据库

Database 具有多列聚合的Timeseries数据库,database,time-series,amazon-rds,druid,riak-ts,Database,Time Series,Amazon Rds,Druid,Riak Ts,我正试图设计一个具有时间序列数据的系统。以下是系统的要求: 数据随时从多个城市和部门进入系统 这些个人记录应终身可用。(可选) 大多数查询都是聚合。但是,它们发生在多个列上。示例查询: 特定城市特定日期的所有测量值之和 一个部门(上一个)月内所有测量值的总和 某个城市某个部门上周所有测量值的总和 某一州某一天所有测量值的总和(该州也将成为记录的一部分) 所有查询的计算应具有非常低的延迟(=前一周和datetime

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

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

  • 我浏览了多个时间序列数据库。据我所知,它们都需要昂贵的硬件。我想知道是否有一种方法可以在商品硬件上运行它
  • 我不确定一开始会有多少数据可用。理想情况下,峰值(每天)约为100 MB。所以,我不愿意一开始就花几百美元
  • 我一直在考虑的另一个想法是拥有一个AmazonRDS实例,在不同的列上有多个索引,并根据需要聚合它们。但我不确定这是否是个好主意
你可以试试阿库穆利(警告:我是作者)。 Akumuli可以非常快地执行聚合(亚毫秒),因为它是一个面向列的数据库,它会为您预计算一些聚合。并且它可以执行您需要的所有查询,例如,如果您的序列如下所示:

${measurement_name} city=${city_name} dept=${department_name} state=${state_name}
实际数据如下所示(例如,这是以瓦特为单位测量的功耗数据):

您可以使用此查询聚合带有
dept=1
dept=2
标记的所有数据:

{
    "aggregate": { "W": "sum" },
    "range": { "from": "20170501T000000",
               "to": "20170502T000000" },
    "group-by": [ "dept" ],
    "where": { "dept": [1, 2] }
}
您将获得每个部门的金额,但仅包括部门1和部门2

您可以按城市划分:

{
    "aggregate": { "W": "sum" },
    "range": { "from": "20170501T000000",
               "to": "20170502T000000" },
    "group-by": [ "city" ],
}
您将获得每个城市名称的总和(一个城市中的所有部门都将加入)。当然,您可以使用
where
子句按标记进行筛选

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

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

您将为巴黎-阿肯色州获得一个值,为巴黎-爱荷华州获得另一个值。

您概述的聚合相当标准。很难找到一个不支持它们的数据库

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

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
其中datetime>=前一周和datetime<当前周
有关其他示例,请参阅

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

披露:我为Axibase工作

WHERE datetime >= previous_week AND datetime < current_week