Timescale Documentation | Getting started with Timescale
Timescale是一个用于时间序列,事件和分析的PostgreSQL数据平台。 提供了PostgreSQL的可靠性,这是时间序列的超能力 TimescaleDB,。它提供 自动备份和还原、复制的高可用性等功能, 无缝缩放和调整大小等等
性能对比:TimescaleDB vs. InfluxDB:专为时间序列数据构建
Hypertables(超级表) |
它将时间序列数据根据时间进行分区和组织,从而实现更高效的查询性能 |
distributed hypertable(分布式超表) |
使用空间分区,将数据分布存储在多个数据节点上 |
Chunks(块) |
TimescaleDB自动将Hypertable分割成块,每个块对应于一个特定的时间间隔和一个分区键。这些分区是不重合的,这有助于查询器进行查询 |
连续聚合 |
连续聚集表是TimescaleDB的一个重要特性,它可以在后台自动维护预定义的聚合数据。通过使用连续聚集表,可以极大地提高大规模时序数据的查询性能 |
PostgreSQL JSON和JSONB:如果您正在使用半结构化数据,例如来自 IoT 传感器的读数 如果收集不同的测量值,您可能需要灵活的架构。在此 在这种情况下,您可以使用PostgreSQL JSON和JSONB数据类型。
关系型:固定模式的关系数据结构
由于Timescale底层基于PostgreSQL做数据存储,不仅支持普通的PostgreSQL表,还支持超表,超表是Timescale对时间序列数据存储和查询的优化。
普通表 |
普通的PostgreSQL表 |
超表(Hypertables) |
超表是专门为时间序列数据设计的,一个 超级表始终按时分区,但也可以在 其他列也是如此。超表的另一个特别之处在于 它们被分解为称为块的较小表 |
分布式超表 |
分布式超表是跨多个节点的超表,分布式超表用于多节点群集。每个集群都有一个 访问节点和多个数据节点。您可以使用 访问节点,并且数据存储在数据节点上 |
超级表的每个区块仅保存特定时间范围的数据。当你 插入尚未具有区块的时间范围(时间刻度)的数据 自动创建一个区块来存储它。
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提供,使用超表有一些限制, 特别是分布式超表。本节文档 同时使用常规和分布式时的常见限制 超级表。
UPDATE
在分区(块)之间移动值的语句不是 支持。这包括更新插入 ()。INSERT ... ON CONFLICT UPDATE
常规超表的所有限制也适用于分布式 超级表。此外,以下限制特别适用 到分布式超表:
create_distributed_restore_point
命令,并确保在将单个备份还原到 访问和数据节点。set_integer_now_func
请注意,这些限制涉及访问节点的使用。一些 当前不支持的功能可能仍适用于单个数据节点, 但这种用法既未经测试,也未得到官方支持。未来版本 的时间尺度可能会消除其中一些限制。
yum install https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm
tee /etc/yum.repos.d/timescale_timescaledb.repo <
yum update
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
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
systemctl enable postgresql-14
systemctl start postgresql-14
## 查看状态
systemctl status postgresql-14
# 切换到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','xxx.xx.xx.xx1','mydatabase',5432,false,true,'postgres');
SELECT add_data_node('dn2','xxx.xx.xx.xx2','mydatabase',5432,false,true,'postgres');
此时Timescaledb集群就搭建成功了
# 创建表
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');