时序数据库TimescaleDB 功能介绍、单节点、集群安装部署、centos、linux

简介

Timescale Documentation | Getting started with Timescale

Timescale是一个用于时间序列,事件和分析的PostgreSQL数据平台。 提供了PostgreSQL的可靠性,这是时间序列的超能力 TimescaleDB,。它提供 自动备份和还原、复制的高可用性等功能, 无缝缩放和调整大小等等

性能对比:TimescaleDB vs. InfluxDB:专为时间序列数据构建

优势

  1. 优化的查询性能:TimescaleDB 使用了分区和数据分片技术,将数据分散到多个分区中,从而可以并行处理查询操作。这使得查询性能得到显著提升,特别是在大数据量的情况下。
  2. 无缝集成:TimescaleDB 是基于 PostgreSQL 构建的扩展,因此可以轻松地与现有的 PostgreSQL 生态系统集成。你可以继续使用 PostgreSQL 的功能,同时获得时间序列数据处理的优势。
  3. 连续聚合:连续聚合是 TimescaleDB 的一个强大特性,它允许在数据插入的同时计算和维护聚合数据,从而大大减少了后续查询的计算成本。
  4. 自动数据分层:TimescaleDB 支持数据分层,可以将历史数据分为不同的层级,从而更有效地管理长期存储的数据。这有助于在保持查询性能的同时控制存储成本。
  5. 高可用性和容错性:TimescaleDB 支持在集群中复制数据以实现高可用性和容错性。你可以设置主从复制或多节点集群来确保数据的可靠性和持续性。
  6. 丰富的时间序列函数和操作:TimescaleDB 提供了许多针对时间序列数据的内置函数和操作,使你可以轻松地进行时间序列分析和操作。
  7. 社区支持和活跃度:TimescaleDB 拥有一个活跃的开源社区,不断更新和改进,同时提供文档和支持,使用户能够更好地使用和理解该技术。
  8. 可扩展性:由于 TimescaleDB 基于 PostgreSQL,因此它继承了 PostgreSQL 的可扩展性特性。你可以根据需要调整硬件和配置,以适应不断增长的数据量和查询负载

 

术语

Hypertables(超级表)

它将时间序列数据根据时间进行分区和组织,从而实现更高效的查询性能

distributed hypertable(分布式超表)

使用空间分区,将数据分布存储在多个数据节点上

Chunks(块)

TimescaleDB自动将Hypertable分割成块,每个块对应于一个特定的时间间隔和一个分区键。这些分区是不重合的,这有助于查询器进行查询

连续聚合

连续聚集表是TimescaleDB的一个重要特性,它可以在后台自动维护预定义的聚合数据。通过使用连续聚集表,可以极大地提高大规模时序数据的查询性能

核心概念

数据模型

PostgreSQL JSON和JSONB:如果您正在使用半结构化数据,例如来自 IoT 传感器的读数 如果收集不同的测量值,您可能需要灵活的架构。在此 在这种情况下,您可以使用PostgreSQL JSON和JSONB数据类型。

 

关系型:固定模式的关系数据结构

 

由于Timescale底层基于PostgreSQL做数据存储,不仅支持普通的PostgreSQL表,还支持超表,超表是Timescale对时间序列数据存储和查询的优化。

普通表

普通的PostgreSQL表

超表(Hypertables)

超表是专门为时间序列数据设计的,一个 超级表始终按时分区,但也可以在 其他列也是如此。超表的另一个特别之处在于 它们被分解为称为块的较小表

分布式超表

分布式超表是跨多个节点的超表,分布式超表用于多节点群集。每个集群都有一个 访问节点和多个数据节点。您可以使用 访问节点,并且数据存储在数据节点上

超级表的每个区块仅保存特定时间范围的数据。当你 插入尚未具有区块的时间范围(时间刻度)的数据 自动创建一个区块来存储它。

 

完整的 SQL

Timescale 支持完整的 SQL,因此无需学习自定义查询语言

数据插入

提供并行复制工具 ,支持多种数据导入:标准sql-insert写入、Prometheus 、Kafka 、.csv文件导入

连续聚合

连续聚集表是TimescaleDB的一个重要特性,它可以在后台自动维护预定义的聚合数据。通过使用连续聚集表,可以极大地提高大规模时序数据的查询性能

 

物化视图

是一个标准的PostgreSQL函数。 它们用于缓存复杂查询的结果,以便您可以重用它 后来。实例化视图不会定期更新,但您可以手动更新 根据需要刷新它们

连续聚合

自动更新的物化视图

实时聚合

即在查询时将聚合数据和原始数据结合起来,以获得新的结果,连续聚合视图默认开启了实时聚合,如果关闭,则在查询的时候,只会查询已经物化的数据。

聚合函数

函数允许您将数据聚合到 时间桶,例如:5 分钟、1 小时或 3 天。TimescaleDB提供了一系列内置的时间序列聚合函数,用于计算给定时间范围内的统计信息,如平均值、最大值、最小值等。

 

例子:在名为 的表中计算每日平均温度。该表具有一个名为的时间列和一列:weather_conditions、 time 、temperature

SELECT time_bucket('1 day', time) AS bucket,
  avg(temperature) AS avg_temp
FROM weather_conditions
GROUP BY bucket
ORDER BY bucket ASC;

 

超函数

超函数是一组专门的函数,允许您 分析时间序列数据。您可以使用超函数来分析任何内容 已存储为时间序列数据,包括物联网设备、IT 系统、营销 分析、用户行为、财务指标和加密货币。

超函数允许您快速执行关键的时间序列查询, 分析时间序列数据,并提取有意义的信息。他们的目标是 识别、构建和组合 SQL 需要执行的所有功能 将时间序列分析到单个扩展

 

存储管理

分区

 

时间分区:

当创建和使用超级表时,它会自动按时间对数据进行分区, 并可选择按空间分区

每个超级表都由称为块的子表组成。分配的每个块 时间范围,并且仅包含该范围的数据。默认情况下,每个区块包含 7 天,可以通过chunk_time_interval来进行设置。分布式超表默认使用空间分区。

 

空间分区

建议对分布式超级表使用空间分区,以实现高效的横向扩展性能。对于仅存 在于单个节点上的常规超表,额外的分区可用于特殊用例,不建议大多数用户使用

空间分区使用散列:每个不同的项目都被散列到 N 个存储桶之一。请记住,我们已经在使用(灵活的)时间间隔来管理块大小;空间分区的主要目的是在同一时间间隔内跨多个数据节点(在分布式超级表的情况下)或跨多个磁盘(在单节点部署的情况下)实现并行化

压缩

压缩时序数据可以进一步减少区块大小 超过90%。这样可以节省存储成本,并使查询保持运行 闪电般的速度。

支持按照时间进行自动压缩和手动压缩和解压,在查询期间,未压缩的块将被正常处理,而来自压缩块的数据将在查询时首先被解压缩并转换为标准行格式

 

数据保留

可帮助您通过删除旧数据来节省存储成本。您可以 将数据保留与连续聚合相结合,以降低您的采样数据。

在时间序列应用程序中,随着数据年龄的增长,数据通常变得不那么有用。如果 您不需要您的历史数据,您可以在达到一定数据后将其删除 年龄。Timescale 允许您设置自动数据保留策略以丢弃旧数据。你 还可以通过手动删除块来微调数据保留。

通常,您希望保留历史数据的摘要,但不需要 原始数据。您可以通过将数据保留与连续聚合相结合来对旧数据进行缩减采样。

 

数据分层(云端体验版)

通过将数据分层到低成本对象存储层(S3)来节省存储成本

 

 

备份还原

支持PostgreSQL提供的相关功能

 

复制和副本功能

TimescaleDB支持复制和副本功能,可以在多个节点上创建超级表的副本,实现数据冗余和高可用性

 

高可用

TimescaleDB 的多节点安装可以高度可用 通过为群集中的每个节点设置一个或多个备用节点,或者通过 在区块级别本机复制数据。

 

限制

局限性

虽然Timescale通常提供的功能超出了范围 PostgreSQL提供,使用超表有一些限制, 特别是分布式超表。本节文档 同时使用常规和分布式时的常见限制 超级表。

超表限制

  • 不支持引用超表的外键约束。
  • 用于分区的时间维度(列)不能具有 NULL 值。
  • 唯一索引必须包括正在分区的所有列 尺寸。
  • UPDATE在分区(块)之间移动值的语句不是 支持。这包括更新插入 ()。INSERT ... ON CONFLICT UPDATE

分布式超表限制

常规超表的所有限制也适用于分布式 超级表。此外,以下限制特别适用 到分布式超表:

  • 不支持后台作业的分布式调度。后台作业 在访问节点上创建的内容在此访问节点上调度和执行 无需将作业分发到数据节点。
  • 连续聚合可以聚合分布在数据节点上的数据,但 连续聚合本身必须位于访问节点上。这可以 对可以扩展安装的程度进行限制,但因为 连续聚合是数据的下采样,这通常不是 制造问题。
  • 不支持对区块重新排序。
  • 表空间不能附加到访问上的分布式超表 节点。仍然可以在数据节点上附加表空间。
  • 假定角色和权限在 分布式数据库,但不强制实施一致性。
  • 不支持在数据节点上进行联接。使用 加入分布式超表 另一个表要求另一个表驻留在访问节点上。这 还会限制分布式超表上的联接性能。
  • 分布式超表中外键约束引用的表 必须存在于访问节点和所有数据节点上。这也适用于 引用的值。
  • 不支持并行感知扫描和追加。
  • 分布式超表本身不提供一致的还原点 用于跨节点备份和还原。使用 create_distributed_restore_point 命令,并确保在将单个备份还原到 访问和数据节点。
  • 有关本机复制限制,请参阅本机复制部分
  • 用户定义的函数必须手动安装在数据节点上,以便 函数定义在访问节点和数据节点上都可用。 这对于注册到 的函数尤其相关。set_integer_now_func

请注意,这些限制涉及访问节点的使用。一些 当前不支持的功能可能仍适用于单个数据节点, 但这种用法既未经测试,也未得到官方支持。未来版本 的时间尺度可能会消除其中一些限制。

安装单节点

添加 PostgreSQL 第三方存储库

 

yum install https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm

创建 TimescaleDB 存储库

tee /etc/yum.repos.d/timescale_timescaledb.repo <<EOL
[timescale_timescaledb]
name=timescale_timescaledb
baseurl=https://packagecloud.io/timescale/timescaledb/el/$(rpm -E %{rhel})/\$basearch
repo_gpgcheck=1
gpgcheck=0
enabled=1
gpgkey=https://packagecloud.io/timescale/timescaledb/gpgkey
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
metadata_expire=300
EOL

更新本地存储库列表:

yum update

安装TimescaleDB数据库:

yum install timescaledb-2-postgresql-14

初始化数据库:

/usr/pgsql-14/bin/postgresql-14-setup initdb

#使用timescaledb-tune脚本配置数据库完成安装后,您需要配置数据库以便可以使用它。
#最简单的方法是运行timescaledb-tune 脚本,它包含在timescaledb-tools软件包中
timescaledb-tune --pg-config=/usr/pgsql-14/bin/pg_config --quiet --yes

配置PostgreSQL

vim /var/lib/pgsql/14/data/postgresql.conf
将#port=5432前面的#删除
将#listen_addresses = 'localhost'改成listen_addresses = '*'

vim /var/lib/pgsql/14/data/pg_hba.conf
在最后面添加一行如下代码,然后保存
host    all             all             0.0.0.0/0               trust

启动PostgreSQL

systemctl enable postgresql-14
systemctl start postgresql-14

## 查看状态
systemctl status postgresql-14

修改postgres账号的密码

# 切换到postgres用户
su - postgres

# 登录数据库
psql

# 修改密码
alter user postgres password '新的密码';

重启服务

sudo systemctl restart postgresql-14.service

时序数据库构建

su - postgres
# 创建库或直接使用postgres库
createdb mydatabase

# 连接到该数据库
psql mydatabase

# 在数据库中加载 TimescaleDB 扩展
CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;

超级表创建

-- 链接数据库
psql -U postgres -h localhost -d mydatabase

-- 创建超级表
CREATE TABLE conditions (
    time        TIMESTAMPTZ       NOT NULL,
    location    TEXT              NOT NULL,
    temperature DOUBLE PRECISION  NULL,
    humidity    DOUBLE PRECISION  NULL
);

-- 对超级表进行分区
SELECT create_hypertable('conditions', 'time');

SELECT create_hypertable('需要使用时序数据库的表名', '时间索引字段');

搭建集群

图显示了访问节点 (AN) 如何对同一中的数据进行分区 跨多个数据节点(DN1、DN2 和 DN3)

 

节点划分

访问节点AN、数据节点DN

修改数据库配置:

vim /var/lib/pgsql/14/data/postgresql.conf
 
# 访问节点AN
max_prepared_transactions = 500
enable_partitionwise_aggregate = on
jit = off
# 数据节点DN
max_prepared_transactions = 500
wal_level = logical

添加数据节点

# 连接访问节点数据库
psql -U postgres -h localhost -d mydatabase

## 添加数据节点
SELECT add_data_node('dn1','172.31.90.74','mydatabase',5432,false,true,'postgres');
SELECT add_data_node('dn2','172.31.82.237','mydatabase',5432,false,true,'postgres');

此时Timescaledb集群就搭建成功了

创建分布式超表(AN访问节点)

# 创建表
CREATE TABLE test2 (
                       time        TIMESTAMPTZ       NOT NULL,
                       location    TEXT              NOT NULL,
                       temperature DOUBLE PRECISION  NULL,
                       humidity    DOUBLE PRECISION  NULL
);
# 创建分布式超表,默认使用所有数据节点
SELECT create_distributed_hypertable('test2', 'time', 'location');

# 插入数据
INSERT INTO test2 VALUES ('2020-12-14 13:45', 1, '1.2');

#给表增加数据节点
SELECT detach_data_node('dn1', 'test2');

免责声明:

1、本站资源由自动抓取工具收集整理于网络。

2、本站不承担由于内容的合法性及真实性所引起的一切争议和法律责任。

3、电子书、小说等仅供网友预览使用,书籍版权归作者或出版社所有。

4、如作者、出版社认为资源涉及侵权,请联系本站,本站将在收到通知书后尽快删除您认为侵权的作品。

5、如果您喜欢本资源,请您支持作者,购买正版内容。

6、资源失效,请下方留言,欢迎分享资源链接

文章评论

0条评论