我正在创建一个系统,该系统使用SNMP(可能)每5分钟间隔以不同的指标(例如CPU使用率,磁盘使用率,温度等)轮询设备以获取数据。最终目标是以时间序列图的形式向系统用户提供可视化效果。
过去,我曾研究过使用RRDTool,但由于它无限期地存储捕获的数据对我的项目很重要,因此拒绝了它,并且我希望对捕获的数据进行更高级别和更灵活的访问。所以我的问题是真的:
关系数据库(例如MySQL或PostgreSQL)或非关系数据库或NoSQL数据库(例如MongoDB或Redis)在查询图形数据时的性能方面更好。
关系型 给定一个关系数据库,我将使用一个data_instances表,该表中将存储为所有设备测量的每个指标捕获的数据的每个实例,具有以下字段:
栏位: id fk_to_device fk_to_metric metric_value timestamp
id fk_to_device fk_to_metric metric_value timestamp
当我想为特定设备上的特定指标绘制图形时,我必须查询此单表以过滤掉其他设备,以及正在为该设备分析的其他指标:
SELECT metric_value, timestamp FROM data_instances WHERE fk_to_device=1 AND fk_to_metric=2
该表中的行数为:
d * m_d * f * t
其中d是的数量的装置,m_d是累计度量的数目被记录为所有设备,f是频率在其中数据被轮询和t是总量时间系统已收集数据。
如果一个用户每年每5分钟记录3个设备的10个指标,那么我们将拥有近500万条记录。
指标 如果没有索引fk_to_device并且不fk_to_metric扫描这个不断扩展的表将花费太多时间。因此,索引上述字段以及timestamp(用于创建具有局部时间段的图形)都必须是索引。
非关系(NoSQL) MongoDB具有集合的概念,与表不同的是,无需编程即可创建表。有了这些,我就可以划分每个设备的数据存储,甚至是每个设备记录的每个指标。
我没有使用NoSQL的经验,也不知道它们是否提供任何增强查询性能的功能(例如索引),但是上一段建议在数据存储在NoSQL下的结构中执行大多数传统的关系查询工作。
未定 具有正确索引的关系解决方案会在一年之内减少吗?还是NoSQL方法的基于集合的结构(与我对存储数据的思维模型相匹配)提供了明显的好处?
绝对是关系的。无限的灵活性和扩展性。
在概念和应用上均进行了两次更正,然后进行了标高校正。
更正 它不是在“过滤掉不需要的数据”。它仅选择所需的数据。是的,当然,如果您有一个索引来支持WHERE子句中标识的列,那将非常快,并且查询不依赖于表的大小(从160亿行表中获取1,000行是瞬时的) 。
您的餐桌有一个严重的障碍。根据您的描述,实际的PK是(设备,指标,日期时间)。(请不要将其称为TimeStamp,这意味着其他事情,但这是一个小问题。)该行的唯一性由以下方式标识:
(Device, Metric, DateTime) 该Id列不执行任何操作,它是完全完全冗余的。
一个Id列是从未一个密钥(重复的行,这是禁止的在关系数据库中,必须通过其它方式来防止)。 该Id列需要附加的索引,这显然会阻碍的速度INSERT/DELETE,并增加所使用的磁盘空间。
您可以摆脱它。请。
Elevation 既然您已经消除了障碍,您可能还没有意识到,但是您的表格处于第六范式。极高的速度,PK上只有一个索引。为了理解,请从什么是第六范式阅读此答案?前进。
(我只有一个索引,而不是三个;在非SQL上,您可能需要三个索引)。
我有完全相同的表(Id当然没有“键”)。我还有一个专栏Server。我支持多个客户。
(Server, Device, Metric, DateTime)
该表可用于使用完全相同的SQL代码(是的,切换单元格)来旋转数据(即Devices,从上到下或Metrics从侧面旋转或旋转)。我使用该表来建立各种图形和图表,以供客户重新使用其服务器性能。
监视统计数据模型。 (对于内联太大,某些浏览器无法内联加载;请单击链接。这也是已过时的演示版本,出于明显的原因,我无法向您展示商业产品DM。)
它使我能够使用一个SELECT命令从客户接收到原始的监视统计信息文件后,生成这样的Charts(六个击键)。注意混合搭配;操作系统和服务器在同一图表上;各种枢轴。当然,统计矩阵的数量没有限制,因此图表也没有限制。(经客户同意后使用。)
不熟悉关系数据库建模标准的读者可能会发现IDEF1X表示法很有帮助。
还有一件事
最后但并非最不重要的一点是,SQL是IEC / ISO / ANSI标准。该免费软件实际上是Non-SQL。如果SQL不提供标准,则使用SQL一词是欺诈性的。他们可能会提供“额外费用”,但缺少基础知识。