database - 时间序列数据存储:RDBMS 与 NoSQL
问题描述
这些天来,我面临着存储一些时间序列数据的问题。
该数据取自工业机器:对于每个作业(大约每小时 3 个,24/24 小时),软件记录:
- 油压;
- 油温;
- 一些振动数据。
振动数据以非常高的频率(> 10 kHz)采集,并导致非常庞大的内存需求。这个问题使我的公司评估了一些有效存储这些数据的可能性。
插入不会很频繁(当机器不工作时,可能每天 1 或 2 次)。读取可能会非常频繁(另一个软件将检索数据以进行绘图和分析)。
目前,单个节点将用于存储数据,所以我不想(暂时)考虑分区和并行化问题。
我应该更喜欢什么解决方案?一个关系 DBMS(如 MySQL 或 PostgreSQL),还是一个通用的 NoSQL DB(如一个面向列的数据库 - 考虑到所有时间序列都是单变量的 - 如 Cassandra,或面向文档的数据库,如 MongoDB)?
除了我的特定用例之外,什么时候通常更喜欢 RDMBS 而不是 NoSQL 用于时间序列存储?何时更喜欢 NoSQL 而不是 RDBMS?
解决方案
tl;博士:
通常对于时间序列,我会使用像 InfluxDb 这样的时间序列数据库。
将 NoSQL 用于非结构化的大量数据,例如:记录结果、网站搜索数据等。非常适合针对特定查询进行优化。
当你有简单的实体时,也可以使用 NoSQL(文档存储),这些实体基本上可以包含关于实体的所有内容。由于通常是小型数据模型,因此在微服务中派上用场。
使用关系数据库:当您具有层次结构时,例如:销售流程的工作流程的进出。如果必须在大量数据上保持数据结构的完整性,则关系会更好。
这是关于如何处理各种关系关系与文档存储的很好的总结: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 或存储数据流的形式存储在专用服务器上。
推荐阅读
- ruby-on-rails - rspec @variable 返回 nil
- reactjs - TS/SFC/RenderProp:无法调用类型缺少调用签名的表达式
- android - onCreateViewHolder(ViewGroup parent, int viewType)
- cobol - 当我想从 cobol 程序显示 ispf 面板时出现错误 rc=20
- ffmpeg - 错误:不可满足的约束:so:libvpx.so.6(缺失)
- python - TypeError:只能将元组(不是“str”)连接到元组 TROUBLES
- asynchronous - 无法从 AWS lambda 调用 AWS Cognito API,但相同的代码在本地 node.js 中运行良好
- vue.js - 如何使用 vue/vuex 从输入中过滤数据?
- python - 基本循环算法的时间复杂度
- mongodb - Mongo 的聚合帮助 - 为什么硬编码有效而不是 req.body?