说明
这里只记录搭建和简单测试过程
不保证
ctrl+c
和ctrl+v
能完整跑起来操作系统使用的
CentOS-7.6.1810 x86_64
PostgreSQL版本号
10.8
TimescaleDB版本号
1.3.0
虚拟机配置
1CPU 2G内存 20G系统盘
这里没有使用数据盘,有需要的可以自行调整!
postgres
用户默认情况下PGDATA变量是/var/lib/pgsql/10/data
TimescaleDB简介
这段介绍是来自德哥的Github文档TimescaleDB介绍
TimescaleDB是基于PostgreSQL数据库打造的一款时序数据库,插件化的形式,随着PostgreSQL的版本升级而升级。
架构图
环境准备
安装PostgreSQL
TimescaleDB安装
TimescaleDB的YUM包已经被集成到PostgreSQL社区源里面,所以直接装就是了
安装软件包
1 | yum install -y timescaledb_10 |
配置PostgreSQL
切换到postgres用户
1 | su - postgres |
在
$PGDATA/postgresql.conf
添加配置
1 | shared_preload_libraries = 'timescaledb' |
重启PostgreSQL
切换到postgres用户
1 | su - postgres |
验证TimescaleDB功能
登录PostgreSQL
1 | psql -U postgres |
创建名为
tutorial
的数据库
1 | CREATE database tutorial; |
切换到
tutorial
数据库
1 | \c tutorial |
加载TimescaleDB的extensions
1 | CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE; |
示例输出
1 | WARNING: |
创建一个普通SQL标准的表
1 | CREATE TABLE conditions ( |
查看表结构
1 | tutorial=# \d conditions |
使用
create_hypertable
创建hypertable
1 | SELECT create_hypertable('conditions', 'time'); |
这时再看表结构的时候,会发现不一样了
1 | tutorial=# \d conditions |
插入数据
1 | tutorial=# INSERT INTO conditions(time, location, temperature, humidity) VALUES (NOW(), 'office', 70.0, 50.0); |
查询数据
1 | tutorial=# SELECT * FROM conditions ORDER BY time DESC LIMIT 100; |
TimescaleDB Tutorials
这里使用TimescaleDB官方的测试样例
地址在这里
纽约TAXI数据透视分析
测试数据
这里直接下载的同时解压压缩包
1 | wget -O - https://timescaledata.blob.core.windows.net/datasets/nyc_data.tar.gz | tar xz |
解压出来有三个文件
nyc_data_contagg.sql
nyc_data.sql
nyc_data_rides.csv
创建数据库
1 | CREATE DATABASE nyc_data; |
创建表结构
1 | psql -U postgres -d nyc_data -h localhost < nyc_data.sql |
导入数据
1 | psql -U postgres -d nyc_data -h localhost -c "\COPY rides FROM nyc_data_rides.csv CSV" |
查看表
1 | nyc_data=# \dt |
查看表结构
- payments
1 | nyc_data=# \d payment_types |
- rates
1 | nyc_data=# \d rates |
- rides
1 | postgres=# \d+ rides; |
查询数据
普通查询
1月1日至1月10日,同车超过两人,每天平均计费是多少
1 | nyc_data=# SELECT date_trunc('day', pickup_datetime) as day, avg(fare_amount) |
查询每天交易了多少笔,只显示头五个记录
1 | nyc_data=# SELECT date_trunc('day', pickup_datetime) as day, COUNT(*) FROM rides |
使用TimescaleDB内置函数
每5分钟间隔为一个BUCKET,输出每个间隔产生了多少笔订单
1 | nyc_data=# SELECT time_bucket('5 minute', pickup_datetime) as five_min, count(*) |
每个城市的TAXI交易量
1 | nyc_data=# SELECT rates.description, COUNT(vendor_id) as num_trips FROM rides |
查看select执行计划
1 | postgres=# EXPLAIN SELECT * FROM rides; |
配合PostGIS插件实现时间+空间数据库
安装PostGIS
1 | yum install -y postgis25_10 |
加载PostGIS
1 | postgres=# create extension postgis; |
修改表结构
1 | postgres=# ALTER TABLE rides ADD COLUMN pickup_geom geometry(POINT,2163); |
查询数据
查询在(lat, long) (40.7589,-73.9851)附近400米范围内,每30分钟有多少辆的士被乘坐
1 | postgres=# SELECT time_bucket('30 minutes', pickup_datetime) AS thirty_min, COUNT(*) AS near_times_sq |
TimescaleDB集群
由于TimescaleDB是PostgreSQL的一个插件,因此可以借助PostgreSQL自身的特性实现集群功能
- 基于流复制实现主从数据同步
- 基于PGPool实现读写分离+主从自动切换
- 基于patroni实现高可用集群
- 基于PostgreSQL-X2实现多主多读+横向扩展的分布式集群