当前位置: 首页 > news >正文

国产时序数据库 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.RestfulDriverjdbc:TAOS-RS://RESTful 协议,默认服务支持,推荐使用
com.taosdata.jdbc.ws.WebSocketDriverjdbc: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 调用示例及实战技巧,欢迎关注!如果有任何问题,欢迎评论交流。

http://www.dtcms.com/a/268518.html

相关文章:

  • JVM系列五:字节码与执行引擎深度解析
  • uniapp运行项目到ios基座
  • WebRTC 双向视频通话
  • LeetCode 面试题 02.02. 返回倒数第 k 个节点
  • Java 大视界 -- Java 大数据在智能安防视频监控系统中的视频质量评估与智能修复(337)
  • Kettle + 大数据实战:从数据采集到分布式处理的完整流程指南
  • Kafka生产者的初始化
  • Angular V20 新特性
  • QML TextEdit组件
  • 【BFS】 P10864 [HBCPC2024] Genshin Impact Startup Forbidden II|普及+
  • 使用3.20.3版本的protoc编译proto2和proto3
  • 【HarmonyOS Next之旅】DevEco Studio使用指南(四十一) -> 获取自定义编译参数
  • 百度开源文心 4.5 系列开源大模型 GitCode 本地化部署,硅基流动:文心 vs. DeepSeek vs. Qwen 3.0 深度测评
  • 【apply from: “$flutterRoot/packages/flutter_tools/gradle/flutter.gradle“作用】
  • 云计算领域“XaaS”是什么?
  • 使用CocoaPods集成第三方SDK - 从零开始完整指南
  • 开源 C# .net mvc 开发(七)动态图片、动态表格和json数据生成
  • H3初识——入门介绍之路由、路由元数据
  • Maven 依赖管理中的 <optional> 与 <scope>标签
  • 管道机器人手臂机械结构设计cad【8张】+三维图+设计说明书+绛重
  • PDF 上传并保存到 MinIO 数据库
  • 基于Python实现LSTM对股票走势的预测
  • 机器学习知识
  • 医疗AI底层能力全链条工程方案的深度分析:从技术突破到临床应用
  • Mask机制​​中的​​Padding Mask​​ 和 ​​Sentence Mask
  • DCL-2-权限控制
  • 项目进度受上游依赖影响大,如何降低风险
  • 国民经济行业分类 GB/T 4754—2017 (PDF和exce版本)
  • .NET9 实现 JSON 序列化和反序列化(Newtonsoft.Json System.Text.Json)性能测试
  • Mysql8.0高可用集群架构实战