莫让时间序列数据搞砸了关系数据库

译文
数据库
人们忍不住将时间序列数据塞入到熟悉的Postgres或MySQL数据库中,但这是糟糕的主意,原因有很多。

译者 | 布加迪

审校 | 重楼

对于门外汉来说,时间序列数据显示与关系数据相似的特征,但这两种数据有几大区别。关系数据的主要目的是维护当前事实真相的准确表示,包括对象及对象之间的关系。而时间序列数据描述当下所发生的事情。

比如说,以DevOps工程师需要的实时洞察和即时信号/异常检测为例。您可以使用持续的观察流来检测模式、查找相关信息、识别和消除干扰信息以及发掘预示安全威胁的意外模式。时间序列数据使获取这些洞察成为可能。当然,时间序列数据可以塞入到行/表格式,但更适合以时间戳为主键的列数据库。

关系数据vs时间序列数据

顾名思义,关系数据是阐明关系的数据。关系数据的目的是维护对象及对象相互关系的准确记录。关系数据是事务性数据,经常更新以保持准确性。

而时间序列数据的目的是为分析和总结提供洞察力。一个序列是一连串观测结果,所以从本质上讲,数据点与数据源有关,但数据点不可变,因为过去不会变。虽然单个数据点可能没有用处,但整个序列揭示了数据源如何随时间而变化。

关系数据库为关系数据而构建

关系数据库为关系数据而构建,这似乎显而易见。时间序列数据的特征和工作负载全然不同,因此关系数据库不适合它们。

关系数据库无法处理大规模时间序列的摄取速度。由于这是与规模有关的问题,它只会在大规模情形下才出现。因此,许多人开始使用关系数据库处理时间序列,一旦达到扩展方面的拐点,就不得不做更多的工作。

对于存储在关系数据库中的每个原始数据源,估计需要10倍以上的存储空间来存储其相关的时间序列数据。关系数据库不是为这种类型的增长情况而构建的,这种类型的数据所需的关系数据库的特性也不适用于这种类型的增长情况。

一个例子是,与数据库备份相比,时间序列更倾向于读写之间较低的延迟。当关系数据库工作负载达到可扩展性临界点时,作为一种安全预防措施,数据库做备份时写入速度减慢。较高的延迟妨碍了自动化系统对任何异常情况立即采取行动的能力。

关系数据库面临的另一个挑战是,由于明确的模式需求,它们缺乏灵活性。每当您需要更新模式时,数据库都必须进行人力密集型迁移。这是一项有风险的工作,因为无论开发人员在这个过程中多么小心,都有可能丢失或损坏数据。

时间序列数据库为时间序列数据而构建

InfluxDB是一种专门构建的时间序列数据库,通过云、本地和开源来交付。它旨在满足时间序列数据的需求。在可扩展性方面,在InfluxData的内部基准测试中,与其他数据库相比,InfluxDB每秒摄取的数据多几个数量级,耗用少得多的CPU和内存,哪怕相比那些声称针对时间序列进行调优的数据库。

InfluxDB是“写时模式”(schema on write),这意味着开发人员只需将新的维度和字段添加到写入操作,即可添加它们。不需要对任何生产或开发数据库进行更改。这为数据形状不断变化的工作负载提供了灵活性。

面向时间序列的Apache Arrow

时间序列旨在理解当前的事实真相,提供即时洞察力和行动。关系数据库可以执行基本的数据操作,但无法对多个观测结果执行高级计算和分析。

由于时间序列数据工作负载非常大,因此它们需要能够轻松处理庞大数据集的数据库。Apache Arrow专门为移动大量列数据而设计。在Arrow上构建数据库为开发人员提供了更多的选择,通过先进的数据分析以及实施机器学习和人工智能工具(比如Pandas),有效地处理其数据。

一些人可能忍不住将Arrow用作当前解决方案的外部工具。然而,这种方法行不通,因为如果数据库没有从源头返回Arrow格式的数据,生产级应用程序将难以确保有足够的内存来处理庞大数据集。代码源也将缺乏Arrow提供的压缩功能。在网络上传输未有效压缩的字节会增加数据库和代码之间的延迟,从而对整体性能产生负面影响。

降低学习难度

在Apache生态系统上构建InfluxDB提供了向时间序列数据库添加SQL支持功能的机会。InfluxDB使用DataFusion作为查询引擎,而DataFusion使用SQL作为查询语言,这意味着凡是懂SQL的人现在都可以查询时间序列,不需要使用另外的语言。

为了进一步增强易访问性,DataFusion中已经有三个专门针对时间序列的函数。这些都是开源的,因此Apache Arrow社区的任何人都可以从中受益或为它们贡献代码。

1 date_bin() – Creates rows that are time windows of data with an aggregate.

2 selector_first(), selector_last() – Provide the first or last row of a table that meet specific criteria.

3 time_bucket_gapfill() – Returns windowed data, and if there are windows that lack data it will fill those gaps.

结论

与关系数据相比,时间序列数据有不同的特征、存储需求和工作负载。由于数据类型看起来相似,所以在流程的早期意识到这些差异很重要。生产环境中的这些问题发现得越晚,解决起来就越困难。

时间序列数据与像InfluxDB这样的时间序列数据库最兼容,以支持高摄取率下的低延迟、写时模式数据收集的灵活性以及高级数据分析。InfluxDB中的原生SQL支持使得SQL用户更容易访问时间序列数据工作负载。

您只需将时间序列数据库添加到技术堆栈中,即可避免或应对上述任何陷阱。

原文标题:Don’t Let Time Series Data Break Your Relational Database,作者:Jessica Wachtel

责任编辑:华轩 来源: 51CTO
相关推荐

2011-10-11 17:07:12

数据库Internet文件数据库

2023-10-16 13:26:00

RDBMS关系数据库

2009-07-10 09:28:41

NoSQL关系数据库

2023-10-10 11:18:42

Spring数据库

2020-03-14 16:37:09

数据库IT技术

2011-03-15 14:54:08

NoSQL

2009-03-26 11:10:13

关系数据库关系型数据库数据库

2010-09-15 14:09:01

GraphDataba

2011-07-18 09:54:47

云计算分片关系数据库关系数据库

2023-02-16 17:44:13

2023-08-01 14:35:00

关系数据库排列

2018-10-15 13:57:38

Hadoop数据库MySQL

2023-01-06 08:00:00

关系数据库数据库机器学习

2009-03-03 09:54:41

云计算关系数据库数据库

2011-05-19 10:29:40

对象数据库关系数据库

2011-09-27 13:41:09

数据库

2009-10-29 11:01:52

Amazon RDSMySQL关系数据库

2009-08-25 09:09:33

关系数据库数据库革命RDBMS

2011-09-27 10:44:07

NewSQL云计算

2019-07-10 08:00:00

数据库关系数据库分布式
点赞
收藏

51CTO技术栈公众号