时间序列数据的数据存储

时间:2014-06-12 21:45:49

标签: time-series bigdata query-performance

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

我正在寻找一种方法来存储来自100 000个传感器的测量结果,其中测量数据累积多年,每个传感器测量大约1 000 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应该有10万个表,可以在几分钟内使用。对于常见系统,这似乎是不可能的。另一方面,RDBMS似乎不是正确的工具,因为数据中没有关系。

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

  1. 每个传感器在文件系统中都有自己的文件。
  2. 当一个数据到达时,它的文件被打开,数据被追加,文件被关闭。
  3. 查询打开相应的文件,找到数据的起点和终点,并读取其间的所有内容。
  4. 很少的代码行。性能取决于系统(存储类型,文件系统,操作系统),但似乎没有任何大的障碍。

    然而,如果我沿着这条路走下去,我最终会编写自己的代码进行分区,备份,在存储(云端)中深入移动旧数据等等。然后这听起来就像滚动我自己的DBMS,这听起来像喜欢重新发明轮子(再次)。

    是否有标准方式存储我拥有的数据类型?一些聪明的NoSQL技巧?

2 个答案:

答案 0 :(得分:1)

看起来真是一个非常简单的问题。 1000亿条记录,每条记录12字节 - > 1.2TB这对于现代硬盘来说甚至不是很大的体积。在LMDB中,我会考虑每个传感器使用一个子数据库。然后,您的键/值只是32位时间戳/ 32位传感器读数,所有数据检索都将是键上的简单范围扫描。您可以使用LMDB轻松检索大约50M记录/秒。 (请参阅SkyDB的工作人员https://groups.google.com/forum/#!msg/skydb/CMKQSLf2WAw/zBO1X35alxcJ

答案 1 :(得分:0)

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

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