我正在考虑将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个读数的时候,我的担忧就开始了。
答案 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