-1

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

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

以下是我的限制:

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

2 回答 2

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 和部门 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" ],
}

您将获得 Paris Arkansas 的一个值和 Paris Iowa 的另一个值。

于 2017-05-03T06:38:55.790 回答
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 文档

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

披露:我为 Axibase 工作。

于 2017-05-04T06:40:53.420 回答