我想将1M +不同的时间序列存储在Amazon的DynamoDb数据库中。每个时间序列将具有约5万个数据点。数据点由时间戳和值组成。
该应用程序将频繁地(一直)向时间序列添加新的数据点,并会不时地检索(通常是整个时间序列)时间序列以进行分析。
我应该如何构造数据库?我应该为每个时间序列创建一个单独的表吗?还是应该将所有数据点放在一个表中?
最佳答案
假设您的数据是不可变的,并且具有一定的大小,则可能需要考虑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。
关于amazon-web-services - 在AWS DynamoDb中存储时间序列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18213607/