我想在亚马逊的DynamoDb数据库中存储1M +不同的时间序列。每个时间序列将有大约50K数据点。数据点由时间戳和值组成。
应用程序会频繁地(始终)将新数据点添加到时间序列中,并将不时检索(通常是整个时间序列)时间序列,以进行分析。
我应该如何构建数据库?我应该为每个时间序列创建一个单独的表吗?或者我应该将所有数据点放在一个表中吗?
答案 0 :(得分:14)
假设您的数据是不可变的并且给定了大小,您可能需要考虑Amazon Redshift;它是为PB级报告解决方案编写的。
在Dynamo中,我可以想到一些可行的设计。在第一个中,您可以使用一个表,使用复合散列/范围键(两个字符串)。哈希键是时间序列名称,范围键是时间戳作为ISO8601字符串(具有令人愉快的属性,字母顺序也是按时间顺序排列),并且每个项目都有一个额外的属性;一个值'。这使您可以从时间序列(查询hashKey相等)和时间序列的子集(查询hashKey相等和rangeKey BETWEEN子句)中选择所有内容。但是,您的主要问题是“热点”问题:在内部,Dynamo将通过hashKey对您的数据进行分区,并将您的ProvisionedReadCapacity分散到所有分区上。因此,您可能每秒有1000 KB的读取,但如果您有100个分区,那么每个分区每秒只有10 KB,并且从单个时间序列中读取所有数据(单个hashKey)将只访问一个分区。因此,您可能认为1000 KB的读取速度为每秒1 MB,但如果存储10 MB,则可能需要更长时间才能读取它,因为单个分区会对您造成更大的压力。
从好的方面来看,DynamoDB在扩展方面具有极高但昂贵的上限;如果你想要,你可以支付100,000个读取容量单位,并且对所有这些数据的响应时间都是亚秒级。
另一个理论设计是将每个时间序列存储在一个单独的表中,但我不认为DynamoDB可以扩展到数百万个表,所以这可能是不行的。
您可以尝试在10个表中展开您的时间序列,其中“高度读取”数据在表1中,“几乎从不读取数据”在表10中,而所有其他数据在其间的某处。这将让您“游戏”配置的吞吐量/分区限制规则,但在设计中具有高度复杂性。总的来说,它可能不值得;你在哪里新的时间序列?你怎么记得他们都在哪里?你如何移动时间序列?
我认为DynamoDB支持从我自己的经验中对这些类型的读取进行内部“爆破”,并且我的数字可能已关闭,并且您将获得非常好的性能。但我的判决是调查Redshift。
答案 1 :(得分:0)
如何将每个时间序列滴入JSON或类似的东西并存储在S3中。最多你需要从Dynamo这样的地方查找。
您仍然可能需要红移来处理您的输入。
答案 2 :(得分:-1)
要在DynamoDB上进行分析,最好将数据从DynamoDB中拉出,并使用其他服务来运行分析查询。 (Dynamo本身不适用于分析查询。)在某些情况下,您甚至可以实时同步Dynamo和查询服务之间的连接,从而无需执行其他查询步骤。
对于这种设置中的第二项服务,您有很多选择,包括:
要全面分析不同方法的优缺点,请查看this blog post。
(完全公开:我在Rockset工作。)