我正在创建一个系统,该系统使用 SNMP 以(可能)5 分钟的间隔轮询设备以获取不同指标的数据,例如 CPU 利用率、磁盘利用率、温度等。最终目标是以时间序列图的形式向系统用户提供可视化。
我过去曾研究过使用 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 个指标的用户,我们将有不到500 万条记录。
索引
如果没有索引fk_to_device
并且fk_to_metric
扫描这个不断扩展的表会花费太多时间。因此,索引上述字段以及timestamp
(用于创建具有本地化周期的图表)是一项要求。
非关系型 (NoSQL)
MongoDB 具有集合的概念,与表不同,这些表可以通过编程方式创建而无需设置。有了这些,我可以对每个设备的数据存储进行分区,甚至可以对每个设备记录的每个指标进行分区。
我没有使用 NoSQL 的经验,也不知道它们是否提供任何查询性能增强功能,例如索引,但是上一段建议在 NoSQL 下存储数据的结构中完成大部分传统的关系查询工作。
未定
具有正确索引的关系解决方案会在一年内减少到爬行吗?或者 NoSQL 方法的基于集合的结构(与我存储数据的心理模型相匹配)是否提供了明显的好处?