【问题标题】:Data storage for time series data时间序列数据的数据存储
【发布时间】:2014-08-03 08:53:51
【问题描述】:

我有一些科学测量数据应该永久存储在某种数据存储中。

我正在寻找一种方法来存储来自 100 000 个传感器的测量结果,这些传感器的测量数据多年来积累到每个传感器大约 1000 000 个测量值。每个传感器每分钟或更低频率产生一次读数。因此数据流不是很大(整个系统每秒大约 200 次测量)。传感器不同步。

数据本身以三元组的形式出现:[timestamp] [sensor #] [value],其中所有内容都可以表示为 32 位值。

在最简单的形式中,此流将按原样存储到单个三列表中。那么查询将是:

SELECT timestamp,value 
  FROM Data 
  WHERE sensor=12345 AND timestamp BETWEEN '2013-04-15' AND '2013-05-12'
  ORDER BY timestamp

不幸的是,对于基于行的 DBMS,这将导致性能非常差,因为数据量很大,而我们想要的数据几乎均匀地分散在其中。 (试图从数十亿条记录中挑选几十万条记录。)我需要的性能方面是人类消费的合理响应时间(数据将为用户绘制图表),即几秒钟加上数据传输。

另一种方法是将来自一个传感器的数据存储到一个表中。那么查询会变成:

SELECT timestamp,value 
  FROM Data12345 
  WHERE timestamp BETWEEN '2013-04-15' AND '2013-05-12'
  ORDER BY timestamp

这将提供良好的读取性能,因为结果将是一个相对较小(通常少于一百万行)表中的许多连续行。

但是,RDBMS 应该有 100 000 个表,它们会在几分钟内使用。这对于通用系统似乎是不可能的。另一方面,RDBMS 似乎不是正确的工具,因为数据中没有关系。

我已经能够证明单个服务器可以通过使用以下 mickeymouse 系统来应对负载:

  1. 每个传感器在文件系统中都有自己的文件。
  2. 当一条数据到达时,它的文件被打开,数据被追加,文件被关闭。
  3. 查询打开相应的文件,找到数据的起点和终点,并读取其间的所有内容。

代码行数很少。性能取决于系统(存储类型、文件系统、操作系统),但似乎没有什么大的障碍。

但是,如果我沿着这条路走下去,我最终会编写自己的代码来进行分区、备份、将旧数据移动到存储(云)的更深处等。然后听起来就像是在滚动我自己的 DBMS,这听起来就像重新发明轮子一样(再次)。

有存储我拥有的数据类型的标准方法吗?一些巧妙的 NoSQL 技巧?

【问题讨论】:

  • 是的,这不是一个真正的 SO 问题,但它很有趣。查看stackexchange.com/sites 上的所有其他站点,例如“程序员”或“计算机科学”。我会说你想要的是非常高性能的。您可以使用 SQL Server 或 Oracle 等“普通”系统来完成。但是你的速度目标很艰难。 10 亿行在 3 秒内输出 == 强大的处理能力和精美的硬件和逻辑并行性。云系统的传输速度也会太慢。如果您可以放弃一些速度,那并不是那么困难,因为您已经知道简单的数据结构会有所帮助。
  • 我试图解释问题以更清楚地描述问题。输出带宽不是问题,因为我一次只需要从一个传感器获取适量的数据。典型的查询可能会返回 20 000 个数据点。不需要花哨的硬件——至少初步的基准测试表明这可以通过单个服务器来完成。
  • 不错。在这种情况下,您的实现可能比哪个系统更重要。数据架构始终是关键:)。玩得开心!
  • @DrV:你解决问题了吗?您认为哪种 dbms 最适合这些类型的问题?

标签: time-series bigdata query-performance


【解决方案1】:

尝试将VictoriaMetrics 作为海量数据的时间序列数据库。

  • 针对存储和查询大量时间序列数据进行了优化。
  • 由于基于 LSM 树的the storage design,它使用低磁盘 iops 和带宽,因此它可以在 HDD 而不是 SSD 上很好地工作。
  • 它具有良好的压缩比,因此 1000 亿个典型数据点需要不到 100 GB 的 HDD 存储空间。阅读technical details on data compression

【讨论】:

    【解决方案2】:

    看起来确实是一个非常简单的问题。 1000 亿条记录,每条记录 12 字节 -> 1.2TB,这对于现代 HDD 来说甚至都不是大容量。在 LMDB 中,我会考虑为每个传感器使用一个 subDB。那么您的键/值只是 32 位时间戳/32 位传感器读数,您所有的数据检索都将是对键的简单范围扫描。使用 LMDB,您可以轻松地以 50M 记录/秒的速度检索。 (看看 SkyDB 的人就是这样做的 https://groups.google.com/forum/#!msg/skydb/CMKQSLf2WAw/zBO1X35alxcJ

    【讨论】:

    • 感谢您的专家意见!我确实喜欢 LMDB 的完成方式,我一直在考虑在这个应用程序中使用它,但我没有想到使用 subDB。我承认我对它们一无所知,并且不得不询问使用 500 个数据库和 200 个子数据库或 1 个数据库和 100 000 个子数据库是否有区别? (每秒 50 000 000 条记录确实令人印象深刻,但不幸的是我的数据将在磁盘上,所以我担心的是随机读取或写入的页面数量。)
    • LMDB 是单写入器设计,因此您可以考虑拆分为 500 个数据库以支持 500 个并发写入器。除此之外,还有一个问题是必须同时打开多少个子数据库 - 初始 mdb_dbi_open() 实际上在打开的 DBI 表中进行线性搜索,因此对于 100,000 个子数据库可能会很慢。 (但这也可能无关紧要,因为 open 每次运行只需要执行一次。)除此之外没有真正的性能差异。
    • InfluxDB 是一个时间序列数据库,可以使用 LMDB influxdb.com/blog/2014/06/20/… 使用 LMDB 的 Sorted Duplicates 功能也可以节省一些空间和时间,请参阅我的 cmets 到他们的帖子。
    猜你喜欢
    • 1970-01-01
    • 2012-09-02
    • 2010-12-13
    • 2023-04-01
    • 2022-11-15
    • 1970-01-01
    • 2016-10-31
    • 1970-01-01
    相关资源
    最近更新 更多