从零开始搭建使用 TDengine:新用户快速上手指南
从零开始搭建使用 TDengine:新用户快速上手指南
1. TDengine 简介
TDengine 是由涛思数据出品的一款专为物联网(IoT)、工业互联网、车联网等场景设计的高性能时序数据库。它具有以下特点:
- 高性能:专为时序数据优化,写入和查询性能优异
- 高压缩比:数据压缩比可达 5-20 倍
- SQL 支持:兼容标准 SQL,学习成本低
- 分布式架构:支持水平扩展
- 多语言支持:提供 C/C++、Java、Python、Go 等多种语言连接器
- 提供丰富的生态圈: 可以和大数据领域的很多工具无缝集成,如 SPARK , FLINK 及 BI 工具等。
2. 环境准备与安装
2.1 系统要求
- 操作系统:Linux、Windows、macOS
- CPU:x64 架构
- 内存:建议 4GB 以上
- 存储:建议使用 SSD
2.2 安装 TDengine
TDengine 可以通过安装包方式、DOCKER 方式及云服务三种方式快速体验 TDengine, 详细见 官网下载页面
2.3 启动 TDengine 服务
# Linux/macOS
sudo systemctl start taosd# 或直接启动
sudo taosd# 检查服务状态
sudo systemctl status taosd
3. 基础概念理解
3.1 核心概念
- 数据库(Database):数据的逻辑容器
- 超级表(Super Table):数据模型模板,定义数据结构
- 子表(Sub Table):基于超级表创建的具体表,存储实际数据
- 标签(Tag):超级表中用于标识和分组子表的静态属性
- 时间戳(Timestamp):每条记录的主键,必须是时间类型,并且必须是第一列
3.2 数据类型
在 TDengine 中支持以下数据类型:
# | 类型 | Bytes | 说明 |
---|---|---|---|
1 | TIMESTAMP | 8 | 时间戳。缺省精度毫秒,可支持微秒和纳秒,详细说明见上节。 |
2 | INT | 4 | 整型,范围 [-2^31, 2^31-1] |
3 | INT UNSIGNED | 4 | 无符号整数,[0, 2^32-1] |
4 | BIGINT | 8 | 长整型,范围 [-2^63, 2^63-1] |
5 | BIGINT UNSIGNED | 8 | 长整型,范围 [0, 2^64-1] |
6 | FLOAT | 4 | 浮点型,有效位数 6-7,范围 [-3.4E38, 3.4E38] |
7 | DOUBLE | 8 | 双精度浮点型,有效位数 15-16,范围 [-1.7E308, 1.7E308] |
8 | BINARY | 自定义 | 记录单字节字符串,建议只用于处理 ASCII 可见字符,中文等多字节字符需使用 NCHAR |
9 | SMALLINT | 2 | 短整型,范围 [-32768, 32767] |
10 | SMALLINT UNSIGNED | 2 | 无符号短整型,范围 [0, 65535] |
11 | TINYINT | 1 | 单字节整型,范围 [-128, 127] |
12 | TINYINT UNSIGNED | 1 | 无符号单字节整型,范围 [0, 255] |
13 | BOOL | 1 | 布尔型,{true, false} |
14 | NCHAR | 自定义 | 记录包含多字节字符在内的字符串,如中文字符。每个 NCHAR 字符占用 4 字节的存储空间。字符串两端使用单引号引用,字符串内的单引号需用转义字符 \' 。NCHAR 使用时须指定字符串大小,类型为 NCHAR(10) 的列表示此列的字符串最多存储 10 个 NCHAR 字符。如果用户字符串长度超出声明长度,将会报错。 |
15 | JSON | JSON 数据类型,只有 Tag 可以是 JSON 格式 | |
16 | VARCHAR | 自定义 | BINARY 类型的别名 |
17 | GEOMETRY | 自定义 | 几何类型,v3.1.0.0 开始支持 |
18 | VARBINARY | 自定义 | 可变长的二进制数据,v3.1.1.0 开始支持 |
19 | DECIMAL | 8 或 16 | 高精度数值类型,取值范围取决于类型中指定的 precision 和 scale,自 v3.3.6.0 开始支持 |
4. 连接 TDengine
4.1 使用 taos 命令行客户端
# 连接本地 TDengine
taos# 连接远程 TDengine
taos -h <hostname> -u <username> -p <password>
4.2 连接参数说明
- 主机地址:默认 localhost
- 端口号:默认 6030(原生连接)或 6041(RESTful 连接)
- 用户名:默认 root
- 密码:默认 taosdata
5. 实践操作:温度监控系统
让我们通过一个实际的温度监控系统来学习 TDengine 的使用。
5.1 创建数据库
-- 创建数据库
CREATE DATABASE IF NOT EXISTS db;-- 使用数据库
USE db;
5.2 创建超级表
-- 创建温度监控超级表
CREATE STABLE IF NOT EXISTS temperature_sensors (ts TIMESTAMP, -- 时间戳(主键)temperature FLOAT, -- 温度值humidity FLOAT, -- 湿度值status INT -- 设备状态(0=正常,1=异常)
) TAGS (device_id NCHAR(50), -- 设备IDlocation NCHAR(100), -- 设备位置device_type NCHAR(50) -- 设备类型
);
5.3 创建子表
-- 创建具体的传感器子表
CREATE TABLE sensor_001 USING temperature_sensors
TAGS ('SENSOR_001', '办公室A', '温湿度传感器');CREATE TABLE sensor_002 USING temperature_sensors
TAGS ('SENSOR_002', '机房B', '温湿度传感器');CREATE TABLE sensor_003 USING temperature_sensors
TAGS ('SENSOR_003', '仓库C', '温度传感器');
5.4 插入数据
-- 插入单条数据
INSERT INTO sensor_001 VALUES (NOW, 25.6, 60.5, 0);-- 批量插入数据
INSERT INTO sensor_001 VALUES
('2024-01-01 08:00:00', 24.5, 58.2, 0)
('2024-01-01 08:05:00', 24.8, 59.1, 0)
('2024-01-01 08:10:00', 25.2, 60.3, 0);-- 多表同时插入
INSERT INTO
sensor_001 VALUES ('2024-01-01 09:00:00', 26.1, 61.2, 0)
sensor_002 VALUES ('2024-01-01 09:00:00', 22.8, 55.6, 0)
sensor_003 VALUES ('2024-01-01 09:00:00', 28.3, 0, 0);
5.5 查询数据
-- 查询最新数据
SELECT * FROM sensor_001 ORDER BY ts DESC LIMIT 10;-- 查询指定时间范围的数据
SELECT ts, temperature, humidity
FROM sensor_001
WHERE ts >= '2024-01-01 08:00:00' AND ts < '2024-01-01 10:00:00';-- 聚合查询:计算平均温度
SELECT AVG(temperature) as avg_temp, MAX(temperature) as max_temp
FROM sensor_001
WHERE ts >= NOW - 1h;-- 按时间窗口聚合
SELECT _wstart, AVG(temperature) as avg_temp
FROM sensor_001
WHERE ts >= NOW - 24h
INTERVAL(1h);
5.6 超级表查询
-- 查询所有传感器的最新数据
SELECT last_row(*) FROM temperature_sensors;-- 按设备位置分组统计
SELECT location, AVG(temperature) as avg_temp, COUNT(*) as data_count
FROM temperature_sensors
WHERE ts >= NOW - 1d
GROUP BY location;-- 查询异常设备
SELECT DISTINCT device_id, location
FROM temperature_sensors
WHERE status = 1 AND ts >= NOW - 1h;
6. 高级功能
6.1 时间窗口查询
-- 滑动窗口:每小时的平均温度
SELECT _wstart, _wend, AVG(temperature)
FROM sensor_001
WHERE ts >= NOW - 7d
INTERVAL(1h) SLIDING(30m);-- 会话窗口:设备连续工作时间段
SELECT _wstart, _wend, COUNT(*)
FROM sensor_001
WHERE ts >= NOW - 1d
SESSION(ts, 10m);
6.2 流计算
-- 创建流计算:实时监控温度异常
CREATE STREAM temp_alert_stream INTO temp_alerts AS
SELECT _wstart, device_id, AVG(temperature) as avg_temp
FROM temperature_sensors
WHERE temperature > 30
INTERVAL(5m);
6.3 数据订阅(TMQ)
-- 创建主题
CREATE TOPIC temp_topic AS SELECT * FROM temperature_sensors;
7. 编程接口示例
7.1 Python 连接示例
import taos# 建立连接
conn = taos.connect(host='localhost', user='root', password='taosdata', database='monitoring')# 执行查询
cursor = conn.cursor()
cursor.execute("SELECT * FROM sensor_001 LIMIT 10")# 获取结果
results = cursor.fetchall()
for row in results:print(row)# 关闭连接
cursor.close()
conn.close()
7.2 Java 连接示例
import java.sql.*;public class TDengineExample {public static void main(String[] args) {String jdbcUrl = "jdbc:TAOS://localhost:6030/monitoring";try {// 建立连接Connection conn = DriverManager.getConnection(jdbcUrl, "root", "taosdata");// 执行查询Statement stmt = conn.createStatement();ResultSet rs = stmt.executeQuery("SELECT * FROM sensor_001 LIMIT 10");// 处理结果while (rs.next()) {System.out.println(rs.getTimestamp("ts") + ", " + rs.getFloat("temperature"));}// 关闭连接rs.close();stmt.close();conn.close();} catch (SQLException e) {e.printStackTrace();}}
}
8. 性能优化建议
8.1 数据模型设计
- 合理使用标签:标签用于分组和过滤,不宜过多
- 时间戳顺序写入:时间戳顺序写入性能更好,大量乱序写入不仅影响写入性能,而且对查询性能影响
- 批量写入:使用批量插入提高写入性能
8.2 查询优化
-- 使用标签过滤(高效)
SELECT * FROM temperature_sensors WHERE device_id = 'SENSOR_001';-- 避免全表扫描
SELECT * FROM temperature_sensors WHERE ts > NOW - 1h;-- 使用 LIMIT 限制结果集
SELECT * FROM sensor_001 ORDER BY ts DESC LIMIT 1000;
8.3 配置优化
# 编辑配置文件
sudo vim /etc/taos/taos.cfg# 关键配置项
maxVgroupsPerDb 1000 # 每个数据库最大虚拟组数
maxTablesPerVnode 1000000 # 每个虚拟节点最大表数
maxConnections 5000 # 最大连接数
9. 监控与运维
9.1 系统监控
-- 查看数据库信息
SHOW DATABASES;-- 查看表信息
SHOW TABLES;-- 查看系统资源使用情况
SHOW DNODE 1;
9.2 数据备份
# 使用 taosdump 工具备份
taosdump -o /backup/path -D monitoring# 恢复数据
taosdump -i /backup/path
10. 常见问题与解决方案
10.1 连接问题
# 检查服务状态
sudo systemctl status taosd# 检查端口是否开放
netstat -tlnp | grep 6030# 检查防火墙设置
sudo firewall-cmd --list-ports
10.2 性能问题
- 写入慢:检查是否使用批量插入
- 查询慢:添加时间范围条件,使用标签过滤
- 存储空间大:检查数据压缩配置
10.3 错误处理
-- 查看错误日志
SHOW LOGS;-- 检查表结构
DESCRIBE sensor_001;
11. 总结
通过本文的学习,您已经掌握了:
- TDengine 的基本概念和架构
- 安装和配置 TDengine 环境
- 创建数据库、超级表和子表
- 数据的插入、查询和分析
- 高级功能如流计算和数据订阅
- 编程接口的使用
- 性能优化和运维技巧
TDengine 作为专业的时序数据库,特别适合处理大量的时间序列数据。随着您对 TDengine 理解的深入,可以进一步探索其分布式部署、高可用配置等高级特性。
12. 进一步学习资源
- TDengine 官方文档
- TDengine GitHub 仓库
- TDengine 社区论坛