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



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

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

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

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

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

这些方法中的每一种都有哪些优点和缺点,是否有我不认为在这种情况下有用的解决方案?

提前谢谢。

我不确定您是否在技术文档中看到了有关在 DynamoDB 中存储时间序列数据的最佳实践的此页面。它谈到将数据拆分为时间段,以便您只有一个正在写入的"热"表和许多仅从中读取的"冷"表。

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

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

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

最新更新