微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

存储时间序列数据,关系型还是非关系型?

如何解决存储时间序列数据,关系型还是非关系型?

绝对是关系型的。无限的灵活性和扩展性。

在概念和应用上进行了两次更正,然后是高度。

更正

  1. 它不是“过滤掉不需要的数据”;它只 需要的数据。是的,当然,如果你有一个Index来支持WHERE子句中标识的列,它是非常快的,并且查询不依赖于表的大小(从160亿行的表中抓取1000行是瞬时的) .

  2. 你的桌子有一个严重的障碍。根据您的描述,实际的 PK 是(设备、公制、日期时间)。(请不要称它为 TimeStamp,这意味着别的东西,但这是一个小问题。) 的唯一性通过以下方式标识:

       (Device, Metric, DateTime)
    
    • Id列什么都不做,它完全是多余的。

    • 列永远不是键(在关系数据库中被禁止Id重复行必须通过其他方式来防止)。

    • Id列需要一个额外的索引,这显然会阻碍 的速度INSERT/DELETE,并增加使用的磁盘空间。

    • 你可以摆脱它。请。

海拔

  1. 既然您已经消除了障碍,您可能还没有认识到它,但您的桌子处于第六范式。速度非常快,PK上只有一个Index。为了理解,请阅读什么是 *

    • (我只有一个索引,而不是三个;在非 sql 上,您可能需要三个索引)。

    • 我有完全相同的表(Id当然没有“钥匙”)。我有一个额外的专栏Server。我远程支持多个客户。

(Server, Device, Metric, DateTime)

该表可用于使用完全相同的 sql 代码(是的,切换单元格)来透视数据(即Devices,在顶部和底部,或旋转)。Metrics我使用该表为客户建立了无数种图形和图表,以了解他们的服务器性能

* [**监控统计数据模型**](http://www.softwaregems.com.au/Documents/Documentary%20Examples/sysmon%20Public.pdf) 。

(内联太大;某些浏览器无法加载内联;点击链接。这也是过时的演示版本,出于显而易见的原因,我无法向您展示商业产品 DM。)

* 它允许我在收到客户的原始监控统计文件后使用 **单个 SELECT 命令生成**[ **这样的图表**](http://www.softwaregems.com.au/Documents/Documentary%20Examples/sequoia%20091019%20Server%20Public.pdf) ,六次击键。注意混搭;操作系统和服务器在同一张图表上;各种枢轴。当然,统计矩阵和图表的数量没有限制。(经客户许可使用。) ****

* 不熟悉关系数据库建模标准的读者可能会发现[ **IDEF1X 表示法**](http://www.softwaregems.com.au/Documents/Documentary%20Examples/IDEF1X%20Notation.pdf) 很有帮助。

最后但同样重要的是,sql 是 IEC/ISO/ANSI 标准。免费软件实际上是非 sql;如果他们不提供标准,则使用 sql 一词是欺诈性的。他们可能提供“额外”,但缺乏基础知识。

解决方法

我正在创建一个系统,该系统使用 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 方法的基于集合的结构(与我存储数据的心理模型相匹配)是否提供了明显的好处?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。