迎关注我的头条号:Wooola,10年Java软件开发及架构设计经验,专注于Java、Go语言、微服务架构,致力于每天分享原创文章、快乐编码和开源技术。
简介
TDengine是涛思数据推出的一款开源的专为物联网、车联网、工业互联网、IT运维等设计和优化的大数据平台。
Github上Star1W+,fork 2.8K。
传送门
官网
https://www.taosdata.com/cn/
Github
https://github.com/taosdata/TDengine
特性
应用场景
架构设计
数据模型和设计
- 数据模型:关系型数据库模型,但要求每个采集设备单独建表
- 主要模块:包含管理节点、数据节点和客户端,数据节点支持虚拟化
- 写入流程:先写入WAL、之后写入缓存,再给应用确认
- 数据存储:数据按时间段切片、采取列存、不同数据类型不同压缩算法
TAOS SQL
- 支持的数据类型:支持时间戳、整型、浮点型、布尔型、字符型等多种数据类型
- 数据库管理:添加、删除、查看数据库
- 表管理:添加、删除、查看、修改表
- 数据写入:支持单表单条、多条、多表多条写入,支持历史数据写入
- 数据查询:支持时间段、值过滤、排序、查询结果手动分页等
- SQL函数:支持各种聚合函数、选择函数、计算函数,如avg, min, diff等
- 时间维度聚合:将表中数据按照时间段进行切割后聚合,降维处理
超级表STable:多表聚合
- 什么是超级表:一种创新的方式来管理和聚合同一类设备
- 超级表管理:创建/删除、改变超级表
- 写数据时自动建子表:用超级表做模板,自动建表
- STable中TAG管理:增加、删除、修改超级表或表的标签
- STable多表聚合:通过设置标签过滤条件,将一组表进行聚合
- STable使用示例:解释超级表的使用
高级功能
- 连续查询(Continuous Query):基于滑动窗口,定时自动的对数据流进行查询计算
- 数据订阅(Publisher/Subscriber):象典型的消息队列,应用可订阅接收到的最新数据
- 缓存 (Cache):每个设备最新的数据都会缓存在内存中,可快速获取
连接器
- C/C++ Connector:通过libtaos客户端的库,连接TDengine服务器的主要方法
- Java Connector(JDBC):通过标准的JDBC API,给Java应用提供到TDengine的连接
- Python Connector:给Python应用提供一个连接TDengine服务器的驱动
- RESTful Connector:提供一最简单的连接TDengine服务器的方式
- Go Connector:给Go应用提供一个连接TDengine服务器的驱动
- Node.js Connector:给node应用提供一个链接TDengine服务器的驱动
与其他工具的连接
- Telegraf:将DevOps采集的数据发送到TDengine
- Grafana:获取并可视化保存在TDengine的数据
- Matlab:通过配置Matlab的JDBC数据源访问保存在TDengine的数据
- R:通过配置R的JDBC数据源访问保存在TDengine的数据
系统管理
- 文件目录结构:TDengine数据文件、配置文件等所在目录
- 服务端配置:端口,缓存大小,文件块大小和其他系统配置
- 客户端配置:字符集、链接IP地址、缺省用户名、密码等配置
- 用户管理:添加、删除TDengine用户,修改用户密码
- 数据导入:可按脚本文件导入,也可按数据文件导入
- 数据导出:从shell按表导出,也可用taosdump工具做各种导出
- 系统连接、任务查询管理:查询或停止现有的连接、查询和流式计算
- 系统监控:检查系统现有的连接、查询、流式计算,日志和事件等
技术设计
- 存储设计:为时序数据专门优化设计的列式存储格式
- 查询处理:高效的查询计算时序数据的方法
- 集群设计:吸取NoSQL的优点,支持高可靠,支持线性扩展
- 技术博客:更多的技术分析和架构设计文章
性能对比
对比InfluxDB、OpenTSDB、Cassandra、MySQL、ClickHouse
性能测试报告
https://www.taosdata.com/downloads/TDengine_Testing_Report_cn.pdf
版本
社区版
TDengine社区版是一开源版本,采用的是AGPL许可证,是一个处理中小规模的物联网数据平台。它具备高效处理物联网数据所需要的所有功能,包括:
- 类SQL查询语言来插入或查询数据
- 支持C/C++, Java(JDBC), Python, Go, RESTful, and Node.JS 等开发接口
- 通过TDengine Shell或Python/R/Matlab可做各种Ad Hoc查询分析
- 通过连续查询,支持基于滑动窗口的流式计算
- 引入超级表,让设备之间的数据聚合通过标签变得简单、灵活
- 内嵌消息队列,应用可订阅最新的数据
- 内嵌缓存机制,每台设备的最新状态或记录都可快速获得
- 无历史数据与实时数据之分,对应用而言,透明且完全一样
- 安装包仅1.5M,从下载到成功运行仅仅几秒的时间
企业版
TDengine企业版是一个运营商级别的分布式版本,它具备超高的可靠性,超强的水平扩展能力,以应对大数据的挑战。除社区版所有功能外,它还有如下功能:
- 线性扩展能力,以保证任何规模的数据量都可以处理
- 无单点故障,高可靠,以保证运营商级的服务
- 内嵌数据实时同步,可跨机房将数据实时复制到不同节点
- 支持多级存储,方便可靠的前提下,进一步降低存储成本
- 提供可视化的管理工具,让运维更加简单
- 支持更多的工业数据接口以及更多的第三方工具
- 7*24的专业技术支持
云服务版
TDengine云服务版是将TDengine企业版运行在AWS和阿里云上,具备弹性伸缩、零管理的特点,通过专业的技术服务团队,提供运营商级的物联网大数据平台服务。
- 鼠标简单一点,即可扩容,以应对数据量的高速增长
- 零管理,再也没有系统安装、部署、维护的烦恼
- 从管理后台,可以查看运行状态、使用情况,以及各种统计
- 按月按使用量付费,中小企业的理想选择
- 7*24小时专业技术服务
案例
从官网,笔者没看到有客户使用的真实案例,其中企业版和云服务版需要付费的,但是有一些TDengine性能压测对比以及基于TDengine开发的系统文章介绍。
常见问题
1. 遇到错误"failed to connect to server", 我怎么办?
客户端遇到链接故障,请按照下面的步骤进行检查:
- 在服务器,执行 systemctl status taosd 检查taosd运行状态。如果没有运行,启动taosd
- 确认客户端连接时指定了正确的服务器IP地址
- ping服务器IP,如果没有反应,请检查你的网络
- 检查防火墙设置,确认TCP/UDP 端口6030-6039 是打开的
- 对于Linux上的JDBC(ODBC, Python, Go等接口类似)连接, 确保libtaos.so在目录/usr/local/lib/taos里, 并且/usr/local/lib/taos在系统库函数搜索路径LD_LIBRARY_PATH里
- 对于windows上的JDBC, ODBC, Python, Go等连接,确保driver/c/taos.dll在你的系统搜索目录里 (建议taos.dll放在目录 C:WindowsSystem32)
- 如果仍不能排除连接故障,请使用命令行工具nc来分别判断指定端口的TCP和UDP连接是否通畅 检查UDP端口连接是否工作:nc -vuz {hostIP} {port} 检查服务器侧TCP端口连接是否工作:nc -l {port} 检查客户端侧TCP端口链接是否工作:nc {hostIP} {port}
2. 虽然语法正确,为什么我还是得到 "Invalid SQL" 错误
如果你确认语法正确,请检查SQL语句长度是否超过64K。如果超过,也会返回这个错误。
3. 为什么我删除超级表总是失败?
请确保超级表下已经没有其他表,否则系统不允许删除该超级表。
4. 是否支持validation queries?
TDengine还没有一组专用的validation queries。然而建议你使用系统监测的数据库”log"来做。
5. 我可以删除或更新一条记录吗?
不能。因为TDengine是为联网设备采集的数据设计的,不容许修改。但TDengine提供数据保留策略,只要数据记录超过保留时长,就会被自动删除。
6. 我怎么创建超过250列的表?
TDengine最大允许创建250列的表。但是如果确实超过,我们建议按照数据特性,逻辑地将这个宽表分解成几个小表。
7. 最有效的写入数据的方法是什么?
批量插入。每条写入语句可以一张表同时插入多条记录,也可以同时插入多张表的记录。
8. windows系统下插入的nchar类数据中的汉字被解析成了乱码如何解决?
windows下插入nchar类的数据中如果有中文,请先确认系统的地区设置成了中国(在Control Panel里可以设置),这时cmd中的taos客户端应该已经可以正常工作了;如果是在IDE里开发Java应用,比如Eclipse, Intellij,请确认IDE里的文件编码为GBK(这是Java默认的编码类型),然后在生成Connection时,初始化客户端的配置,具体语句如下:
Class.forName("com.taosdata.jdbc.TSDBDriver");
Properties properties = new Properties();
properties.setProperty(TSDBDriver.LOCALE_KEY, "UTF-8");
Connection = DriverManager.getConnection(url, properties);
总结
TDengine是国人开发的大数据平台框架,希望TDengine以后做的和Spark,Hadoop一样优秀,甚至更好。