提供高频数据的设计思路

时间:2009-04-07 20:54:53

标签: c# caching bigtable

我想构建一些东西来存储和提供时间序列数据,这些数据是以不同的时间间隔从各种来源传来的。这包括原始数据和计算数据。例如,假设我想记录每30秒的温度读数,以及我每隔5分钟单独计算的温度预测。

我需要能够快速查询数据,并且我发现关系数据库一旦变得太大就无法正常工作。所以我在考虑创建某种内存中的东西,但我确定它会在某些时候崩溃,所以我需要将数据保存到磁盘上。所以我想知道,为什么不把整个事情做成基于磁盘的,对常用的数据进行某种缓存?

但我对如何解决这个问题有点无能为力。我想象数据源定期将更新数据集推送到服务器,使用某种字符串键/符号来标识数据是什么。服务器获取数据,然后是什么?把它写成某种二进制文件?我可以每个符号写一个文件吗? (假设超过100k符号)

我认为我想要的是谷歌的BigTable,但规模要小得多。基本上,分布式哈希表,将字符串键映射到关联数据的时间序列,具有非常快速的检索和按时间检索范围查询的能力。和多维数据的额外点。

哦,这将(理想情况下)由C#/ windows项目实现 - 它不需要 高性能。

7 个答案:

答案 0 :(得分:2)

我必须告诉你,没有“文件系统”方法(我知道)将比关系数据库更快。它可能会更糟糕。

关系数据库的问题并不在于它们本身就很慢,而是可以非常容易地将数据放入它们中而不考虑数据的保存方式。一个好的索引,即使是数百万条记录,也应该产生亚秒级的结果。这更多的是设计问题而不是访问问题。如果你设计得很好,就会有访问权。

编辑:另外,如果“关系数据库”是指Microsoft Access,那么你是对的;它很慢,有很多记录。我不会那样做。如果钱是个问题,请查看MySql,如果钱不是,请查看Oracle / Sql Server。

答案 1 :(得分:2)

可悲的是,NDA协议禁止我告诉你如何做到这一点。我在创建非关系型数据库的团队中工作,该数据库完全符合您的要求。它被称为Citadel。但是,我可以指出您可以公开获得的内容的链接,它应该为您提供一些有关它如何工作的想法。

http://zone.ni.com/devzone/cda/tut/p/id/6579

您可以购买该产品,但价格相当昂贵。

同样Karl指出这通常用于SCADA产品,例如WonderwareLookoutLabVIEW DSC

搜索SCADA data storage也会产生一些有趣的阅读。


另外,如果数据量很小,关系数据库可以解决这个问题。随着时间推移会发生的事情是数据无限制地增长,并且关系数据库被填充超出其容量。一个好的SCADA数据存储系统可以轻松处理每秒轮询50000个点。虽然在某些时候甚至它们开始变得太大而无法轻易处理。

答案 2 :(得分:1)

听起来像SCADA(系统控制和数据采集)类型的应用程序,利用系统的数据采集部分。你有没有看过现成的解决方案? Wonderware / IndustrialSQL或一些竞争产品?

说过我现在的雇主(新西兰的MetService)每天从自动气象站(温度,降雨,风等)每30秒,1分钟或1小时记录读数并预测到Oracle DB。最小索引;索引减慢了4个DML动作中的3个并加快了选择当然你需要3个动​​作才能快速,特别是插入。快速IO系统。重做日志的速度非常快。我们正在转向分区表,以便删除更快并产生更少的重做(删除包含内容的表空间而不是发出删除)严重但是对于插入的轻量级快速事务。虽然执行插入和网络的机器的性能很严重,但是它们和DB。

答案 3 :(得分:1)

RRDTool是OpenSource行业标准,用于时间序列数据的高性能数据记录和图形系统。”

它分为两部分,一部分用于记录,存储和检索时间序列数据,另一部分用于图形化。它有很多使用的例子。

即使你不使用它,它的设计也是绝对相关的。

答案 4 :(得分:0)

如果您使用数据库并取出索引和关系部分,那么您几乎可以得到您所描述的内容。但是,我不确定它会有多大用处。你能不能让我们更好地了解为什么数据库不适合你?你尝试了哪些不起作用?

答案 5 :(得分:0)

我不确定你为什么要关注这个数据库。我已经对数百万行的表进行了实时统计。此外,您可以定期批量读数,将数十万行转换为数百行编译数据 - 这显然取决于您的需求。

对于内存中持久性和键值对访问,您可能需要查看memcachedb。它基于memcached并提供出色的性能。

此外,在考虑了更多之后,您可以轻松地将该事物作为内存中的哈希表运行,然后定期将其序列化到文件系统以实现持久性。

答案 6 :(得分:0)

我同意其他人认为数据库是你最好的选择。

如果您确实生成如此大量的数据而导致性能问题,则可能需要创建两个表 - 一个作为“实时”源,另一个作为“归档”。

您的系统会将新数据插入实时表,批处理作业会定期将数据从那里移动到存档表。如果需要考虑性能,则只能查询较小的实时表。如果您确实需要查询所有数据,则可以查询UNIONs实时和归档表的视图。