TSDB-时序数据库的初步尝试笔记
[TOC]
1. 背景
1.1 使用场景
时序数据库是写入时序数据的数据库,典型场景如无人汽车的定时数据采集存储、水文监控、股市变动监控等场景,时间戳是他的关键字。
1.2 场景特点:
写入操作的特点:
- 数据量庞大,需要压缩方案。
- 存储有留存策略(Retention Policy)。一般采用三级存储方案:最上层的内存用做缓存,存储热点数据;下一层的 SSD 用来存储留存期(一般为数周或数月)之内的数据;此外还有一个数据中心用来保留全部数据。
- 写入远多于读取,且绝大部分数据不会被用到。
- 数据总是追加式地写入(顺序写入)。
- 数据写入之后,就不会再被更新(无随机更新)。
- 超出留存期的数据被整块删除(无随机删除)。
读取操作的特点:
- 时序数据存在显著的时间敏感性,越是近期的数据越重要。大部分读取操作所请求的数据集中在最近一天或几天。
- 对时序数据的分析过程中需要进行大量运算(求和、计算变化率等),时序数据库需要高效地支持这些运算。
2. 基本原理和主流厂商
2.1 基本原理
使用timestamp作为作为采集的主键,配合tag组成唯一键值。所有的表和tag合并起来,形成度量表(超级表)。
从属的关系如下:
|-- metric 度量数据集/超级表(所有tag的数据合集) |--- tag_table 某个tag的表,有可能是具体的分表,有可能是筛选的分表 |-- (data) point 具体表的一行,有时间戳 |-- field 具体的数据列,类似column
2.2 数据模型
- metric / measurement: 度量的数据集,类似于关系型数据库中的 table;
- (data) point: 一个数据点,类似于关系型数据库中的 row;
- timestamp: 时间戳,表征采集到数据的时间点;
- tag: 维度列,代表数据的归属、属性,表明是哪个设备/模块产生的,一般不随着时间变化,供查询使用;
- field: 指标列,代表数据的测量值,随时间平滑波动,不需要查询。
2.3 业内厂商
国内较火:
TDengine 涛思数据(开源,北京):https://www.taosdata.com/cn/documentation/
dolphindb (闭源,浙江): https://github.com/dolphindb/Tutorials_CN
国际主流:(hadoop为基础)
influxdb: https://docs.influxdata.com/influxdb/v1.8/guides/
opentsdb:
本次主要研究一下github非常火的TDengine涛思数据的国产数据库。
3. TDengine安装测试
3.1 docker快速安装
使用华为云进行安装的,由于安装依赖glibc的版本,但是云上还有很多其他的应用,升级风险较大,因此采用了docker的安装模式,将常用文件mount到本地中,安装和启动命令如下:
docker run -d -v /root/TDengine/docker_etc:/etc/taos -v /root/TDengine/docker_lib:/var/lib/taos -v /root/TDengine/docker_log:/var/log/taos -p 6030:6030 -p 6035:6035 -p 6041:6041 -p 6030-6040:6030-6040/udp tdengine/tdengine
本地目录如下:
001/root/TDengine>l -tr 总用量 20 drwxr-xr-x 2 root root 4096 10月 26 15:55 docker_etc -rw-r--r-- 1 root root 223 10月 26 15:57 docker.sh drwxr-xr-x 6 root root 4096 10月 26 15:57 docker_lib drwxr-xr-x 2 root root 4096 10月 26 16:20 docker_log drwxr-xr-x 3 root root 4096 10月 26 17:23 setup 001/root/TDengine>
3.2 客户端连接
由于taos的客户端也需要依赖glibc,本地又是mac环境,因此还是直接进入docker进行执行的。
taos的客户端连接,需要在本地安装dll和so进行连接,所谓的支持jdbc是为本地连接库封装了一层,因此如果没有本地控件的话,jdbc和工具也是无法连接的。
3.3 登记查询测试
执行如下命令创建超级表
create table msg_log( ts timestamp, msgid binary(32), chnl binary(10) ) tags( userid binary(60), reqsysid binary(10), msgtype binary(20));
创建具体表,该步骤可以不执行,直接插入会自动创建表
create table a1_msg_log using msg_log tags('a1', '01', '01'); create table a2_msg_log using msg_log tags('a2', '01', '01'); create table a3_msg_log using msg_log tags('a3', '01', '01');
插入数据
insert into a1_msg_log using msg_log tags('a1', '01', '01') values ( now, 'a1001', 'sms'); insert into a1_msg_log using msg_log tags('a1', '01', '01') values ( now, 'a1002', 'sms'); insert into a1_msg_log using msg_log tags('a1', '01', '01') values ( now, 'a1003', 'sms'); insert into a1_msg_log using msg_log tags('a1', '01', '01') values ( now, 'a1004', 'sms'); insert into a1_msg_log using msg_log tags('a1', '01', '01') values ( now, 'a1005', 'sms'); insert into a2_msg_log using msg_log tags('a2', '01', '01') values ( now, 'a2001', 'sms'); insert into a2_msg_log using msg_log tags('a2', '01', '01') values ( now, 'a2002', 'sms'); insert into a2_msg_log using msg_log tags('a2', '01', '01') values ( now, 'a2003', 'sms'); insert into a2_msg_log using msg_log tags('a2', '01', '01') values ( now, 'a2004', 'sms'); insert into a2_msg_log using msg_log tags('a2', '01', '01') values ( now, 'a2005', 'sms'); insert into a3_msg_log using msg_log tags('a3', '01', '01') values ( now, 'a3001', 'sms'); insert into a3_msg_log using msg_log tags('a3', '01', '01') values ( now, 'a3002', 'sms'); insert into a3_msg_log using msg_log tags('a3', '01', '01') values ( now, 'a3003', 'sms'); insert into a3_msg_log using msg_log tags('a3', '01', '01') values ( now, 'a3004', 'sms'); insert into a3_msg_log using msg_log tags('a3', '01', '01') values ( now, 'a3005', 'sms');
查询数据:
describe msg_log; describe a1_msg_log; select * from msg_log where userid='a1' and msgid='a1001' and chnl='sms';
更新数据(不支持):
insert into a1_msg_log using msg_log tags('a1', '01', '01') values ( '2020-10-26 11:07:19.751', 'a1001', 'wechat');
3.4 TDengine的常用SQL
https://www.taosdata.com/cn/documentation/taos-sql/
不支持多遍连接和嵌套,单表查询基本和SQL一样
3.5 长度限制(单行<=16k)
- 数据库名最大长度为33
- 表名最大长度为193,每行数据最大长度16k个字符
- 列名最大长度为65,最多允许1024列,最少需要2列,第一列必须是时间戳
- 标签最多允许128个,可以0个,标签总长度不超过16k个字符
- SQL语句最大长度65480个字符,但可通过系统配置参数maxSQLLength修改,最长可配置为1M
- 库的数目,超级表的数目、表的数目,系统不做限制,仅受系统资源限制
3.6 源码centos7安装
1) 安装环境准备
安装cmake3
sudo yum install -y gcc gcc-c++ make cmake3 epel-release git sudo yum remove -y cmake sudo ln -s /usr/bin/cmake3 /usr/bin/cmake
安装openjdk
sudo yum install -y java-1.8.0-openjdk
安装maven
sudo yum install -y maven
2)源码下载编译
下载
git clone https://github.com/taosdata/TDengine.git cd TDengine
编译
mkdir debug &&cd debug cmake .. && cmake --build .
3)安装(默认+自定义)
到系统目录(不想这样看)
make install
安装TDengine后,默认会在操作系统中生成下列目录或文件: 目录/文件 说明 /usr/local/taos/bin TDengine可执行文件目录。其中的执行文件都会软链接到/usr/bin目录下。 /usr/local/taos/connector TDengine各种连接器目录。 /usr/local/taos/driver TDengine动态链接库目录。会软链接到/usr/lib目录下。 /usr/local/taos/examples TDengine各种语言应用示例目录。 /usr/local/taos/include TDengine对外提供的C语言接口的头文件。 /etc/taos/taos.cfg TDengine默认[配置文件] /var/lib/taos TDengine默认数据文件目录,可通过[配置文件]修改位置. /var/log/taos TDengine默认日志文件目录,可通过[配置文件]修改位置
自定义安装
可以改makefile文件,其实编译的结果文件在debug/build/下面,有bin 和lib文件夹,直接拿出来用就可以了,我这边是在/root/TDengine下面用TDengine_src编译的,然后软链接出来的,在外面写了两个脚本,启动和连接.
[root@VM_0_10_centos TDengine]# l -tr 总用量 24 drwxr-xr-x 16 root root 4096 10月 27 15:33 TDengine_src lrwxrwxrwx 1 root root 43 10月 27 16:56 bin -> /root/TDengine/TDengine_src/debug/build/bin lrwxrwxrwx 1 root root 43 10月 27 16:57 lib -> /root/TDengine/TDengine_src/debug/build/lib drwxr-xr-x 2 root root 4096 10月 27 17:15 etc drwxr-xr-x 6 root root 4096 10月 27 17:16 data -rwxr-xr-x 1 root root 43 10月 27 17:17 start.TDengine.sh drwxr-xr-x 2 root root 4096 10月 27 17:18 log -rwxr-xr-x 1 root root 20 10月 27 17:19 taos.sh
4) 常用配置和脚本
[root@VM_0_10_centos TDengine]# cat ./etc/taos.cfg dataDir /root/TDengine/data logDir /root/TDengine/log charset UTF-8 [root@VM_0_10_centos TDengine]# cat ./start.TDengine.sh ./bin/taosd -c /root/TDengine/etc & [root@VM_0_10_centos TDengine]# cat ./taos.sh ./bin/taos -c ./etc [root@VM_0_10_centos TDengine]#
5)数据测试
客户端连接:(默认端口是6030)
[root@VM_0_10_centos TDengine]# ./bin/taos -h 127.0.0.1 Welcome to the TDengine shell from Linux, Client Version:2.0.6.0 Copyright (c) 2017 by TAOS Data, Inc. All rights reserved. config file:/etc/taos/taos.cfg not found, all variables are set to default taos> use test; Database changed.
初步测试:
create database db; use db; create table t (ts timestamp, a int); insert into t values ('2019-07-15 00:00:00', 1); insert into t values ('2019-07-15 01:00:00', 2); select * from t; drop database db;
压测:
./bin/taosdemo -c ./etc 插入压测数据
查询超级表下记录总条数: select count() from test.meters; 查询10亿条记录的平均值、最大值、最小值等: select avg(f1), max(f2), min(f3) from test.meters; select count() from test.meters where loc="beijing"; 查询areaid=10的所有记录的平均值、最大值、最小值等: select avg(f1), max(f2), min(f3) from test.meters where areaid=10; 对表t10按10s进行平均值、最大值和最小值聚合统计: taos>select avg(f1), max(f2), min(f3) from test.t10 interval(10s);
3.7 restful方式连接:(端口6041)
使用postman或者curl来连接6041接口。
http://49.233.140.2:6041/rest/login/root/taosdata {"status":"succ","code":0,"desc":"/KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04"}