我想在亚马逊的 DynamoDb 数据库中存储 1M+ 不同的时间序列。每个时间序列将有大约 50K 个数据点。数据点由时间戳和值组成。
应用程序会频繁(一直)向时间序列添加新数据点,并且会不时检索(通常是整个时间序列)时间序列以进行分析。
我应该如何构建数据库?我应该为每个时间序列创建一个单独的表吗?还是应该将所有数据点放在一张表中?
我想在亚马逊的 DynamoDb 数据库中存储 1M+ 不同的时间序列。每个时间序列将有大约 50K 个数据点。数据点由时间戳和值组成。
应用程序会频繁(一直)向时间序列添加新数据点,并且会不时检索(通常是整个时间序列)时间序列以进行分析。
我应该如何构建数据库?我应该为每个时间序列创建一个单独的表吗?还是应该将所有数据点放在一张表中?
假设您的数据是不可变的并且给定大小,您可能需要考虑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。
如何将每个时间序列滴入 JSON 或类似内容并存储在 S3 中。最多您需要从 Dynamo 之类的地方进行查找。
您仍然可能需要红移来处理您的输入。