TSDB-时序数据库的初步尝试笔记

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"}