我正在创建一个系统,它可以轮询设备的各种指标数据,如CPU利用率,磁盘利用率,温度等。使用SNMP以(大概)5分钟的间隔。最终目标是以时间序列图的形式向系统用户提供可视化。
我过去曾考虑过使用RRDTool,但拒绝了它,因为无限期地存储捕获的数据对我的项目很重要,而且我想要更高级别和更灵活地访问捕获的数据。所以我的问题是:
关系数据库(如MySQL或PostgreSQL)或非关系数据库或NoSQL数据库(如MongoDB或Redis)在查询数据进行绘图时的性能更好。
给定一个关系数据库,我将使用data_instances
表,其中将存储为所有设备测量的每个指标捕获的每个数据实例,包含以下字段:
字段: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个指标,我们将有不到五百万个记录。
在fk_to_device
和fk_to_metric
上没有索引的情况下,扫描这个连续扩展的表将花费太多时间。因此,索引上述字段以及timestamp
(用于创建具有局部化周期的图)是必需的。
MongoDB具有收集的概念,与表不同的是,它们可以通过编程方式创建,而无需设置。有了这些,我可以为每个设备的数据存储分区,甚至为每个设备记录的每个指标。
我没有使用NoSQL的经验,也不知道它们是否提供任何查询性能增强功能(如索引),但上一段建议在NoSQL下存储数据的结构中执行大部分传统关系查询工作。
具有正确索引的关系解决方案是否会在一年内变得非常缓慢?或者,NoSQL方法的基于集合的结构(符合我对存储数据的心理模型)是否提供了显著的好处?