我有一些科学测量数据,应该永久存储在某种数据存储中。
我正在寻找一种方法来存储来自 100,000 个传感器的测量数据,这些数据会随着时间累积到每个传感器大约 1,000,000 条测量数据。每个传感器每分钟或更少频繁地产生一次读数。因此,数据流不是很大(完整系统中大约每秒钟约有 200 条测量数据)。传感器没有同步。
数据本身作为三元组的流传输:[时间戳] [传感器编号] [值],其中每个元素都可以表示为 32 位值。
在最简单的形式下,此流将按原样存储到单个三列表中。然后查询将是:
这将提供良好的读取性能,因为结果将是来自相对较小(通常少于一百万行)表的连续行数。
然而,RDBMS应该有100,000个表,在几分钟内使用。这似乎在常见系统中不可能。另一方面,由于数据中没有关系,RDBMS似乎不是正确的工具。
我已经可以通过使用以下“mickeymouse”系统证明单个服务器可以处理负载:
1. 每个传感器在文件系统中都有自己的文件。 2. 当数据到达时,打开其文件,追加数据,然后关闭文件。 3. 查询打开相应的文件,找到数据的起始和结束点,并读取中间的所有内容。
只需很少量的代码。性能取决于系统(存储类型、文件系统、操作系统),但似乎没有什么大的障碍。
然而,如果我走这条路,最终需要编写自己的分区、备份、将旧数据移动到存储(云)中更深处等代码。那么这听起来像是自己编写DBMS,这又像是重新发明轮子。
是否有一种标准的方式来存储我拥有的数据类型?一些聪明的NoSQL技巧吗?
我正在寻找一种方法来存储来自 100,000 个传感器的测量数据,这些数据会随着时间累积到每个传感器大约 1,000,000 条测量数据。每个传感器每分钟或更少频繁地产生一次读数。因此,数据流不是很大(完整系统中大约每秒钟约有 200 条测量数据)。传感器没有同步。
数据本身作为三元组的流传输:[时间戳] [传感器编号] [值],其中每个元素都可以表示为 32 位值。
在最简单的形式下,此流将按原样存储到单个三列表中。然后查询将是:
SELECT timestamp,value
FROM Data
WHERE sensor=12345 AND timestamp BETWEEN '2013-04-15' AND '2013-05-12'
ORDER BY timestamp
很遗憾,在基于行的数据库管理系统中,这种方法的性能会非常差,因为数据量很大,而我们想要的数据几乎均匀地分散在其中。(尝试从数十亿条记录中选取几十万条记录。)从性能方面来说,我需要的是合理的响应时间供人类消费(数据将被绘制成图表供用户查看),即几秒钟加上数据传输。
另一种方法是将一个传感器的数据存储在一个表中。然后查询将变为:
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技巧吗?