前言
TimescaleDB是一个开源数据库,旨在使SQL可扩展到时间序列数据。它由PostgreSQL设计而成,并打包为PostgreSQL扩展,提供跨时间和空间的自动分区(分区键),以及完整的SQL支持。自从2.0版本发布之后,也可以支持多节点部署,以下内容摘自官方介绍:
所有节点开始时都是独立的TimescaleDB实例,即主机运行PostgreSQL服务器并加载TimescaleDB扩展。这是对说明书中的“接入节点”和“数据节点”的假设。关于架构的更多细节可以在架构部分找到。
TimescaleDB多节点可以作为自管理部署的一部分创建,也可以作为托管云部署(即将推出)创建。为了设置自管理集群,包括如何配置节点进行安全通信和跨服务器创建用户/角色,请在继续之前遵循以下说明。
在Timescale
Cloud和Forge的例子中,创建的服务已经包含加载了TimescaleDB的PostgreSQL,并且创建的用户tsdbadmin是超级用户。在这种情况下,您所需要做的就是决定哪个服务应该是访问节点,并按照下一节中的说明进行操作。随着TimescaleDB多节点在这些云平台上可用,将提供更多信息。
部署
此处选择操作系统版本为ubuntu20.04.1
postgresql部署
选择v12.x 版本,安装过程此处省略,官方部署直通车
timescaledb插件部署
- 添加TimescaleDB第三方存储库
echo "deb https://packagecloud.io/timescale/timescaledb/ubuntu/ $(lsb_release -c -s) main" | sudo tee /etc/apt/sources.list.d/timescaledb.list
- 安装 TimescaleDB GPG key
wget --quiet -O - https://packagecloud.io/timescale/timescaledb/gpgkey | sudo apt-key add -
- 更新源
apt update
- 安装插件
apt install timescaledb-2-postgresql-12 -y
-
修改 postgresql.conf
将#shared_preload_libraries =‘’ 改为 shared_preload_libraries =‘timescaledb’,一般两种方式修改
1、timescaledb-tune
此处不介绍
2、手动修改
默认路径在/etc/postgresql/12/main,不同系统有所区别
-
重启postgresql
systemctl restart postgresql
- 测试
新建 timescaledb1数据库,运行sql
CREATE EXTENSION IF NOT EXISTS timescaledb;
配置多节点
此处采用一个postgresql 多数据库测试,生产环境可采用多个postgresql
- 新增节点
# "add_data_node"("node_name" name, "host" text, "database" name=NULL::name, "port" int4=NULL::integer, "if_not_exists" bool=false, "bootstrap" bool=true, "password" text=NULL::text)
SELECT add_data_node('data_node1', '192.168.195.128', 'timescaledb2', 5432, false, true, '123456');
SELECT add_data_node('data_node2', '192.168.195.128', 'timescaledb3', 5432, false, true, '123456');
参数 | 描述 |
---|---|
node_name | 要用于数据节点的本地名称 |
host | 远程数据节点的主机名 |
database | 远程数据节点的数据库名 |
port | 远程数据节点的端口 |
if_not_exists | 如果数据节点已经存在,请不要失败。默认为FALSE |
bootstrap | 引导远程数据节点。默认为TRUE |
password | 远程数据节点的密码 |
- 配置节点映射
CREATE USER MAPPING FOR postgres SERVER data_node1 OPTIONS (user 'postgres', password '123qwe');
CREATE USER MAPPING FOR postgres SERVER data_node2 OPTIONS (user 'postgres', password '123qwe');
- 创建测试表
CREATE TABLE conditions (
time TIMESTAMPTZ NOT NULL,
location TEXT NOT NULL,
temperature DOUBLE PRECISION NULL,
humidity DOUBLE PRECISION NULL
);
- 创建分布式超表
SELECT create_distributed_hypertable('conditions', 'time');
可能出现的错误
修改postgresql.conf #max_prepared_transactions = 0 为 max_prepared_transactions = 150 官方推荐150,可自行测试更改;保存并重启postgresql服务
- 修改分片策略(可选)
官方推荐不超过主内存的25%
The key property of choosing the time interval is that the chunk
(including indexes) belonging to the most recent interval (or chunks
if using space partitions) fit into memory. As such, we typically
recommend setting the interval so that these chunk(s) comprise no more
than 25% of main memory.
此处用于测试设置24小时
SELECT set_chunk_time_interval('conditions', interval '24 hours');
- 测试
插入数据
INSERT INTO "public"."conditions"("time", "location", "temperature", "humidity") VALUES ('2023-04-23 18:22:10-07', '当地', '32', '50');
INSERT INTO "public"."conditions"("time", "location", "temperature", "humidity") VALUES ('2023-04-24 18:22:10-07', '当地', '32', '50');
INSERT INTO "public"."conditions"("time", "location", "temperature", "humidity") VALUES ('2023-04-25 18:22:10-07', '当地', '32', '50');
INSERT INTO "public"."conditions"("time", "location", "temperature", "humidity") VALUES ('2023-04-26 18:22:10-07', '当地', '32', '50');
INSERT INTO "public"."conditions"("time", "location", "temperature", "humidity") VALUES ('2023-04-27 18:22:10-07', '当地', '32', '50');
INSERT INTO "public"."conditions"("time", "location", "temperature", "humidity") VALUES ('2023-04-28 18:22:10-07', '当地', '32', '50');
结论
如上配置则显示成功,可得出以下结果:
1、主数据库不存储数据,都是以外部表的形式存在
2、节点只存储部分分片数据