Amazon web services DynamoDB模式设计

Amazon web services DynamoDB模式设计,amazon-web-services,schema,amazon-dynamodb,nosql,Amazon Web Services,Schema,Amazon Dynamodb,Nosql,我正在考虑将Amazon AWS DynamoDB用于我正在进行的一个项目。以下是情况的要点: 我将收集数百台机器的大量能源使用数据(能源读数大约每5分钟采集一次)。每台机器都在一个区域中,每个区域都在一个网络中 然后,我将按区域、网络、时间和日期汇总这些单独的读数 我的想法是,通过这样做,我将能够在network\u day表上对DynamoDB执行一次查询,并快速返回任何给定日期的能源使用情况 这是我在这一点上的模式: table_name | hash_key | range

我正在考虑将Amazon AWS DynamoDB用于我正在进行的一个项目。以下是情况的要点:

我将收集数百台机器的大量能源使用数据(能源读数大约每5分钟采集一次)。每台机器都在一个区域中,每个区域都在一个网络中

然后,我将按区域、网络、时间和日期汇总这些单独的读数

我的想法是,通过这样做,我将能够在
network\u day
表上对DynamoDB执行一次查询,并快速返回任何给定日期的能源使用情况

这是我在这一点上的模式:

table_name      | hash_key   | range_key  | attributes
______________________________________________________
machine_reading | machine.id | epoch      | energy_use
machine_hour    | machine.id | epoch_hour | energy_use
machine_day     | machine.id | epoch_day  | energy_use
zone_hour       | machine.id | epoch_hour | energy_use
zone_day        | machine.id | epoch_day  | energy_use
network_hour    | machine.id | epoch_hour | energy_use
network_day     | machine.id | epoch_day  | energy_use
当我运行rollup cronjob时,我并没有立即在测试中看到这么好的性能,所以我只是想知道是否有经验丰富的人可以对我的密钥设计发表评论?到目前为止,我唯一的经验是使用RDS,但我非常想了解DynamoDB

编辑:

我用于汇总的cronjob的基本结构:

foreach网络
foreach区
foreach机器
将未处理的读数添加到发电机()中
卷轴固定装置到发电机的时间()
滚动固定装置到发电机的天数()
终止
滚动区域小时到发电机()
滚动区域天数到发电机()
终止
向上滚动网络小时到发电机()
向上滚动网络天数到发电机()
终止
我在Dynamo中使用上一个函数的值进行下一次汇总,即

  • 我使用区域小时数汇总区域天数
  • 然后我使用区域天数进行汇总 网络日

这就是(我认为)导致大量不必要的读/写的原因。现在我可以处理低吞吐量,因为我的样本量只有100个读数。我关心的是,当它扩展到预期包含9000000个读数时。

您正在使用的表上配置的吞吐量是多少?你是如何进行汇总的?您是否正在阅读所有内容并过滤/过滤范围键等

在这种情况下,是否需要卷起/卷起cron作业

为什么不用一张表格来记录读数呢 机器读取|机器id |历元|时间戳|能源|使用

和一个汇总表 哈希键可以是聚合类型,范围键可以是聚合名称 例子: 分区,分区1 分区,分区3 日期:1940年3月29日

获取机器数据时,将其转储到第一个表中,然后使用原子计数器增加第二个表中的实体:

您正在使用的表上配置的吞吐量是多少?你是如何进行汇总的?您是否正在阅读所有内容并过滤/过滤范围键等

在这种情况下,是否需要卷起/卷起cron作业

为什么不用一张表格来记录读数呢 机器读取|机器id |历元|时间戳|能源|使用

和一个汇总表 哈希键可以是聚合类型,范围键可以是聚合名称 例子: 分区,分区1 分区,分区3 日期:1940年3月29日

获取机器数据时,将其转储到第一个表中,然后使用原子计数器增加第二个表中的实体:

首先,DynamoDB中的时间序列数据很难正确处理,但并非不可能

DynamoDB使用散列键来分割数据,因此使用machine.id意味着你们中的一些人将拥有热键。然而,这实际上是数据量和您期望的IOPS的函数。DynamoDB不会创建第二个碎片,直到您的读写IOPS超过1000。如果您希望远远低于该级别,则可以,但如果您希望扩展到该级别之外,则可能需要重新设计,特别是在哈希键中包含一个日期组件,以分解内容

关于性能,您是否达到了已配置的读或写吞吐量级别?如果是这样的话,把它们提升到一个疯狂的高度,重新运行测试,直到瓶颈变成你的代码。这可能是一个简单的方法,可以适当地设置吞吐量级别

然而,对于您的实际代码,如果没有看到您正在执行的实际DynamoDB查询,则可能会出现读取太多数据的问题。确保您从DynamoDB读取的数据不超过所需的数量。由于您的范围键是一个日期字段,请使用范围条件(而不是筛选器)来减少需要读取的记录数


确保代码使用多个线程执行汇总。如果您无法饱和DynamoDB配置的容量,那么问题可能不是DynamoDB,而是您的代码。通过并行使用多个线程执行汇总,您应该能够看到一些性能提升。

首先,DynamoDB中的时间序列数据很难正确执行,但并非不可能

DynamoDB使用散列键来分割数据,因此使用machine.id意味着你们中的一些人将拥有热键。然而,这实际上是数据量和您期望的IOPS的函数。DynamoDB不会创建第二个碎片,直到您的读写IOPS超过1000。如果您希望远远低于该级别,则可以,但如果您希望扩展到该级别之外,则可能需要重新设计,特别是在哈希键中包含一个日期组件,以分解内容

关于性能,您是否达到了已配置的读或写吞吐量级别?如果是这样的话,把它们提升到一个疯狂的高度,重新运行测试,直到瓶颈变成你的代码。这可能是一个简单的方法,可以适当地设置吞吐量级别

然而,对于您的实际代码,如果没有看到您正在执行的实际DynamoDB查询,则可能会出现读取太多数据的问题。确保您从DynamoDB读取的数据不超过所需的数量。由于您的范围键是一个日期字段,请使用范围条件(而不是筛选器)来减少需要读取的记录数

确保代码使用多个线程执行汇总。如果您无法使DynamoDB配置的容量饱和,则问题可能不会解决