【问题标题】:Storing Time-Series Data of different resolution in DynamoDB在 DynamoDB 中存储不同分辨率的时间序列数据
【发布时间】:2018-06-28 17:49:26
【问题描述】:

我想知道是否有人知道在 DynamoDB 中存储不同时间分辨率的时间序列数据的好方法。

例如,我的设备每 30 秒向 DynamoDB 发送一次数据。各个读数存储在一个表中,其中唯一的设备 ID 作为哈希键,时间戳作为范围键。

我想使用 lambda 以不同的时间步长(30 分钟、1 小时、1 天等)聚合这些数据,并将聚合结果存储在 DynamoDB 中。然后,我希望能够获取任何特定时间范围内的任何分辨率数据,例如过去 24 小时的 48 个 30 分钟聚合,或者去年这个月的每个每日聚合。

我不确定每个新分辨率是否应该有自己的表,data_30mindata_1hr 等,或者是否更好的方法是通过将分辨率与设备 ID 组合并存储所有聚合来制作复合哈希键单个表中的数据。

例如,如果设备 ID 为 abc123,则所有 30 分钟数据都可以使用哈希键 abc123_30m 存储,而 1 小时数据可以使用 HK abc123_1h 存储,并且每个数据仍将使用时间戳作为范围键。

这些方法各有哪些优缺点?有没有我想不出的解决方案在这种情况下有用?

提前致谢。

【问题讨论】:

    标签: amazon-dynamodb


    【解决方案1】:

    我不确定您是否从有关 Best Practices for storing time series data in DynamoDB 的技术文档中看到此页面。它谈到将您的数据拆分为多个时间段,这样您只有一个正在写入的“热”表和许多您只能从中读取的“冷”表。

    关于主键/排序键的选择,您可能应该使用粗略的时间戳值作为主键,使用实际时间戳作为排序键。否则,如果您的周期足够粗略,或者每个设备只产生相对少量的数据,那么您使用设备 ID 作为哈希键的想法也可以工作。

    在 DynamoDb 中生成预聚合和存储肯定会起作用,但您绝对应该考虑为要支持的不同粒度设置单独的表。谨防变异数据。只要您的所有数据都按顺序到达并且您不需要重新计算旧数据,那么存储预先聚合的时间序列就可以了,但是如果数据可以变异,或者您必须考虑无序/迟到的数据那么事情就变得复杂了。

    您还可以考虑为“热”数据(即最近 7 天,或任何有意义的时间段)建立一个关系数据库,然后运行批处理来预聚合数据并将其移动到冷的只读数据中DynamoDB 表,带有 DAX 等。

    【讨论】:

      猜你喜欢
      • 2016-10-31
      • 2017-11-22
      • 2014-02-16
      • 2014-07-05
      • 2013-11-14
      • 2011-01-02
      • 2013-08-15
      • 1970-01-01
      相关资源
      最近更新 更多