【问题标题】:Database suggestions for time series of events事件时间序列的数据库建议
【发布时间】:2023-03-22 01:54:01
【问题描述】:

对于我的一个项目,我必须将大量事件输入数据库以供以后处理,并且我正在尝试确定哪种 DBMS 最适合我的目的。

我有:

  • 目前大约有 400,000,000 个离散事件

  • 大约 600 GB 的数据将存储在数据库中

这些事件有多种格式,但我估计单个属性的数量约为 5,000。大多数事件每个仅包含大约 100 个属性的值。属性值将被视为任意字符串,在某些情况下,还可以视为整数。

这些事件最终将合并为一个时间序列。虽然它们确实有一些内部结构,但没有对其他事件的引用,我相信这意味着我不需要对象数据库或一些 ORM 系统。

我的要求:

  • 开源许可证 - 我可能需要稍微调整一下。

  • 通过能够扩展到多台服务器的可扩展性,尽管一开始只会使用一个系统。

  • 快速查询 - 更新并不那么重要。

  • 适用于 C/C++、Java 和 Python 的成熟驱动程序/绑定。最好拥有与他人合作良好的许可证 - 我宁愿不因为技术决定而承诺任何事情。我认为大多数DB驱动在这里都没有问题,但无论如何应该提到。

  • 适用于 Linux。

  • 如果它也可用于 Windows,那就太好了,但不是必需的

我的理想数据库将允许我通过单个查询检索指定时间段内的所有事件。

到目前为止我发现/考虑的内容:

  • Postgresql 随着页面大小的增加,每个表中显然可以有多达 6,000 列。如果我对属性计数的估计没有偏差,它可能会。

  • MySQL 似乎每个表有 4,000 列的限制。我可以使用带有一点 SQL-fu 的多个表,但我宁愿不这样做。

  • MongoDB 是我目前的倾向。它可以让我保留事件的内部结构,同时仍然能够查询它们。它的 API 看起来也很简单。我不知道它在性能方面的表现如何 - 至少在单个服务器上。

  • OpenTSDB 及其度量收集框架听起来很有趣。我可以为每个属性使用单个时间序列(这可能有助于我的某些处理),将属性值作为标记并另外标记条目将它们与特定事件相关联。从管理员和应用程序程序员的角度来看,它可能具有比上述三个更陡峭的准备曲线。不知道它的性能。

  • 直接使用HBase。这可能比 OpenTSDB 更符合我的要求,尽管 - 从我过去使用 hadoop 的经验来看 - 管理开销可能仍然高于前三个选项。

可能还有其他数据库可以做到这一点,所以请随时告诉我 - 如果有任何建议或评论可能对我有所帮助,我将不胜感激。

PS:我作为数据库管理员的经验很少,因此对于任何误解,我深表歉意。

【问题讨论】:

  • 大多数(全部?)SQL 数据库管理系统也对一行中的字节数有限制。根据特定的 dbms,它可能是硬限制(无法创建可能在一行中存储超过 8k 字节的表)或软限制(某些列可能会移动到 db 中的备用存储位置,这影响性能)。

标签: database time-series


【解决方案1】:

使用包含数千列的表是疯狂的。尤其是当它们中的大多数如你所说的为零时。

你应该首先考虑从这里转换你的数据结构:

table_1
-------
event_id
attribute_1
attribute_2
[...]
attribute_5000

变成这样:

table_1          event_values             attributes
--------         ------------             ----------
event_id         event_id                 attribute_id
                 attribute_id             attribute_type
                 attribute_value

它可以与任何 RDMS 一起使用(您唯一的限制就是总数据库大小和性能)

【讨论】:

  • 出于各种原因,我最终使用了 MongoDB,性能和易用性是最重要的。无论如何,您提出的架构是一个基本的 ORM 模式,应该可以与任何关系数据库一起使用,这就是我接受这个答案的原因。
【解决方案2】:

答案可能已经很晚了,但这就是我所做的。

我使用 HDF5 作为我的时间序列存储库。它有许多可以混合和匹配的有效和快速的压缩样式。它可以与许多不同的编程语言一起使用。它可在 Windows 和 Linux 上使用。

我使用 boost::date_time 作为时间戳字段。这允许大量基于日期时间的计算。

然后,在金融领域,我为每根柱线、报价、交易、报价等创建特定的数据结构......

我创建了许多自定义迭代器并使用标准模板库算法来有效地搜索特定值或基于时间的记录范围。然后可以将选择加载到内存中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-09
    • 2021-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-09
    • 1970-01-01
    相关资源
    最近更新 更多