TDengine
简介
- TDengine是一个高效的存储、查询、分析时序大数据的平台,专为物联网、车联网、工业互联网、运维监测等优化而设计。你可以像使用关系型数据库MySQL一样来使用它,简单又方便
特点
- 数据是时序的,一定带有时间戳
- 数据是结构化的
- 数据极少有更新或删除操作
- 数据源是唯一的
- 相对于互联网,写多读少
- 用户关注的是一段时间的趋势,而不是某一特定时间点的值
- 数据是有保留期限的
- 数据的查询分析一定是基于时间段和地理区域的
一个数据采集点一张表:对每个数据采集点单独建表(比如有一千万个智能电表,就需创建一千万张表,上述表格中的d1001, d1002, d1003, d1004都需单独建表)
SQL
---- 创建库(这个库的数据将保留 365 天(超过 365 天将被自动删除),每 10 天一个数据文件,内存块数为 6,允许更新数据)
CREATE DATABASE power KEEP 365 DAYS 10 BLOCKS 6 UPDATE 1;
---- 创建超级表
CREATE STABLE meters (ts timestamp, current float, voltage int, phase float) TAGS (location binary(64), groupId int);
---- 以超级表为模板创建数据表
create table test using meter tags('California.SanFrancisco', 2);
---- 单独创建表
create table t (ts timestamp, speed int);
---- 一次插入多条数据
INSERT INTO d1001 VALUES (1538548684000, 10.2, 220, 0.23) (1538548696650, 10.3, 218, 0.25);
---- 一次写入多表
INSERT INTO d1001 VALUES (1538548685000, 10.3, 219, 0.31) (1538548695000, 12.6, 218, 0.33) d1002 VALUES (1538548696800, 12.3, 221, 0.31);
---- 插入记录时自动创建表
INSERT INTO d21001 USING meters TAGS ('California.SanFrancisco', 2) VALUES ('2021-07-13 14:06:32.272', 10.2, 219, 0.32);
insert into device01 using device_category tags('shanghai',11) values ('2022-08-04 05:20:00','集控器','as0001',1, 35.1)
-- 关联超级表的时候只需要最开始的初始化表的时候using stable,后续写入数据不需要带using:
insert into device01 values (now(),'ZigBee窗帘','as0006',1, 35.1);
---- 分页查询
select * from device01 limit 10 offset 2;
超级表可以直接查询数据:
select * from test.meters limit 10;
-
超级表
采集点的静态属性往往可以作为标签,比如采集点的地理位置、设备型号、设备组 ID、管理员 ID 等等。标签的 schema 可以事后增加、删除、修改。具体定义以及细节请见 TAOS SQL 的超级表管理 章节 -
更新数据:
-
- 创建数据库时使用默认参数,数据库的 update 属性为 0,相同时间戳的数据丢失,此时数据无法更新;
-
- update设置为1时,插入的数据使用重复时间戳,会覆盖之前的数据
写入操作
- 写入数据时,先将数据点写进 Commit日志,然后转发给同一虚拟节点组里的其他节点,再按列写入分配的内存块。当内存块的剩余空间达到一定临界值或设定的commit 时间时, 内存块的数据将写入硬盘。内存块是固定大小(如16K)的,但依据系统内存的大小,每个采集点可以分配一个到多个内存块,采取 LRU 策略进行管理。在一个内存块里,数据是连续存放的,但块与块是不连续的,因此TDengine为每一个表在内存里建立有块的索引,以方便写入和查询。
- 数据先写入预写日志,然后再写入vnode(虚拟数据节点),然后定期或者达到存储上限把数据flush到硬盘
TDengine 在数据落盘时会打开新的预写日志文件,在落盘后则会删除老的预写日志文件,避免日志文件无限制的增长
连续查询
- 连续查询是 TDengine 定期自动执行的查询,采用滑动窗口的方式进行计算,是一种简化的时间驱动的流式计算
数据聚合
- 查询温度传感器t1记录的温度没五分钟的平均值:
select avg(degree) from t1 interval(5);
- 查询上海所有温度传感器记录的温度没五分钟的平均值(超级表:t_master):
select avg(degree) from t_master where location='shanghai' interval(5);
数据压缩
- 采取列式存储,便于压缩
- 不同数据采用不同的压缩算法,包括delta-delta编码、sample 8B方法、zig-zag编码、LZ4等算法
- 二阶段压缩:压缩的基础上,用通用压缩算法进行再压缩
数据迁移
注:超级表不可导入
使用taosdump工具
安装taosdump
- 下载taosdum工具压缩包并拷贝到对应的目录:
sudo cp /mnt/e/file/tdengine/taosTools-2.0.0-Linux-x64.tar.gz /usr/local/td
- 解压并安装
sudo tar -zxvf taosTools-2.0.0-Linux-x64.tar.gz
sudo ./install-taostools.sh
步骤:
- 创建导出目录:
mkdir -p /tmp/dump/db0
mkdir -p /tmp/dump/stb1
mkdir -p /tmp/dump/tb1
- 导出:
- 导出数据库
tasodump -h td2.server.com -u root -ptaosdata -o /tmp/dump/db0 -T 8 rain
- 导出指定的超级表:
tasodump -h td2.server.com -u root -ptaosdata -o /tmp/dump/stb1 -T 8 rain master_test
- 导出指定的表:
tasodump -h td2.server.com -u root -ptaosdata -o /tmp/dump/tb1 -T 8 rain test1
- 导入
- 导入数据库
tasodump -h td2.server.com -u root -ptaosdata -i /tmp/dump/db0 -T 8
- 导入指定的超级表:
tasodump -h td2.server.com -u root -ptaosdata -i /tmp/dump/stb1 -T 8
- 导入指定的表:
tasodump -h td2.server.com -u root -ptaosdata -i /tmp/dump/tb1 -T 8
数据文件
- 导出(导出文件在根目录 ~)(测试1w条数据,导出耗时0.021766s)
select * from test1 >> data.csv
- 导入(测试1w条数据,导入耗时0.024142s、0.025041s)
insert into test1 file 'usr/local/td/file/data.csv'
数据导入:source
taos> source "/usr/local/taos/data.sql";
sql文件类似:
create database if not exists rain;
USE rain;
create stable if not exists power(ts timestamp, voltage int, current float, temperature float) tags(sn int, city nchar(64), groupid int);
create table if not exists device1 using power tags(1, "太原", 1);
create table if not exists device2 using power tags(2, "西安", 2);
insert into device1 values("2022-09-04 21:03:38.734", 1, 1.0, 1.0);
insert into device2 values("2022-09-04 21:03:40.734", 2, 2.0, 2.0);
基于DataX的TDengine数据迁移工具
环境准备
- 下载DataX源码:git clone https://github.com/taosdata/DataX.git
- 安装jdk环境
- 安装Python环境
- 配置maven
步骤
- 运行打包DadaX项目:
cd DataX
mvn -U clean package assembly:assembly -Dmaven.test.skip=true
- 拷贝到虚拟机上:
cp target/datax.tar.gz your_install_dir
cd your_install_dir
tar -zxvf dataX.tar.gz
- 配置json文件:
{
"job": {
"content": [{
"reader": {
"name": "mysqlreader",
"parameter": {
"username": "root",
"password": "root",
"column": ["id","name"],
"splitPk": "id",
"connection": [{
"table": ["t_employee"],
"jdbcUrl": ["jdbc:mysql://192.168.15.152:3306/rain"]
}]
}
},
"writer": {
"name": "tdenginewriter",
"parameter": {
"host": "192.168.31.56",
"port": 6030,
"dbname": "rain",
"user": "root",
"password": "taosdata",
"batchSize": 1000
}
}
}],
"setting": {
"speed": {
"channel": 1
}
}
}
}
- 运行Python:
python bin/datax.py job/opentsdb2tdengine.json
安装
-
下载安装包:TDengine-server-3.0.0.1-Linux-x64.tar.gz (54.4 M)
-
解压:
sudo tar -zxvf TDengine-server-3.0.0.1-Linux-x64.tar.gz
- 运行安装命令:
sudo ./install.sh
-
配置taos.cfg文件
-
启动
sudo taosd (Ubuntu安装)
卸载
- 卸载压缩包安装方式:
rmtaos
- 卸载 taosTools 命令:
rmtaostools
- Deb安装方式的卸载
sudo dpkg -r tdengine
- 清除文件:
sudo rm -rf /var/log/taos/
sudo rm -rf /var/lib/taos/
sudo rm -rf /etc/taos/taos.cfg