时序数据库-TDengine涛思(taos)使用以及踩坑
Posted MinggeQingchun
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了时序数据库-TDengine涛思(taos)使用以及踩坑相关的知识,希望对你有一定的参考价值。
时序数据库
时序数据库(Time Series Database,TSDB) 全称为时间序列数据库。时间序列数据库指主要用于处理带时间标签(按照时间的顺序变化,即时间序列化)的数据,带时间标签的数据也称为时间序列数据
通过 DB-Engines网站排名, 可以看到很多时序数据库
1、时序数据的主要数据属性
(1)每个数据点都包含用于索引、聚合和采样的时间戳。该数据也可以是多维的和相关的;
(2)写多读少,需要支持秒级和毫秒级甚至纳秒级高频写入;查询通常是多维聚合查询,对查询的延迟要求比较高
(3)数据的汇总视图(例如,下采样或聚合视图、趋势线)可能比单个数据点提供更多的洞察力。例如,考虑到网络不可靠性或传感器读数异常,我们可能会在一段时间内的某个平均值超过阈值时设置警报,而不是在单个数据点上这样做;
(4)分析数据通常需要在一段时间内访问它(例如,给我过去一周的点击率数据)
2、时序数据库应用场景
时序数据库的应用场景在物联网和互联网APM等场景应用比较多
(1)公共安全:上网记录、通话记录、个体追踪、区间筛选;
(2)电力行业:智能电表、电网、发电设备的集中监测;
(3)互联网:服务器/应用监测、用户访问日志、广告点击日志;
(4)物联网:电梯、锅炉、机械、水表等各种联网设备;
(5)交通行业:实时路况、路口流量监测、卡口数据
(6)金融行业:交易记录、存取记录、ATM、POS机监测
TDengine涛思
其实我也不知道为什么就直接使用了TDengine涛思时序数据库,只能说公司之前有同事使用过,想着刚开始研究时序库,一旦出了问题有人在一起讨论,因此才选择了TDengine。至于TDengine到底性能如何,博主只是看着网上研究资料确实较少,也有不少网友吐槽,但是博主在此无法给出评价,也不发表意见,毕竟使用人家免费的。
TDengine涛思官网: TDengine | 开源、高性能、分布式、支持 SQL 的时序数据库 | 涛思数据
TDengine涛思是一款开源、高性能、分布式、支持 SQL 的时序数据库
官网文档:产品简介 | TDengine 文档
当然目前更新确实标比较快啊,博主4月中旬查阅文档就和五一之后的官网文档界面不同了(据说半个月更新一次)
一、安装
1、Docker安装
前提确认安装了Docker
执行如下命令
docker run -d -p 6030-6049:6030-6049 -p 6030-6049:6030-6049/udp tdengine/tdengine
如果要将使用TDengine时序库的服务发布到Linux系统上,映射taos驱动,并映射hostname,这里博主先声明一下,下面会有遇到的bug再详解
-v /usr/local/taos/driver/libtaos.so.2.1.1.0:/usr/lib/libtaos.so
完整如下
docker run -d \\
--name application-name \\
--hostname docker-hostname \\
-v /usr/local/taos/driver/libtaos.so.2.4.0.5:/usr/lib/libtaos.so \\
-v /usr/share/zoneinfo:/usr/share/zoneinfo \\
-e TZ=Asia/Shanghai \\
-p 6030-6049:6030-6049 -p 6030-6049:6030-6049/udp \\
docker-image-name
确定该容器已经启动并且在正常运行
docker ps
进入该容器并执行 bash
docker exec -it <containrid> bash
启动taos
安装后,请使用 systemctl
命令来启动 TDengine 的服务进程
systemctl start taosd
检查服务是否正常工作:
systemctl status taosd
2、安装包
从官网下载获得 tar.gz 安装包(安装Linux下,如TDengine-server-2.4.0.5-Linux-x64.tar)
tar xvzf TDengine-enterprise-server-2.4.0.5-Linux-x64.tar.gz -C 安装目录
(1)安装
sudo ./install.sh
(2)运行
systemctl start taosd
systemctl status taosd 查看运行状态
二、客户端
下载安装包:所有下载链接 - TDengine | 涛思数据
博主下载的 2.4.0.5版本
注:
客户端与服务端版本号要完全一致,不然会客户端连接时会出现错误“Unable to establish connection”
参考下文
1、Windows使用taos客户端
在cmd.exe中,切换到C:\\TDengine目录,执行taos.exe连接数据库
通过其他主机的客户端访问TDengine,则需要指定主机名:taos -h ip/hostname
如下:
taos -h 192.168.22.16
或者
// myhostname 指Linux系统上的主机名
taos -h myhostname
在通过taos连接时,并没有指定用户名与密码;TDengine在用户未指定认证信息时,默认为root, taosdata
连接成功
2、设置FQDN
FQDN(fully qualified domain name,完全限定域名)是internet上特定计算机或主机的完整域名。FQDN由两部分组成:主机名和域名。例如,假设邮件服务器的FQDN可能是mail.taosdata.com。主机名是mail,主机位于域名taosdata.com中。
DNS(Domain Name System),负责将FQDN翻译成IP,是互联网绝大多数应用的寻址方式
文档:一篇文章说清楚TDengine的FQDN - TDengine | 涛思数据
Windows系统
由于Windows暂时只支持部署客户端,所以我们只需要配置FQDN的解析即可
以Win10为例,大家需要修改 C:\\Windows\\System32\\drivers\\etc
目录下的hosts文件
10.211.55.14 node1
10.211.55.15 node2
10.211.55.16 node3
Linux系统
以node1节点为例,我们需要修改/etc/hostname
和/etc/hosts
修改/etc/hostname
,修改完成后需要重启才能生效
修改/etc/hosts
vi /etc/hostname
//将文件内容修改为node1
vi /etc/hosts
//添加一下三行
10.211.55.14 node1
10.211.55.15 node2
10.211.55.16 node3
成功提示和Windows上正常pingy一样;失败则提示:
//windows下
C:\\Users\\pc-01>ping node1
Ping 请求找不到主机 node1。请检查该名称,然后重试。
//Linux下
root@node2:~# ping node1
ping: unknown host node1
三、SQL语句
1、数据库,超级表,表
2、表名合法性
TDengine 中的表(列)名命名规则如下: 只能由字母、数字、下划线构成,数字不能在首位,长度不能超过192字节,不区分大小写。这里表名称不包括数据库名的前缀和分隔符
3、表管理
表的第一个字段必须是 TIMESTAMP,并且系统自动将其设为主键
4、Taos shell 中 binary 和 nchar 字段的显示宽度上限
在 shell 中通过命令 set max_binary_display_width nn 动态修改此选项
set max_binary_display_width 50;
四、连接Java
文档:TDengine Java Connector | TDengine 文档
taos-jdbcdriver
是 TDengine 的官方 Java 语言连接器,Java 开发人员可以通过它开发存取 TDengine 数据库的应用软件。taos-jdbcdriver
实现了 JDBC driver 标准的接口,并提供两种形式的连接器。一种是通过 TDengine 客户端驱动程序(taosc)原生连接 TDengine 实例
taos-jdbcdriver的jar包 maven仓库地址
https://mvnrepository.com/artifact/com.taosdata.jdbc/taos-jdbcdriver
Maven 项目中,在 pom.xml 中添加以下依赖:
<dependency>
<groupId>com.taosdata.jdbc</groupId>
<artifactId>taos-jdbcdriver</artifactId>
<version>2.0.**</version>
</dependency>
public Connection getConn() throws Exception
Class.forName("com.taosdata.jdbc.TSDBDriver");
String jdbcUrl = "jdbc:TAOS://taosdemo.com:6030/test?user=root&password=taosdata";
Properties connProps = new Properties();
connProps.setProperty(TSDBDriver.PROPERTY_KEY_CHARSET, "UTF-8");
connProps.setProperty(TSDBDriver.PROPERTY_KEY_LOCALE, "en_US.UTF-8");
connProps.setProperty(TSDBDriver.PROPERTY_KEY_TIME_ZONE, "UTC-8");
connProps.setProperty("debugFlag", "135");
connProps.setProperty("maxSQLLength", "1048576");
Connection conn = DriverManager.getConnection(jdbcUrl, connProps);
return conn;
public Connection getRestConn() throws Exception
Class.forName("com.taosdata.jdbc.rs.RestfulDriver");
String jdbcUrl = "jdbc:TAOS-RS://taosdemo.com:6041/test?user=root&password=taosdata";
Properties connProps = new Properties();
connProps.setProperty(TSDBDriver.PROPERTY_KEY_BATCH_LOAD, "true");
Connection conn = DriverManager.getConnection(jdbcUrl, connProps);
return conn;
与连接池使用
HikariCP
使用示例如下:
public static void main(String[] args) throws SQLException
HikariConfig config = new HikariConfig();
// jdbc properties
config.setJdbcUrl("jdbc:TAOS://127.0.0.1:6030/log");
config.setUsername("root");
config.setPassword("taosdata");
// connection pool configurations
config.setMinimumIdle(10); //minimum number of idle connection
config.setMaximumPoolSize(10); //maximum number of connection in the pool
config.setConnectionTimeout(30000); //maximum wait milliseconds for get connection from pool
config.setMaxLifetime(0); // maximum life time for each connection
config.setIdleTimeout(0); // max idle time for recycle idle connection
config.setConnectionTestQuery("select server_status()"); //validation query
HikariDataSource ds = new HikariDataSource(config); //create datasource
Connection connection = ds.getConnection(); // get connection
Statement statement = connection.createStatement(); // get statement
//query or insert
// ...
connection.close(); // put back to conneciton pool
Druid
使用示例如下:
public static void main(String[] args) throws Exception
DruidDataSource dataSource = new DruidDataSource();
// jdbc properties
dataSource.setDriverClassName("com.taosdata.jdbc.TSDBDriver");
dataSource.setUrl(url);
dataSource.setUsername("root");
dataSource.setPassword("taosdata");
// pool configurations
dataSource.setInitialSize(10);
dataSource.setMinIdle(10);
dataSource.setMaxActive(10);
dataSource.setMaxWait(30000);
dataSource.setValidationQuery("select server_status()");
Connection connection = dataSource.getConnection(); // get connection
Statement statement = connection.createStatement(); // get statement
//query or insert
// ...
connection.close(); // put back to conneciton pool
五、踩坑
常见问题及反馈
文档 - 涛思数据 | TDengine
github上有一个taos数据库常见问题的汇总
https://github.com/taosdata/tdengine/issues?q=
TDengine/src/connector/jdbc at master · taosdata/TDengine · GitHub
JDBC连接器可能报错的错误码包括3种:JDBC driver本身的报错(错误码在0x2301到0x2350之间),JNI方法的报错(错误码在0x2351到0x2400之间),TDengine其他功能模块的报错。 具体的错误码请参考:
https://github.com/taosdata/TDengine/blob/develop/src/inc/taoserror.h
1、taos驱动
java.lang.NoClassDefFoundError: Could not initialize class com.taosdata.jdbc.TSDBJNIConnector
2、java.lang.UnsatisfiedLinkError: no taos in java.library.path
java.lang.UnsatisfiedLinkError: no taos in java.library.path
https://github.com/taosdata/TDengine/issues/8235
3、java.sql.SQLException: JNI ERROR(2354): Ref is not there
实质就是 JNI connection is NULL
public static final int ERROR_JNI_CONNECTION_NULL = 0x2354; // JNI connection is NULL
其实博主的问题都是同一个就是libtaos.so找不到
1、博主将 2.4.0.5版本下的 libtaos.so 拷贝到 服务jar 包同目录下,如下
2、构建Dockerfile如下
/usr/lib不在 java的PATH中, 测试下将libtaos.so放在/usr/bin目录下
主要代码 : ADD libtaos.so /usr/lib
FROM java:8
MAINTAINER zm
EXPOSE 8104
ADD energy-task.jar energy-task.jar
ADD libtaos.so /usr/lib
# Dockerfile
RUN echo 'Asia/Shanghai' >/etc/timezone
ENTRYPOINT ["java","-jar","energy-task.jar"]
3、博主运行项目 jar包时,需要映射 hostname
-v /etc/hosts:/etc/hosts -v /etc/hostname:/etc/hostname
完整如下:
#!/bin/sh
cd /data1/docker/server/energy/energy-task
docker rm -f energy-task
docker rmi energy-task:latest
# 根据Dockerfile文件 构建镜像;"."代表当前目录,-t参数设置标签;使用当前目录的Dockerfile文件创建镜像并设置标签
docker build -t energy-task .
docker run -d -p 8104:8081 -e "SPRING_PROFILES_ACTIVE=test"
-v /etc/localtime:/etc/localtime -v /data1/logs/energy-task:/logs
-v /data1/files/energy-task:/files
-v /etc/hosts:/etc/hosts -v /etc/hostname:/etc/hostname
--restart=always --privileged=true --name energy-task energy-task:latest
以上是关于时序数据库-TDengine涛思(taos)使用以及踩坑的主要内容,如果未能解决你的问题,请参考以下文章
涛思数据 TDengine 征稿—十分钟上手TDengine大数据平台
涛思数据TDengine征稿 — 保姆级教程TDengine客户端服务器安装教程