简介
Timescale Documentation | Getting started with Timescale
Timescale是一个用于时间序列,事件和分析的PostgreSQL数据平台。 提供了PostgreSQL的可靠性,这是时间序列的超能力 TimescaleDB,。它提供 自动备份和还原、复制的高可用性等功能, 无缝缩放和调整大小等等
性能对比:TimescaleDB vs. InfluxDB:专为时间序列数据构建
优势
- 优化的查询性能:TimescaleDB 使用了分区和数据分片技术,将数据分散到多个分区中,从而可以并行处理查询操作。这使得查询性能得到显著提升,特别是在大数据量的情况下。
- 无缝集成:TimescaleDB 是基于 PostgreSQL 构建的扩展,因此可以轻松地与现有的 PostgreSQL 生态系统集成。你可以继续使用 PostgreSQL 的功能,同时获得时间序列数据处理的优势。
- 连续聚合:连续聚合是 TimescaleDB 的一个强大特性,它允许在数据插入的同时计算和维护聚合数据,从而大大减少了后续查询的计算成本。
- 自动数据分层:TimescaleDB 支持数据分层,可以将历史数据分为不同的层级,从而更有效地管理长期存储的数据。这有助于在保持查询性能的同时控制存储成本。
- 高可用性和容错性:TimescaleDB 支持在集群中复制数据以实现高可用性和容错性。你可以设置主从复制或多节点集群来确保数据的可靠性和持续性。
- 丰富的时间序列函数和操作:TimescaleDB 提供了许多针对时间序列数据的内置函数和操作,使你可以轻松地进行时间序列分析和操作。
- 社区支持和活跃度:TimescaleDB 拥有一个活跃的开源社区,不断更新和改进,同时提供文档和支持,使用户能够更好地使用和理解该技术。
- 可扩展性:由于 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');
文章来源: 博客园
- 还没有人评论,欢迎说说您的想法!