时序数据库-TDengine涛思

时序数据库-TDengine涛思,第1张

时序数据库

时序数据库(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  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

3、开放端口 

开放 TCP/UDP 端口 6030-6042 的访问权限

可参考:Linux-CentOS开通端口外网访问权限

4、还有遇到客户端和服务端时间不一致导致连接不上的问题 

修改时区配置文件

#删除当前默认时区的配置文件,不建议直接删除(出于 *** 作安全考虑),最好是使用mv命令重命名
rm -rf /etc/localtime 

#建立软连接文件到配置文件区,替换掉之前删掉或备份的/etc/localtime 文件
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 

timedatectl #查看当前时区

#设置当前时区为上海常用:Asia/Hong_Kong
timedatectl set-timezone Asia/Shanghai 

同步时间

#安装时间同步应用
yum install -y ntp 

#同步上海授时中心时间
ntpdate ntp.api.bz 

三、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 中添加以下依赖:


 com.taosdata.jdbc
 taos-jdbcdriver
 2.0.**
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/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBErrorNumbers.java

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


12:47:02.779 [threadPoolTaskExecutor-11] INFO  c.e.c.taos.TaosUtils - [instance,89] - 驱动 = com.taosdata.jdbc.TSDBDriver url = jdbc:TAOS://zm-dev:6030/tent_test_1?timezone=UTC-8&charset=UTF-8&locale=en_US.UTF-8
Taos get connection starting...
java.sql.SQLException: JNI ERROR (2354): Ref is not there
        at com.taosdata.jdbc.TSDBError.createSQLException(TSDBError.java:75)
        at com.taosdata.jdbc.TSDBJNIConnector.connect(TSDBJNIConnector.java:80)
        at com.taosdata.jdbc.TSDBConnection.connect(TSDBConnection.java:35)
        at com.taosdata.jdbc.TSDBConnection.(TSDBConnection.java:21)
        at com.taosdata.jdbc.TSDBDriver.connect(TSDBDriver.java:133)
        at java.sql.DriverManager.getConnection(DriverManager.java:664)
        at java.sql.DriverManager.getConnection(DriverManager.java:208)
        at com.energy.common.taos.TaosUtils.instance(TaosUtils.java:99)
        at com.energy.common.taos.TaosUtils.insertIntoBatchResult(TaosUtils.java:186)
        at com.energy.jobTask.fiveMinutesTask.FiveMinutesTask.job(FiveMinutesTask.java:211)
        at com.energy.startUp.InvokeJobTaskMethodsByPojo.doTask(InvokeJobTaskMethodsByPojo.java:82)
        at com.energy.startUp.EnergyTaskStartUp$1$1.run(EnergyTaskStartUp.java:75)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
java.lang.NullPointerException
        at com.energy.common.taos.TaosUtils.insertIntoBatchResult(TaosUtils.java:189)
        at com.energy.jobTask.fiveMinutesTask.FiveMinutesTask.job(FiveMinutesTask.java:211)
        at com.energy.startUp.InvokeJobTaskMethodsByPojo.doTask(InvokeJobTaskMethodsByPojo.java:82)
        at com.energy.startUp.EnergyTaskStartUp$1$1.run(EnergyTaskStartUp.java:75)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)

 

其实博主的问题都是同一个就是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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/801535.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-07
下一篇 2022-05-07

发表评论

登录后才能评论

评论列表(0条)

保存