国产时序数据库 TDengine:Docker 部署、协议端口及 DBeaver 连接全攻略
最近有些物联网、大数据场景的接入需求。在调研时序数据库的时候,看到了一个国产时序数据库,TDengine 以高性能、海量数据写入和丰富协议支持脱颖而出。本人也是刚接触 TDengine,很多东西只是自己片面的见解,被“超级表”、“多端口协议”、“多种 JDBC 驱动”等概念搞得头大。如有错误,欢迎指正。本文将带你一步步理清思路,讲清楚如何通过 Docker 快速部署 TDengine,并用 DBeaver 连接测试。
一、Docker 部署 TDengine 快速启动示例(单机版)
我是指定的3.0.7版本的。
创建挂载目录:
# 创建数据持久化目录
mkdir -p /data/taos/data /data/taos/log
在 Linux 服务器上,推荐使用以下命令启动 TDengine,并开启适配层 taosAdapter:
启动服务
docker run -d --name tdengine -p 6030:6030 -p 6041:6041 -p 6043-6049:6043-6049 -p 6043-6049:6043-6049/udp -p 6060:6060 -v /data/taos/data:/var/lib/taos -v /data/taos/log:/var/log/taos -e TAOS_ADAPTER_ENABLED=true
tdengine/tdengine:3.0.7.0
官方文档:用 Docker 快速体验 TDengine | TDengine 文档 | 涛思数据
其中有对端口进行描述:
我没理解错的话,6060的taosExplorer就是官方的可视化面板,但是我不知道为啥就是用不了,知道怎么用的小伙伴希望指点一下。
启动失败:
过程中也遇到过一次启动失败:ERROR failed to open mnode since Invalid host name
在 TDengine 3.x 中,每个节点会基于 容器内的 hostname(主机名) 作为唯一标识写入 /var/lib/taos/dnode/dnode.json 文件。
比如之前docker run TDengine 时,它记录了一个 hostname,比如 cde1234567,然后你删容器后重新docker run一个新的,Docker 给你分配了一个新的 hostname,比如 abc9999999。
此时,TDengine 启动时发现:
❌ 之前写入的 hostname 和现在不一致,启动中止。
这叫做 “主机名不一致导致 mnode 加载失败”,官方 FAQ 也有相关描述。
解决方案:
1,停止并删除之前的容器
docker stop tdengine
docker rm tdengine
2,删除主机标识文件(重点)
rm -rf /data/taos/data/dnode
3,按上面的步骤重启即可。
启动成功
运行成功后,docker ps 查看容器id,然后进入到容器内部:
docker exec -it 176d8c517f1e bash
进入到容器内部后,再输入taos 即可进入到数据库控制台了。
使用起来跟MySQL差不多
# 查看数据库列表
show databases;
# 切换数据库
use test;
# 查看当前数据库内表
show tables;
# 查看当前数据库内超级表
show stables;
体验写入:
官方也提供了一个快速体验的方法,它能自动生成1e条数据
taosBenchmark -y
你可以对它进行各种计算体验,比如
查询超级表 meters 下的记录总条数:
SELECT COUNT(*) FROM test.meters;
查询 1 亿条记录的平均值、最大值、最小值:
SELECT AVG(current), MAX(voltage), MIN(phase) FROM test.meters;
查询 location = "California.SanFrancisco" 的记录总条数:
SELECT COUNT(*) FROM test.meters WHERE location = "California.SanFrancisco";
查询 groupId = 10 的所有记录的平均值、最大值、最小值:
SELECT AVG(current), MAX(voltage), MIN(phase) FROM test.meters WHERE groupId = 10;
对表 d1001 按每 10 秒进行平均值、最大值和最小值聚合统计:
SELECT _wstart, AVG(current), MAX(voltage), MIN(phase) FROM test.d1001 INTERVAL(10s);
可以看到它的计算速度还是非常快的。
二、理解 TDengine 的协议与端口
说到数据库,大家伙最熟悉的肯定就是 MySQL 了,那么我就直接用MySQL跟他类比了。MySQL是用 3306 端口直接 TCP 连接,而TDengine 多了个“协议适配层”:
-
taosd (6030) 端口是数据库核心进程的原生 TCP 协议端口。
-
taosAdapter (6041) 是协议“翻译器”,支持 HTTP REST、JDBC、WebSocket 等多种客户端协议。
按我的理解就是:MySQL 的 JDBC 驱动直接连3306端口;TDengine 的 JDBC 驱动一般连6041端口,跟 taosAdapter 通信,taosAdapter再和核心数据库通信。
TDengine 提供的JDBC 驱动协议:
驱动类名 | 协议前缀 | 说明 |
---|---|---|
com.taosdata.jdbc.rs.RestfulDriver | jdbc:TAOS-RS:// | RESTful 协议,默认服务支持,推荐使用 |
com.taosdata.jdbc.ws.WebSocketDriver | jdbc:TAOS-WS:// | WebSocket 协议,需服务端特殊配置 |
三、超级表是什么
在 TDengine 中,我们可以先定义一个 “通用模板”(这个模板就叫超级表),然后往里动态生成很多子表(不同设备、不同地点),这些子表就可以共用结构,还能加上自己的标签。超级表 = 带模板的表结构 + 自动建分表 + 带标签的时间序列数据表。
用 MySQL 的思维比喻一下
你在 MySQL 中会怎么建一张设备表?
CREATE TABLE device_data (id INT AUTO_INCREMENT,device_id VARCHAR(32),location VARCHAR(32),time DATETIME,temperature FLOAT
);
每一条记录都要带上 device_id、location 对不对。
而在 TDengine 里可以这么干
你定义一个超级表(Super Table):
CREATE STABLE sensor_data (ts TIMESTAMP, temperature FLOAT
) TAGS (location BINARY(32)
);
然后每个设备都相当于基于这个模板派生一个子表:
-- 设备1:room1
CREATE TABLE d1 USING sensor_data TAGS ('room1');-- 设备2:room2
CREATE TABLE d2 USING sensor_data TAGS ('room2');
注意:你不再需要字段中携带 location,而是作为“标签”存在元数据中。
接下来插入数据:
INSERT INTO d1 VALUES (now, 23.5);
INSERT INTO d2 VALUES (now, 26.1);
其实就是一种水平分表思路。
超级表的 3 个核心优势
特性 | 说明 | 类比 |
表结构复用 | 所有子表都继承超级表的字段结构 | Java 的继承类 |
标签字段 | 用于区分不同子表的“属性”(不在数据表中) | 类似 MySQL 的冗余字段 |
查询效率 | 自动分区、自动索引、压缩,查询时自动合并结果 | 水平分表 + 聚合查询 |
查询方式
1,查某个设备的数据(查某个子表):
SELECT * FROM d1;
2,所有设备的数据(查超级表聚合所有子表,它会自己替你聚合所有表!):
SELECT * FROM sensor_data;
3,按标签筛选设备(只查 room1):
SELECT * FROM sensor_data WHERE location = 'room1';
举个例子:
比如我们现在业务场景是记录政客的支持率变化。每个政客都有自己的“时间序列数据”。
1,创建超级表(Super Table)
CREATE STABLE IF NOT EXISTS politician_support (ts TIMESTAMP, -- 时间戳(必需)support_rate FLOAT -- 支持率(浮点型)
) TAGS (politician_id BINARY(32) -- 政客ID,做为标签
);
2,为每个政客创建子表(继承模板)
-- Biden 的子表
CREATE TABLE biden_support USING politician_support TAGS ('biden');-- Trump 的子表
CREATE TABLE trump_support USING politician_support TAGS ('trump');
3,抓取政客的支持率数据(实际场景肯定有个抓取程序或者人工不断的填写最新数据,我们这里插入两条模拟一下就行了)
-- Biden 支持率
INSERT INTO biden_support VALUES (now, 48.5);
INSERT INTO biden_support VALUES ('2025-07-07 10:00:00', 47.8);-- Trump 支持率
INSERT INTO trump_support VALUES (now, 46.1);
INSERT INTO trump_support VALUES ('2025-07-07 10:00:00', 49.2);
4,查询支持率数据(单政客 or 所有政客)
比如要查拜登的
SELECT * FROM biden_support;
查询所有政客(查超级表,会自动聚合所有子表)
SELECT * FROM politician_support;
附加功能(按时间聚合)比如我们想看过去一天各政客的支持率平均值(TDengine 自带时间聚合函数):
SELECT AVG(support_rate) FROM politician_support
WHERE ts > now - 1d
GROUP BY TAGS;
四、关于时间戳
时间戳在时序数据库中是显式的、必须写入的核心字段。TDengine是时序数据库,自然也是这样的。而 TDengine 支持的时间格式有多种:
'2025-07-07 10:00:00'
(字符串)now
(当前时间)1657187260000
(毫秒时间戳)
TDengine 会自动把 '2025-07-07 10:00:00' 字符串转换成它内部使用的 TIMESTAMP 类型,精度为毫秒(ms)。这个过程是 自动的,无需手动转换。查询时再自动转换为格式化时间返回。
但是这样要考虑的一个问题是时区问题。因此我个人建议在应用层 统一使用时间戳(毫秒)入库,比如Java的就是:
long now = System.currentTimeMillis(); // UTC 毫秒时间戳
五、DBeaver 连接 TDengine 全流程
1. 下载 DBeaver
官方下载地址: Download | DBeaver Community
一直点击下一步就行:
2. 连接 TDengine
新建连接,搜索td 就能看到了。我们选择TDengine
打开后,我记得这里是有个下载驱动的按钮。因为我已经装过了,所以没有。按着它的指示下载驱动即可。然后编辑驱动设置:
驱动类这块,默认应该是ws的,前面我们也提到了,连接时推荐走 taosAdapter(6041端口),用 RESTful JDBC 驱动。所以我们改成:
com.taosdata.jdbc.rs.RestfulDriver
然后要更新一下驱动:
在这里可以指定驱动版本并下载即可:
选择TDengine相对应的版本即可。我是用的3.0.7的,没有对应的,所以选择了一个相近的版本3.0.4。
六、总结
本文分享了一些TDengine的一些入门使用。主要我自己在使用的时候遇到了不少问题,而且总觉得官方文档哪里有点怪怪的,国内开源部分依旧是任重而道远啊。但很值得认可的是TDengine的性能在体验中还是能达到官方给定的数据的,感谢涛思数据的开源。希望这篇博客能帮你快速理清 TDengine 部署和连接的“坑”,后续我还会分享 Java 调用示例及实战技巧,欢迎关注!如果有任何问题,欢迎评论交流。