gpt4 book ai didi

database - 存储时间序列数据的简单方法

转载 作者:搜寻专家 更新时间:2023-10-30 23:34:41 26 4
gpt4 key购买 nike

我每天有大约 10 亿个事件。我需要将过去 30 天的这些事件存储在数据库中,因此大约有 300 亿行。

假设这是运动员数据库,每行只有4列(运动员姓名、运动员纪律、运动员等级、日期)。我只需要按运动员姓名和日期检索数据。例如,为特定运动员构建过去 30 天的图表。

  1. 最初我使用的是 Google Big Query,这是一个很棒的工具,非常便宜,开箱即用的每日分片和线性可扩展性,但几乎没有缺点。查询 30 亿个表大约需要 5 秒,对我来说太多了。数据插入后出现在“Streaming buffer”中,有一段时间(大约5-10分钟)无法查询

  2. 另一种方法使用 Postgres 并将所有数据存储在一个具有适当索引的表中。我也可以使用每日分片(在一天开始时自动创建新表)但我担心 Postgres 是否可以处理十亿行。另外,如果我想获取最近 30 天的历史数据,在以这种方式分片数据时,我必须进行 30 次 SELECT 查询。

我不想为像 Cassandra 这样过于复杂的解决方案而烦恼(尽管从未尝试过)。此外,我认为我不会从使用面向列的数据库中获得任何好处,因为我只有 4 列。

寻找类似于 Big Query 但没有提到的缺点的东西。我认为数据可以存储在一个节点中。

最佳答案

数据可以只使用一个节点来存储。实际上,每天 10 亿行并不多。它只有大约 32K 写入/秒。为了比较,Akumuli在带有 SSD 的 m4.xlarge AWS 实例上每秒可以处理大约 150 万次插入(其中几乎一半是使用默认设置的 EBS 卷,但您可以提供更多的 IOPS)。要存储 30B 数据点,您需要不到 200GB 的磁盘空间(这取决于您的数据,但可以安全地假设数据点在磁盘上占用的空间少于 5 个字节)。

您的数据模型很简单。系列名称如下所示:

athlet_rank name=<Name> discipline=<Discipline>

您将能够按名称查询数据:

{
"select": "athlete_rank",
"range": { "from": "20170501T000000",
"to": "20170530T000000" },
"where": { "name": <Name> }
}

如果基数很大(许多独特的系列),则不应选择 Akumuli。每个系列消耗大约 12KB 的 RAM,例如要处理包含 100 万个系列的数据库,您需要一台至少有 16GB RAM 的服务器(实际数量取决于系列大小)。这最终会得到改进,但目前这就是我们所拥有的。

免责声明:我是 Akumuli 的作者,所以我有点偏见。但我很乐意收到任何反馈,无论好坏。

关于database - 存储时间序列数据的简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44614403/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com