时间序列数据存储:RDBMS 与 NoSQL
Posted
技术标签:
【中文标题】时间序列数据存储:RDBMS 与 NoSQL【英文标题】:Time Series Data storing: RDBMS vs NoSQL 【发布时间】:2018-10-29 10:49:59 【问题描述】:这些天来,我面临着存储一些时间序列数据的问题。
这些数据取自工业机器:对于每个作业(大约每小时 3 个,24/24 小时),软件记录:
油压; 油温; 一些振动数据。以非常高的频率 (> 10 kHz) 获取振动数据,并导致非常庞大的内存需求。这个问题让我的公司评估了一些有效存储这些数据的可能性。
插入不会很频繁(可能每天 1 或 2 次,当机器不工作时)。 读取可能会非常频繁(另一个软件将检索数据以进行绘图和分析)。
目前,将使用单个节点来存储数据,因此(暂时)我不想考虑分区和并行化问题。
我应该更喜欢哪种解决方案? 关系 DBMS(如 mysql 或 PostgreSQL),还是通用 NoSQL DB(例如,面向列的数据库 - 考虑到所有时间序列都是单变量的 - 如 Cassandra,或面向文档的数据库,如 MongoDB)?
除了我的特定用例之外,什么时候通常更喜欢 RDMBS 而不是 NoSQL 来存储时间序列?何时更喜欢 NoSQL 而不是 RDBMS?
【问题讨论】:
Difference between time-series database and relational database的可能重复 【参考方案1】:tl;博士:
对于时间序列,我通常会使用像 InfluxDb 这样的时间序列数据库。
将 NoSQL 用于非结构化的大量数据,例如:记录结果、网站搜索数据等。非常适合针对特定查询进行优化。
当你有简单的实体时,也可以使用 NoSQL(文档存储),它基本上可以包含关于实体的所有内容。由于通常是小型数据模型,微服务可以派上用场。
使用关系型数据库:当您具有以下层次结构时:销售流程的工作流程的进出。如果必须在大量数据上保持数据结构的完整性,则关系会更好。
这里是关于如何处理各种关系关系 vs 文档存储的一个很好的总结:https://completedeveloperpodcast.com/document-vs-relational-databases/
嗯,一般来说,网上有很多关于这个主题的文章。通常,在关系数据库中,示意图是已知的“预先” - 尽管它会随着时间而改变,但它是相当静态的。
大多数 Not-only-SQL 的最大“好处”是:
不需要固定原理图和固定关系来保持数据一致性。这意味着 - 例如图形数据库 - 您可以更轻松、更灵活地关联其他对象,或者您必须拥有几个独立的表。 通过设计能够(更好)水平扩展,这在更大的系统中是解决性能相关问题的一大好处。 (考虑成为几个独立的表来了解原因) 数据不需要(非常)结构化。如果您需要在数据库中包含外部数据源或典型的非结构化数据,这也是一个好处。 在小型实体、查询优化存储中运行良好。注意:有多种 NoSQL 数据库类型,所有类型都有不同的方法和各自的优缺点。
所以:
除了我的特定用例之外,什么时候通常更喜欢 RDMBS 而不是 NoSQL 来存储时间序列?
在使用 RDMBS 时,您需要 - 至少 - 预先了解您的原理图,并且预计它们不会经常更改。
如果满足以下条件,您更喜欢 RDMBS:
这种结构化数据和一致性检查是您存储的数据的固有属性。例如:维护仓库库存清单、跟踪工作时间等。 您的数据存储可以被视为一个独立的权限。例如:文件系统索引器或产品测试结果存储。什么时候更喜欢 NoSQL 而不是 RDBMS?
如果满足以下条件,您更喜欢 NoSQL:
您无法预先确定所有关系并期望经常添加数据、源和关系。典型的用例是大数据存储、关系存储;更具体的:社交网络、高级统计相关性或频繁变化的外部数据提供者。 您需要高可扩展性,这在大多数 NoSQL 系统中更为自然。 您只想以或多或少结构化的方式将一些数据转储到云中的某个位置。例如,创建一个简单的表来保存设置记录。 拥有简单的实体和查询,不需要复杂的连接和分层数据至于您的用例:
您的数据结构似乎是众所周知且固定的。这需要一个关系数据库。
数据量和它的简单性是选择 NoSQL 的一个论据。
至于高负载:数据结构也是预先知道的。然而,处理高负载时涉及到一些问题。可以将关系数据库配置为应付这个数量并且性能非常好,但 NoSQL 通常对此进行了更好的优化。
我觉得这有点平衡,而过去是关系型的;在这种情况下,我现在会去文档存储。
但是,它确实提出了另一个问题:既然您是 24/7 全天候监控;您多久需要一次去年或前一年的数据?上个月还是上周?
我只是问,因为有更多选项可以处理这些数据量。历史数据通常被视为日志,仅“不时”请求。在这种情况下,您可以将数据卡盘存储在不同的服务器上,甚至以不同的形式存储。例如,10kHz 振动数据也可以存储在专用服务器上,以 blob 或存储数据流的形式。
【讨论】:
感谢您的完整回答。回答您的问题:我的最终目标是应用一些预测性维护/异常检测技术,因此数据保留可能非常小(可能最多几个月用于测试目的)。目前,我没有被要求面对数据老化(例如聚合旧数据,降低其频率)。也许我应该将异常数据存储在其他数据库上,以跟踪它们(并应用一些强化学习)。以上是关于时间序列数据存储:RDBMS 与 NoSQL的主要内容,如果未能解决你的问题,请参考以下文章