TimescaleDB时序数据库初识

注:本文翻译自https://legacy-docs.timescale.com/v1.7/introduction

TimescaleDB是一个开源时间序列数据库,针对快速摄取和复杂查询进行了优化。它说的是“完整的SQL”,因此像传统的关系数据库一样易于使用,并且以以前为NoSQL数据库保留的方式进行扩展。
与这两种选择(关系型与NoSQL)所需要的权衡相比,TimescaleDB为时间序列数据提供了两种方法的最佳选择:

易于使用

  • 完整的SQL接口,支持PostgreSQL本地支持的所有SQL(包括二级索引,非基于时间的聚合,子查询,join,窗口函数)。
  • 连接到任何使用PostgreSQL的客户端或工具,无需更改。
  • 面向时间的特性、API函数和优化。
  • 对数据保留策略的强大支持。

可伸缩性

  • 透明的时间/空间分区,支持向上扩展(单节点)和向外扩展(即将推出)。
  • 高数据写速率(包括批处理提交、内存索引、事务支持、数据回填支持)。
  • 在单个节点上适当大小的块(二维数据分区),以确保即使在大数据大小时也能快速摄取。
  • 跨块和服务器的并行操作。

可靠性

  • 从PostgreSQL设计而来,打包为extension。
  • 经过20多年PostgreSQL研究的可靠基础(包括流复制,备份)。
  • 灵活的管理选项(与现有PostgreSQL生态系统和工具兼容)。

什么是时间序列数据?

时间序列数据是总体上表示系统、流程或行为如何随时间变化的数据。
以时间为中心:数据记录总是有一个时间戳。
仅追加:数据几乎完全是仅追加的(insert)。
最近的:新数据通常是关于最近的时间间隔,我们很少更新或回填关于旧时间间隔的缺失数据。
然而,数据的频率或规律性并不那么重要;它可以每毫秒或每小时收集一次。它也可以定期或不定期收集(例如,当某些事件发生时,而不是在预定义的时间)。
与其他数据(如标准关系“业务”数据)相比,时间序列数据(以及支持它们的数据库)之间的一个关键区别是,对数据的更改是插入,而不是覆盖

时序数据应用场景

监控计算机系统:虚拟机、服务器、容器指标(CPU、空闲内存、网络/磁盘IOPs)、服务和应用程序指标(请求速率、请求延迟)。
金融交易系统:经典证券、新型加密货币、支付、交易事件。
物联网:来自工业机器和设备、可穿戴设备、车辆、物理容器、托盘、智能家居消费设备等传感器的数据。
事件应用:用户/客户交互数据,如点击流、页面浏览量、登录、注册等。
商业智能:跟踪关键指标和业务的整体健康状况。
环境监测:温度、湿度、压力、pH值、花粉计数、空气流量、一氧化碳(CO)、二氧化氮(NO2)、颗粒物(PM10)。

数据模型

作为一个支持完整SQL的关系数据库,TimescaleDB支持灵活的数据模型,可以针对不同的用例进行优化。这使得TimescaleDB与大多数其他时间序列数据库有些不同,后者通常使用“窄表”模型。
具体来说,TimescaleDB既支持宽表模型,也支持窄表模型。在这里,我们将使用一个物联网(IoT)示例讨论这两种模型的不同性能权衡和影响。
想象一下,一个由1000个物联网设备组成的分布式组,旨在以不同的间隔收集环境数据。这些数据可以包括:
Identifiers: device_id, timestamp
Metadata: location_id, dev_type, firmware_version, customer_id
Device metrics: cpu_1m_avg, free_mem, used_mem, net_rssi, net_loss, battery
Sensor metrics: temperature, humidity, pressure, CO, NO2, PM10
例如,您的传入数据可能看起来像这样:

timestampdevice_idcpu_1m_avgfree_memtemperaturelocation_iddev_type
2017-01-01 01:02:00abc12380500MB72335field
2017-01-01 01:02:23def45690400MB64335roof
2017-01-01 01:02:30ghi7891200MB5677roof
2017-01-01 01:03:12abc12380500MB72335field
2017-01-01 01:03:35def45695350MB64335roof
2017-01-01 01:03:42ghi789100100MB5677roof

现在,让我们看看对这些数据建模的各种方法。

窄表模型

大多数时间序列数据库将以下列方式表示这些数据:
将每个指标表示为一个单独的实体(例如,将cpu_1m_avg和free_mem表示为两个不同的东西)
为该指标存储一系列“时间”、“值”对
将元数据值表示为与该度量/标记集组合相关联的“标记集”
在此模型中,每个度量/标记集组合被认为是包含时间/值对序列的单个“时间序列”。
使用我们上面的例子,这种方法会产生9个不同的“时间序列”,每一个都由一组唯一的标签定义。

1. {name:  cpu_1m_avg,  device_id: abc123,  location_id: 335,  dev_type: field}
2. {name:  cpu_1m_avg,  device_id: def456,  location_id: 335,  dev_type: roof}
3. {name:  cpu_1m_avg,  device_id: ghi789,  location_id:  77,  dev_type: roof}
4. {name:    free_mem,  device_id: abc123,  location_id: 335,  dev_type: field}
5. {name:    free_mem,  device_id: def456,  location_id: 335,  dev_type: roof}
6. {name:    free_mem,  device_id: ghi789,  location_id:  77,  dev_type: roof}
7. {name: temperature,  device_id: abc123,  location_id: 335,  dev_type: field}
8. {name: temperature,  device_id: def456,  location_id: 335,  dev_type: roof}
9. {name: temperature,  device_id: ghi789,  location_id:  77,  dev_type: roof}

这样的时间序列的数量以每个标签的基数的交叉积为尺度,即(# names) × (# device id) × (# location id) ×(设备类型)。一些时间序列数据库随着基数的增加而挣扎,最终限制了可以存储在单个数据库中的设备类型和设备的数量。
TimescaleDB支持窄模型,并且不像其他时间序列数据库那样受到基数限制。如果您独立地收集每个指标,则狭窄的模型是有意义的。它允许您在添加新标记时添加新指标,而不需要正式的模式更改。
但是,如果使用相同的时间戳收集许多指标,那么窄模型的性能就不那么好了,因为它需要为每个指标编写时间戳。这最终导致更高的存储和摄取需求。此外,关联不同指标的查询也更复杂,因为要关联的每个额外指标都需要另一个JOIN。如果您通常同时查询多个指标,那么将它们存储在一个宽表格式中既快又容易,我们将在下一节中介绍这一点。

宽表模型

TimescaleDB很容易支持宽表模型。在这个模型中,跨多个指标的查询更容易,因为它们不需要join。此外,摄取速度更快,因为只需要为多个指标编写一个时间戳。
一个典型的宽表模型将匹配一个典型的数据流,其中在给定的时间戳中收集多个指标:

timestampdevice_idcpu_1m_avgfree_memtemperaturelocation_iddev_type
2017-01-01 01:02:00abc12380500MB72335field
2017-01-01 01:02:23def45690400MB64335roof
2017-01-01 01:02:30ghi7891200MB5677roof
2017-01-01 01:03:12abc12380500MB72335field
2017-01-01 01:03:35def45695350MB64335roof
2017-01-01 01:03:42ghi789100100MB5677roof

在这里,每一行都是一个新的读数,具有给定时间的一组测量值和元数据。这使我们能够保留数据中的关系,并提出比以前更有趣或探索性的问题。
当然,这不是一种新格式:这是在关系数据库中常见的格式。

关系数据的JOIN操作

TimescaleDB的数据模型与关系数据库还有另一个相似之处:它支持join。具体来说,可以在辅助表中存储额外的元数据,然后在查询时使用该数据。
在我们的示例中,可以有一个单独的位置表,将location_id映射到该位置的其他元数据。例如:

location_idnamelatitudelongitudezip_coderegion
42Grand Central Terminal40.7527° N73.9772° W10017NYC
77Lobby 742.3593° N71.0935° W02139Massachusetts

然后在查询时,通过连接我们的两个表,可以问这样的问题:zip_code 10017中设备的平均free_mem是多少?
如果没有连接,就需要对数据进行非规范化,并将所有元数据存储在每个测量行中。这会导致数据膨胀,并使数据管理变得更加困难。
通过连接,可以独立存储元数据,并且更容易更新映射。
例如,如果我们想要更新location_id 77的“区域”(例如,从“Massachusetts”到“Boston”),我们可以进行此更改,而无需返回并覆盖历史数据。

架构及概念

TimescaleDB是作为PostgreSQL上的扩展实现的,这意味着它在整个PostgreSQL实例中运行。扩展模型允许数据库利用PostgreSQL的许多属性,如可靠性、安全性以及与广泛的第三方工具的连接性。同时,TimescaleDB通过在PostgreSQL的查询规划器、数据模型和执行引擎中添加钩子,充分利用了扩展的高度定制性。
从用户的角度来看,TimescaleDB公开了看似单一的表(称为hypertables),它实际上是保存数据的许多单独表(称为chunks)的抽象或虚拟视图。
chunks是通过将hypertables的数据划分为一个或多个维度来创建的:所有hypertables都按时间间隔进行分区,还可以按设备ID、位置、用户ID等键进行分区。我们有时把这称为“时间和空间”的划分。

Hypertables

与数据交互的主要点是一个超表,它是跨所有空间和时间间隔的单个连续表的抽象,因此可以通过标准SQL查询它。
实际上,与TimescaleDB的所有用户交互都是使用超级表。创建表和索引、修改表、插入数据、选择数据等都可以(也应该)在超级表上执行。[跳转到基本的SQL操作]
超级表由具有列名和类型的标准模式定义,其中至少有一个列指定时间值,一个(可选)列指定额外的分区键。
单个TimescaleDB部署可以存储多个超级表,每个超级表具有不同的模式。
在TimescaleDB中创建超级表需要两个简单的SQL命令:
CREATE TABLE(使用标准SQL语法),然后是SELECT create_hypertable()。
在超级表上自动创建关于时间和分区键的索引,但是也可以创建额外的索引(TimescaleDB支持所有的PostgreSQL索引类型)。

Chunks

在内部,TimescaleDB自动将每个超表分割成块,每个块对应于特定的时间间隔和分区键空间的一个区域(使用散列)。这些分区是不相交的(不重叠的),这有助于查询规划器最小化它在解析查询时必须接触的块集。
每个块都是使用标准数据库表实现的。(在PostgreSQL内部,块实际上是“父”超表的“子表”。)
块的大小合适,确保表索引的所有b树都可以在插入期间驻留在内存中。这避免了在修改这些树中的任意位置时产生震荡。
此外,通过避免过大的块,我们可以在根据自动保留策略删除已删除的数据时避免昂贵的“真空”操作。运行时可以通过简单地删除块(内部表)来执行此类操作,而不是删除单个行。

本地压缩

压缩由TimescaleDB的内置作业调度器框架提供支持。我们利用它来跨超表异步地将单个块从未压缩的基于行的形式转换为压缩的列形式:一旦块足够老,该块将以事务方式从行形式转换为列形式。
使用本机压缩,即使TimescaleDB中的单个超表将以行和列两种形式存储数据,用户也不需要担心这一点:在查询数据时,他们将继续看到标准的基于行的模式。这类似于在解压的列数据上构建视图。
TimescaleDB通过(1)透明地将以标准行格式存储的数据附加到从列格式解压缩的数据中,以及(2)在查询时透明地从选定的行解压缩各个列来实现此功能。
在查询期间,未压缩的块将被正常处理,而来自压缩块的数据将首先被解压缩并在查询时转换为标准行格式,然后再添加或合并到其他数据中。这种方法与您期望从TimescaleDB获得的一切兼容,例如关系连接和分析查询,以及避免处理块的主动约束排除。

单节点vs集群

TimescaleDB在单节点部署和集群部署(开发中)上执行广泛的分区。虽然分区传统上只用于跨多台机器的扩展,但它也允许我们在单台机器上扩展到高写速率(和改进的并行查询)。
TimescaleDB的当前开源版本仅支持单节点部署。值得注意的是,TimescaleDB的单节点版本已经在普通机器上对超过100亿行超级表进行了基准测试,而插入性能没有任何损失。

单节点分区的优势

在单台机器上扩展数据库性能的一个常见问题是内存和磁盘之间的成本/性能权衡。最终,我们的整个数据集将无法装入内存,我们需要将数据和索引写入磁盘。
一旦数据足够大,我们无法在内存中容纳索引的所有页面(例如,b树),那么更新树的随机部分可能涉及从磁盘交换数据。像PostgreSQL这样的数据库为每个表索引保留一个b树(或其他数据结构),以便有效地找到该索引中的值。因此,当您索引更多的列时,问题会变得更加复杂。
但是,由于TimescaleDB创建的每个块本身都存储为一个单独的数据库表,因此它的所有索引只能在这些小得多的表上构建,而不是在一个表示整个数据集的表上构建。因此,如果我们适当地调整这些块的大小,我们可以将最新的表(及其b树)完全放入内存中,并避免这种交换到磁盘的问题,同时保持对多个索引的支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/12626.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

组件间通信案例练习

1.实现父传子 App.vue <template><div class"app"><tab-control :titles["衣服","鞋子","裤子"]></tab-control><tab-control :titles["流行","最新","优选","数码&q…

win10系统wps无法启动(打开文档)

我的win10系统中&#xff0c;之前可以顺畅地打开wps&#xff0c;但最近无法打开文档&#xff0c;停留在启动页面&#xff0c;在任务管理器中可以看到启动的wps线程&#xff0c;如果继续双击文档&#xff0c;线程增加&#xff0c;但依然无法打开文档。 wps版本是刚刚更新的15120…

代码随想录算法训练营第二十五天 | 读PDF复习环节3

读PDF复习环节3 本博客的内容只是做一个大概的记录&#xff0c;整个PDF看下来&#xff0c;内容上是不如代码随想录网站上的文章全面的&#xff0c;并且PDF中有些地方的描述&#xff0c;是很让我疑惑的&#xff0c;在困扰我很久后&#xff0c;无意间发现&#xff0c;其网站上的讲…

海外ASO优化之应用商店本地化

大多数应用可供世界任何地方的用户使用&#xff0c;所以需要以多种不同语言来展示我们的应用。它能够包含在跨地理区域的搜索结果中&#xff0c;从而提高全球可见性和转化率。 1、关键词的研究&#xff0c;对于确定流行的本地关键词至关重要。 在本地化Google Play的应用页面时…

ubuntu 命令调节显示器亮度

1.显示器名字 xrandr -q | grep " connected" HDMI-0 connected primary 1920x108000 (normal left inverted right x axis y axis) 527mm x 297mm DP-4 connected 1920x108019200 (normal left inverted right x axis y axis) 527mm x 297mm 2.调节亮度 xrandr --ou…

java商城系统和php商城系统有什么差异?如何选择?

java商城系统和php商城系统是两种常见的电子商务平台&#xff0c;它们都具有一定的优势和劣势。那么&#xff0c;java商城系统和php商城系统又有哪些差异呢&#xff1f; 一、开发难度 Java商城系统和PHP商城系统在开发难度方面存在一定的差异。Java商城系统需要使用Java语言进…

Android中绘制的两个天气相关的View

文章目录 一、前言二、降雨的代码三、风向代码 一、前言 开发天气相关软件时候&#xff0c;做了两个自定义View&#xff0c;这里进行记录&#xff0c;由于涉及类较多&#xff0c;这里仅包含核心代码&#xff0c;需要调整后才可以运行&#xff0c;自定义View范围仅包含网格相关…

数学建模学习(5):数学建模各类题型及解题方案

一、数学建模常见的题型 总体来说&#xff0c;数学建模赛题类型主要分为&#xff1a;评价类、预测类和优化类三种&#xff0c;其中优化类是最常见的赛题类 型&#xff0c;几乎每年的地区赛或国赛美赛等均有出题&#xff0c;必须要掌握并且熟悉。 二、评价类赛题 综合评价是数学…

Redis详解,包括安装命令,应用场景,优缺点,案列分析,各个开发语言如何应用

目录 1、安装命令2、应用场景3、优缺点4、案例分析5、各个开发语言如何应用&#xff1f; Redis 是一个基于内存的开源数据库系统&#xff0c;被广泛应用于 Web 应用、消息队列、缓存、实时统计等领域。下面是 Redis 的详解&#xff0c;包括安装命令、应用场景和优缺点&#xff…

设计模式(单例模式)

概念 保证指定的类只有一个实例&#xff0c;不能创建出其他的实例 实现方式 1.饿汉模式 1.1 代码展示 package 设计模式;/*** Created with IntelliJ IDEA.* Description:* User: wuyulin* Date: 2023-07-28* Time: 11:28*///单例模式&#xff08;饿汉模式&#xff09; //保证…

408复试day2(7大排序算法)

数据结构 7大排序算法总结&#xff1a; 首先排序分为内排序和外排序&#xff1a; 内排序是指待排序的记录放置在内存&#xff0c;而外排序是指排序的过程中需要对内存进行访问。其中稳定的排序有“插冒归”&#xff0c;即插入排序、冒泡排序、归并排序。 1.冒泡排序 算法原理&a…

SIP视频对讲sip广播网关

SV-PA2是专门对行业用户需求研发的一款SIP音视频对讲&#xff0c;媒体流传输采用标准IP/RTP/RTSP协议。它很好的继承了锐科达话机稳定性好、电信级音质的优点&#xff0c;且完美兼容当下所有基于SIP的主流IPPBX/软交换/IMS平台,如Asterisk, Broadsoft, 3CX, Elastix 等。它集多…

安装MySQL 5.7.20

基本上是这个过程&#xff1a;安装配置MYSQL教程 第一种出现报错&#xff1a; mysqld: Can’t create/write to file D: ools\MySQL\mysql-5.7.32-winx64… 错误原因及其修改方法 可以看见在报错的时候文件的路径是不对的&#xff0c;正确的路径应该是D: \tools\MySQL\mysql…

用脚本快速提取补丁文件

目录 windowsLinux 开发过程中有些情况下需要对不同环境中的文件进行替换&#xff0c;就要从本地找出变更文件&#xff0c;同时找出的变更文件还要和服务器上的目录保持一致&#xff0c;如果只变更了个别文件还可以手动处理&#xff0c;但是如果变更文件数很多的时候&#xff0…

低代码开发重要工具:jvs-flow(流程引擎)审批功能配置说明

流程引擎场景介绍 流程引擎基于一组节点与执行界面&#xff0c;通过人机交互的形式自动地执行和协调各个任务和活动。它可以实现任务的分配、协作、路由和跟踪。通过流程引擎&#xff0c;组织能够实现业务流程的优化、标准化和自动化&#xff0c;提高工作效率和质量。 在企业…

【C++】类和对象(中篇)

类和对象 类的六大默认成员函数一、构造函数1. 构造函数的概念2. 构造函数的特性 二、析构函数1. 析构函数的概念2. 析构函数的特性 三、拷贝构造函数1. 拷贝构造函数的概念2. 拷贝构造函数的特征 四、赋值运算符重载1. 运算符重载2. 赋值运算符重载 五、取地址及 const 取地址…

图神经网络(GNN)入门学习笔记(直观且简单)

文章目录 图的定义和表示可以使用图数据结构的问题将图结构用于机器学习的挑战最基本的图神经网络概述汇聚操作基于信息传递的改进图神经网络全局向量信息的利用 本篇文章参考发表于Distill上的图神经网络入门博客&#xff1a; A Gentle Introduction to Graph Neural Network…

R语言从入门到精通之【R语言的使用】

系列文章目录 1.R语言从入门到精通之【R语言介绍】 2.R语言从入门到精通之【R语言下载与安装】 3.R语言从入门到精通之【R语言的使用】 文章目录 系列文章目录一、新手上路1.R语句构成2.获取帮助3.工作空间二、包1.包的安装2.实践应用总结一、新手上路 1.R语句构成 R语句由函…

LeetCode 2050. Parallel Courses III【记忆化搜索,动态规划,拓扑排序】困难

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

多线程之GCD应用

一些套话 GCD全称是Grand Central Dispatch&#xff0c;它是纯 C 语言&#xff0c;并且提供了非常多强大的函数 GCD的优势&#xff1a; GCD 是苹果公司为多核的并行运算提出的解决方案GCD 会自动利用更多的CPU内核&#xff08;比如双核、四核&#xff09;GCD 会自动管理线程的…