时序数据库-TDengine涛思(taos)使用以及踩坑

Posted MinggeQingchun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了时序数据库-TDengine涛思(taos)使用以及踩坑相关的知识,希望对你有一定的参考价值。

时序数据库

时序数据库(Time Series DatabaseTSDB) 全称为时间序列数据库。时间序列数据库指主要用于处理带时间标签(按照时间的顺序变化,即时间序列化)的数据,带时间标签的数据也称为时间序列数据

通过 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安装

文档: 立即开始 | TDengine 文档

前提确认安装了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、安装包

文档: 立即开始 | TDengine 文档

从官网下载获得 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”

参考下文

文档 - 涛思数据 | TDengine

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语句

文档:TAOS SQL | TDengine 文档

1、数据库,超级表,表

2、表名合法性

文档 - 涛思数据 | TDengine

TDengine 中的表(列)名命名规则如下: 只能由字母、数字、下划线构成,数字不能在首位,长度不能超过192字节,不区分大小写。这里表名称不包括数据库名的前缀和分隔符

3、表管理

文档 - 涛思数据 | TDengine

表的第一个字段必须是 TIMESTAMP,并且系统自动将其设为主键

4、Taos shell 中 binary 和 nchar 字段的显示宽度上限

文档 - 涛思数据 | TDengine

在 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

java.lang.NoClassDefFoundError: Could not initialize class com.taosdata.jdbc.TSDBJNIConnector · Issue #4238 · taosdata/TDengine · GitHub

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征稿 — 保姆级教程TDengine客户端服务器安装教程

TDengine的安装使用(超详细)

涛思数据TDengine征稿— ❤️ TDengine 的两大技术创新详解❤️ (建议收藏)

涛思数据TDengine征稿— ❤️万字长文,TDengine高可用分布式集群详解❤️ (建议收藏)