在DynamoDB中存储不同分辨率的时间序列数据

时间:2018-06-28 17:49:27

标签: amazon-dynamodb

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

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

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

我不确定每个新的决议是否应该有自己的表data_30mindata_1hr等,或者更好的方法是否类似于将决议与设备ID组合在一起以构成复合哈希密钥并将所有汇总数据存储在一个表中。

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

这两种方法各有利弊,有没有我认为哪种解决方案在这种情况下有用?

谢谢。

1 个答案:

答案 0 :(得分:0)

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

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

生成预聚合并将其存储在DynamoDb中当然可以,但是您绝对应该考虑为要支持的不同粒度使用单独的表。当心变异数据。只要您的所有数据都按顺序到达并且不需要重新计算旧数据,则存储预先汇总的时间序列就可以了,但是如果数据会发生突变,或者您必须考虑乱序/迟到的数据事情就变得复杂了。

您还可以考虑使用关系数据库来存储“热”数据(例如,过去7天或有意义的任何时间段),然后运行批处理过程以预聚合并将数据移动到冷的只读数据中DynamoDB表,带有DAX等。