【发布时间】: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 系统来应对负载:
- 每个传感器在文件系统中都有自己的文件。
- 当一条数据到达时,它的文件被打开,数据被追加,文件被关闭。
- 查询打开相应的文件,找到数据的起点和终点,并读取其间的所有内容。
代码行数很少。性能取决于系统(存储类型、文件系统、操作系统),但似乎没有什么大的障碍。
但是,如果我沿着这条路走下去,我最终会编写自己的代码来进行分区、备份、将旧数据移动到存储(云)的更深处等。然后听起来就像是在滚动我自己的 DBMS,这听起来就像重新发明轮子一样(再次)。
有存储我拥有的数据类型的标准方法吗?一些巧妙的 NoSQL 技巧?
【问题讨论】:
-
是的,这不是一个真正的 SO 问题,但它很有趣。查看stackexchange.com/sites 上的所有其他站点,例如“程序员”或“计算机科学”。我会说你想要的是非常高性能的。您可以使用 SQL Server 或 Oracle 等“普通”系统来完成。但是你的速度目标很艰难。 10 亿行在 3 秒内输出 == 强大的处理能力和精美的硬件和逻辑并行性。云系统的传输速度也会太慢。如果您可以放弃一些速度,那并不是那么困难,因为您已经知道简单的数据结构会有所帮助。
-
我试图解释问题以更清楚地描述问题。输出带宽不是问题,因为我一次只需要从一个传感器获取适量的数据。典型的查询可能会返回 20 000 个数据点。不需要花哨的硬件——至少初步的基准测试表明这可以通过单个服务器来完成。
-
不错。在这种情况下,您的实现可能比哪个系统更重要。数据架构始终是关键:)。玩得开心!
-
@DrV:你解决问题了吗?您认为哪种 dbms 最适合这些类型的问题?
标签: time-series bigdata query-performance