我有一些科学的测量数据应该永久存储在某种数据存储中。
我正在寻找一种方法来存储来自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系统证明单个服务器可以应对负载:
很少的代码行。性能取决于系统(存储类型,文件系统,操作系统),但似乎没有任何大的障碍。
然而,如果我沿着这条路走下去,我最终会编写自己的代码进行分区,备份,在存储(云端)中深入移动旧数据等等。然后这听起来就像滚动我自己的DBMS,这听起来像喜欢重新发明轮子(再次)。
是否有标准方式存储我拥有的数据类型?一些聪明的NoSQL技巧?
答案 0 :(得分:1)
看起来真是一个非常简单的问题。 1000亿条记录,每条记录12字节 - > 1.2TB这对于现代硬盘来说甚至不是很大的体积。在LMDB中,我会考虑每个传感器使用一个子数据库。然后,您的键/值只是32位时间戳/ 32位传感器读数,所有数据检索都将是键上的简单范围扫描。您可以使用LMDB轻松检索大约50M记录/秒。 (请参阅SkyDB的工作人员https://groups.google.com/forum/#!msg/skydb/CMKQSLf2WAw/zBO1X35alxcJ)
答案 1 :(得分:0)
尝试将VictoriaMetrics作为用于大量数据的时间序列数据库。