DynamoDB架构设计

时间:2015-06-19 12:55:16

标签: amazon-web-services schema amazon-dynamodb nosql

我正在考虑将Amazon AWS DynamoDB用于我正在处理的项目。以下是这种情况的要点:

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

然后,我将按区域和网络按小时和日期汇总这些个人读数。

我的想法是,通过这样做,我将能够在network_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

当我运行汇总cronjob时,我没有立即在测试中看到那么好的表现,所以我只是想知道有经验的人是否会评论我的关键设计?到目前为止,我唯一的经验是使用RDS,但我非常想了解DynamoDB。

修改

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

foreach network
  foreach zone
    foreach machine
      add_unprocessed_readings_to_dynamo()
      roll_up_fixture_hours_to_dynamo()
      roll_up_fixture_days_to_dynamo()
    end
    roll_up_zone_hours_to_dynamo()
    roll_up_zone_days_to_dynamo()
  end
  roll_up_network_hours_to_dynamo()
  roll_up_network_days_to_dynamo()
end

我使用Dynamo中的前一个函数值进行下一次汇总,即

  • 我使用区域小时来推广区域日期
  • 然后我使用区域日来汇总 网络日

这就是(我认为)导致大量不必要的读/写操作。现在我可以管理低吞吐量,因为我的样本量只有100个读数。当这个问题扩展到预计包含大约9,000,000个读数的时候,我的担忧就开始了。

2 个答案:

答案 0 :(得分:3)

首先,DynamoDB中的时间序列数据很难做到,但并非不可能。

DynamoDB使用散列键来分割数据,因此使用machine.id意味着你们中的一些人将拥有热键。但是,这实际上取决于数据量以及您对IOPS的期望。在推送超过1000读取或写入IOPS之前,DynamoDB不会创建第二个分片。如果你希望远远低于这个水平,你可能会很好,但如果你希望扩展到那个以上,那么你可能想要重新设计,特别是在你的哈希键中包含一个日期组件来分解。

关于性能,您是否达到了预配置的读取或写入吞吐量水平?如果是这样,将它们提升到一个疯狂的高水平并重新运行测试,直到瓶颈成为您的代码。这可能很简单,因为适当地设置吞吐量水平。

但是,对于您的实际代码,如果没有看到实际的DynamoDB查询,您执行的可能问题就是读取太多数据。确保您没有从DynamoDB中读取比您需要的更多数据。由于您的范围键是日期字段,因此使用范围条件(不是过滤器)来减少您需要读取的记录数。

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

答案 1 :(得分:1)

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

在这种情况下你需要卷起一份cron工作吗?

为什么不使用表格来读数 machine_reading | machine.id | epoch_timestamp | energy_use

和聚合表 hash_key可以是聚合类型,范围键可以是聚合名称 例: zone,zone1 区域,区域3 那天,03/29/1940

获取机器数据时,将其转储到第一个表中,然后使用原子计数器增加第二个表中的实体: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithItems.html#WorkingWithItems.AtomicCounters