TDengine安装和使用 | 青训营

2023年 8月 22日 101.5k 0

TDengine 是一款开源、高性能、云原生的时序数据库,且针对物联网、车联网、工业互联网、金融、IT 运维等场景进行了优化。TDengine 的代码,包括集群功能,都在 GNU AGPL v3.0 下开源。除核心的时序数据库功能外,TDengine 还提供缓存、数据订阅、流式计算等其它功能以降低系统复杂度及研发和运维成本。

一、安装

1、安装包安装(windows)

docs.taosdata.com/get-started…

默认安装路径为:C:TDengine,其中包括以下文件(目录):

  • taos.exe:TDengine CLI 命令行程序
  • taosadapter.exe:提供 **RESTful 服务(使用RESTful连接方式时需要打开该exe)**和接受其他多种软件写入请求的服务端可执行文件
  • taosBenchmark.exe:TDengine 测试程序
  • cfg : 配置文件目录
  • driver: 应用驱动动态链接库
  • examples: 示例程序 bash/C/C#/go/JDBC/Python/Node.js
  • include: 头文件
    • log : 日志文件
  • unins000.exe: 卸载程序

2、docker安装

首先拉取最新的 TDengine 容器镜像:

docker pull tdengine/tdengine:latest

或者指定版本的容器镜像:

docker pull tdengine/tdengine:3.0.1.4

然后只需执行下面的命令:

docker run -d -p 6030:6030 -p 6041:6041 -p 6043-6049:6043-6049 -p 6043-6049:6043-6049/udp tdengine/tdengine

注意:TDengine 3.0 服务端仅使用 6030 TCP 端口。6041 为 taosAdapter 所使用提供 REST 服务端口。6043-6049 为 taosAdapter 提供第三方应用接入所使用端口,可根据需要选择是否打开。

确定该容器已经启动并且在正常运行。

docker ps

进入该容器并执行 bash

docker exec -it  bash

然后就可以执行相关的 Linux 命令操作和访问 TDengine。

运行 TDengine CLI

进入容器,执行 taos

$ taos

taos>

二、可视化工具——TDengineGUI(只支持REST连接)

  • 介绍

  • TDengineGUI是一个基于electron构建的,针对时序数据库TDengine的图形化管理工具。具有跨平台、易于使用、版本适应性强等特点。

    当前版本功能:

    • 通过TDengine restful接口连接到数据库,使用基本不受服务器版本升级影响
    • 数据库添加删除操作,显示数据库属性
    • 显示数据库中超级表和表信息,删除超级表与表功能
    • 显示超级表和表数据功能,提供分页、时间段检索、字段过滤、排序等功能
  • 下载

  • 网站:github.com/skye0207/TD…

  • 连接

  • 点击“新建连接”按钮,添加新的服务器进行管理。需要提供数据库服务器的ip地址、restful服务的端口号(默认为6041)、连接服务器的用户名和密码(默认为root:taosdata)

    img

    三、IDEA连接TDengine

    1)两种连接方式:

    1、JDBC 原生连接

    通过 TDengine 客户端驱动程序(taosc)原生连接 TDengine 实例,支持数据写入、查询、订阅、schemaless 接口和参数绑定接口等功能

    2、JDBC REST 连接

    通过 taosAdapter 提供的 REST 接口连接 TDengine 实例(2.0.18 及更高版本)。REST 连接实现的功能集合和原生连接有少量不同(REST连接不支持无状态写入)

    使用 REST 连接,不依赖 TDengine 客户端驱动,可以跨平台,更加方便灵活,但性能比原生连接器低约 30%。

    需要注意以下几点:

    • TDengine 目前不支持针对单条数据记录的删除操作。
    • 目前不支持事务操作。

    2)安装连接器

  • 方式一:使用 Maven 安装
  • Maven 项目中,在 pom.xml 中添加以下依赖:

    com.taosdata.jdbc

    taos-jdbcdriver

    3.0.*

  • 方式二:使用jar文件
  • 3)使用idea的database工具连接

    TDengine 的 JDBC URL 规范为:jdbc:[TAOS|TAOS-RS]://[host_name]:[port]/[database_name]?[user={user}|&password={password}|&charset={charset}|&cfgdir={config_dir}|&locale={locale}|&timezone={timezone}]

    url 中的配置参数如下:

    • user:登录 TDengine 用户名,默认值 'root'。
    • password:用户登录密码,默认值 'taosdata'。
    • cfgdir:客户端配置文件目录路径,Linux OS 上默认值 /etc/taos,Windows OS 上默认值 C:/TDengine/cfg
    • charset:客户端使用的字符集,默认值为系统字符集。
    • locale:客户端语言环境,默认值系统当前 locale。
    • timezone:客户端使用的时区,默认值为系统当前时区。
    • batchfetch: true:在执行查询时批量拉取结果集;false:逐行拉取结果集。默认值为:false。开启批量拉取同时获取一批数据在查询数据量较大时批量拉取可以有效的提升查询性能。
    • batchErrorIgnore:true:在执行 Statement 的 executeBatch 时,如果中间有一条 SQL 执行失败将继续执行下面的 SQL。false:不再执行失败 SQL 后的任何语句。默认值为:false。
  • RESRFUL连接

  • 创建驱动:

    img

    img

    然后通过驱动创建数据源。

    使用 RESTful 连接,此处 URL 示例为:jdbc:TAOS-RS://localhost:6041 restful方式默认端口为6041( 此处使用域名需要在 Hosts 文件内添加解析;URL 内的 locale、timezone 参数在 RESTful 连接中不生效)

    可替换示例 URL 中的localhost连接集群中指定的节点

    img

    注意:RESTful 请求是无状态的,查询、写入需要在表名前带上数据库名。

  • 原生连接

  • 创建驱动:

    img

    通过驱动创建数据源。

    使用原生连接:

    img

    原生连接默认端口为6030,可替换示例中jdbc:TAOS://localhost:6030的localhost连接集群中指定的节点

    4)通过代码连接

  • 原生连接

  • 前提:服务端的 FQDN 配置正确

    package com.taos.example;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.util.Properties;
    
    import com.taosdata.jdbc.TSDBDriver;
    
    public class JNIConnectExample {
        public static void main(String[] args) throws SQLException {
            String jdbcUrl = "jdbc:TAOS://localhost: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");
            Connection conn = DriverManager.getConnection(jdbcUrl, connProps);
            System.out.println("Connected");
            conn.close();
        }
    }
    
    // use
    // String jdbcUrl = "jdbc:TAOS://localhost:6030/dbName?user=root&password=taosdata";
    // if you want to connect a specified database named "dbName".
    //可通过dbName指定连接的数据库
    //也可指定连接集群中的某个节点
    

    以上示例,使用了 JDBC 原生连接的 TSDBDriver,建立了到 hostname 为 localhost,端口为 6030(TDengine 的默认端口),数据库名为 test 的连接。这个 URL 中指定用户名(user)为 root,密码(password)为 taosdata。

    注意:使用 JDBC 原生连接,taos-jdbcdriver 需要依赖客户端驱动(Linux 下是 libtaos.so;Windows 下是 taos.dll)。

    使用 TDengine 客户端驱动配置文件建立连接

    当使用 JDBC 原生连接连接 TDengine 集群时,可以使用 TDengine 客户端驱动配置文件,在配置文件中指定集群的 firstEp、secondEp 等参数。如下所示:

  • 在 Java 应用中不指定 hostname 和 port
  • public Connection getConn() throws Exception{
      Class.forName("com.taosdata.jdbc.TSDBDriver");
      String jdbcUrl = "jdbc:TAOS://:/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");
      Connection conn = DriverManager.getConnection(jdbcUrl, connProps);
      return conn;
    }
    
  • 在配置文件中指定 firstEp 和 secondEp
  • first fully qualified domain name (FQDN) for TDengine system
    firstEp               cluster_node1:6030
    
    # second fully qualified domain name (FQDN) for TDengine system, for cluster only
    secondEp              cluster_node2:6030
    
    # default system charset# charset               UTF-8# system locale# locale                en_US.UTF-8
    

    以上示例,jdbc 会使用客户端的配置文件,建立到 hostname 为 cluster_node1、端口为 6030、数据库名为 test 的连接。当集群中 firstEp 节点失效时,JDBC 会尝试使用 secondEp 连接集群。

    TDengine 中,只要保证 firstEp 和 secondEp 中一个节点有效,就可以正常建立到集群的连接。

    注意:这里的配置文件指的是调用 JDBC Connector 的应用程序所在机器上的配置文件,Linux OS 上默认值 /etc/taos/taos.cfg ,Windows OS 上默认值 C://TDengine/cfg/taos.cfg。

  • RESTFUL连接

  •     public static void main(String[] args) throws SQLException {
            String jdbcUrl = "jdbc:TAOS-RS://localhost:6041?user=root&password=taosdata";
            Connection conn = DriverManager.getConnection(jdbcUrl);
            System.out.println("Connected");
            conn.close();
        }
    

    四、数据写入

    REST 连接目前不支持参数绑定和无模式写入

  • 通过csv文件写入

  • TDengine 也支持在 shell 对已存在的表从 CSV 文件中进行数据导入。CSV 文件只属于一张表且 CSV 文件中的数据格式需与要导入表的结构相同,在导入的时候,其语法如下:

    insert into tb1 file 'path/data.csv';
    

    NOTE

    注意:如果 CSV 文件首行存在描述信息,请手动删除后再导入。如某列为空,填 NULL,无引号。**

    例如,现在存在一个子表 d1001, 其表结构如下:

    taos> DESCRIBE d1001
                 Field              |        Type        |   Length    |    Note    |
    =================================================================================
     ts                             | TIMESTAMP          |           8 |            |
     current                        | FLOAT              |           4 |            |
     voltage                        | INT                |           4 |            |
     phase                          | FLOAT              |           4 |            |
     location                       | BINARY             |          64 | TAG        |
     groupid                        | INT                |           4 | TAG        |
    

    要导入的 data.csv 的格式如下:

    '2018-10-04 06:38:05.000',10.30000,219,0.31000
    '2018-10-05 06:38:15.000',12.60000,218,0.33000
    '2018-10-06 06:38:16.800',13.30000,221,0.32000
    '2018-10-07 06:38:05.000',13.30000,219,0.33000
    '2018-10-08 06:38:05.000',14.30000,219,0.34000
    '2018-10-09 06:38:05.000',15.30000,219,0.35000
    '2018-10-10 06:38:05.000',16.30000,219,0.31000
    '2018-10-11 06:38:05.000',17.30000,219,0.32000
    '2018-10-12 06:38:05.000',18.30000,219,0.31000
    
  • 参数绑定

  • 暂时无法在飞书文档外展示此内容

    用于设定 TAGS 取值的方法总共有:

    public void setTagNull(int index, int type)
    public void setTagBoolean(int index, boolean value)
    public void setTagInt(int index, int value)
    public void setTagByte(int index, byte value)
    public void setTagShort(int index, short value)
    public void setTagLong(int index, long value)
    public void setTagTimestamp(int index, long value)
    public void setTagFloat(int index, float value)
    public void setTagDouble(int index, double value)
    public void setTagString(int index, String value)
    public void setTagNString(int index, String value)
    

    用于设定 VALUES 数据列的取值的方法总共有:

    public void setInt(int columnIndex, ArrayList list) throws SQLException
    public void setFloat(int columnIndex, ArrayList list) throws SQLException
    public void setTimestamp(int columnIndex, ArrayList list) throws SQLException
    public void setLong(int columnIndex, ArrayList list) throws SQLException
    public void setDouble(int columnIndex, ArrayList list) throws SQLException
    public void setBoolean(int columnIndex, ArrayList list) throws SQLException
    public void setByte(int columnIndex, ArrayList list) throws SQLException
    public void setShort(int columnIndex, ArrayList list) throws SQLException
    public void setString(int columnIndex, ArrayList list, int size) throws SQLException
    public void setNString(int columnIndex, ArrayList list, int size) throws SQLException
    
  • 无模式写入

  • TDengine 支持无模式写入功能。无模式写入兼容 InfluxDB 的 行协议(Line Protocol)、OpenTSDB 的 telnet 行协议和 OpenTSDB 的 JSON 格式协议。

    public class SchemalessInsertTest {
        private static final String host = "127.0.0.1";
        private static final String lineDemo = "st,t1=3i64,t2=4f64,t3="t3" c1=3i64,c3=L"passit",c2=false,c4=4f64 1626006833639000000";
        private static final String telnetDemo = "stb0_0 1626006833 4 host=host0 interface=eth0";
        private static final String jsonDemo = "{"metric": "meter_current","timestamp": 1346846400,"value": 10.3, "tags": {"groupid": 2, "location": "Beijing", "id": "d1001"}}";
    
        public static void main(String[] args) throws SQLException {
            final String url = "jdbc:TAOS://" + host + ":6030/?user=root&password=taosdata";
            try (Connection connection = DriverManager.getConnection(url)) {
                init(connection);
    
                SchemalessWriter writer = new SchemalessWriter(connection);
                writer.write(lineDemo, SchemalessProtocolType.LINE, SchemalessTimestampType.NANO_SECONDS);
                writer.write(telnetDemo, SchemalessProtocolType.TELNET, SchemalessTimestampType.MILLI_SECONDS);
                writer.write(jsonDemo, SchemalessProtocolType.JSON, SchemalessTimestampType.NOT_CONFIGURED);
            }
        }
    
        private static void init(Connection connection) throws SQLException {
            try (Statement stmt = connection.createStatement()) {
                stmt.executeUpdate("drop database if exists test_schemaless");
                stmt.executeUpdate("create database if not exists test_schemaless");
                stmt.executeUpdate("use test_schemaless");
            }
        }
    }
    

    五、数据迁移

    DataX:

    DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 MySQL、SQL Server、Oracle、PostgreSQL、HDFS、Hive、HBase、OTS、ODPS 等各种异构数据源之间高效的数据同步功能。

    基于 DataX,实现了 TDengineReader 和 TDengineWriter 两个插件

    TDengineReader 提供的功能包括:

  • 支持通过 SQL 进行数据筛选;
  • 根据时间间隔进行任务切分;
  • 支持 TDengine 的全部数据类型;
  • 支持批量读取,可以通过 batchSize 参数控制批量拉取结果集的大小,从而提高读取性能。
  • TDengineWriter 支持的功能包括:

  • 支持 OpenTSDB 的 json 格式的行协议,可以使用 TDengine 的 Schemaless 方式写入 TDengine。
  • 支持批量写入,可以通过 batchSize 参数控制批量写入的数量,从而提高写入性能。
  • 更多使用细节,可以参考“基于 DataX 的 TDengine 数据迁移工具www.taosdata.com/engineering…

    用户要将历史 Database(比如 MySQL、OpenTSDB 等)中的数据迁移到 TDengine,或者将 TDengine 中的数据导出,可以利用 DataX 来实现。

    github.com/alibaba/Dat…

    下载后解压至本地某个目录,进入bin目录,即可运行同步作业:

    $ cd  {YOUR_DATAX_HOME}/bin
    $ python datax.py {YOUR_JOB.json}
    

    YOUR_JOB.json 需要自己编写,执行的是数据迁移或者写入任务:

  • 时序数据的迁移配置

  • 以一个从 OpenTSDB 到 TDengine 的数据迁移任务为例,配置文件 opentsdb2tdengine.json 如下:

     {
       "job":{
         "content":[{
           "reader": {
             "name": "opentsdbreader",
             "parameter": {
               "endpoint": "http://192.168.1.180:4242",
               "column": ["weather_temperature"],
               "beginDateTime": "2021-01-01 00:00:00",
               "endDateTime": "2021-01-01 01:00:00"
             }
           },
         "writer": {
           "name": "tdenginewriter",
             "parameter": {
               "host": "192.168.1.101",
               "port": 6030,
               "dbname": "test",
               "user": "root",
               "password": "taosdata",
               "batchSize": 1000
             }
           }
         }],
         "setting": {
           "speed": {
             "channel": 1
           }
         }
       }
     } 
    

    配置说明:

    • 上面的配置表示,从 192.168.1.180 的 OpenTSDB,到 192.168.1.101 的 TDengine 的迁移。迁移 metric 为 weather_temperature,时间从 2021-01-01 00:00:00 开始,到 2021-01-01 01:00:00 结束的数据。
    • reader 使用 datax 的 opentsdbreader,parameter 的配置请参考:opentsdbreader.md#配置参数
    • tdenginewriter 的 parameter 中,host,port,dbname,user,password 都为必须项,没有默认值。batchSize 不是必须项,默认值为 1。详细参考:tdenginewriter.md#配置参数
    • TDengine 中,如果 dbname 指定的 database 不存在,则需要在迁移前创建数据库。
  • 关系型数据的迁移配置

  • 以一个从 MySQL 到 TDengine 的数据迁移任务为例,配置文件 mysql2tdengine.json 如下:

     {
       "job": {
         "content": [{
           "reader": {
             "name": "mysqlreader",
             "parameter": {
               "username": "root",
               "password": "root",
               "column": ["id","name"],
               "splitPk": "id",
               "connection": [{
                 "table": ["test"],
                 "jdbcUrl": ["jdbc:mysql://192.168.1.101:3306/db"]
               }]
             }
           },
           "writer": {
             "name": "tdenginewriter",
             "parameter": {
               "host": "192.168.1.105",
               "port": 6030,
               "dbname": "test",
               "user": "root",
               "password": "taosdata",
               "batchSize": 1000
             }
           }
         }],
         "setting": {
           "speed": {
             "channel": 1
           }
         }
       }
     } 
    

    配置说明:

    • 上面的配置表示,从 192.168.1.101 的 MySQL,到 192.168.1.105 的 TDengine 的迁移。迁移 test 表中 id、name 两列到 TDengine,使用 id 列作为任务划分的列。
    • reader 使用 datax 的 mysqlreader,parameter 的配置请参考:mysqlreader.md
  • TDengine 之间的迁移配置

  • 以一个从 TDengine 到 TDengine 的数据迁移为例,配置文件 tdengine2tdengine.json 如下:

     {
       "job": {
         "content": [{
           "reader": {
             "name": "tdenginereader",
             "parameter": {
               "host": "192.168.1.82",
               "port": 6030,
               "db": "test",
               "user": "root",
               "password": "taosdata",
               "sql": "select * from weather",
               "beginDateTime": "2021-01-01 00:00:00",
               "endDateTime": "2021-01-02 00:00:00",
               "splitInterval": "1h"
             }
           },
           "writer": {
             "name": "tdenginewriter",
             "parameter": {
               "host": "192.168.1.105",‘
               "port": 6030,
               "dbname": "test",
               "user": "root",
               "password": "taosdata",
               "batchSize": 1000
             }
           }
         }],
         "setting": {
           "speed": {
             "channel": 1
           }
         }
       }
     } 
    

    配置说明:

    • 上面的配置表示,从 192.168.1.82 到 192.168.1.105 的 TDengine 之间的数据迁移。tdenginereader 根据 sql、begieDateTime、endDateTime 过滤数据,使用 splitInteval 进行任务划分。
    • reader 使用 tdenginereader,parameter 的配置请参考:tdenginereader.md#配置参数

    相关文章

    3 种实用方法:如何在 macOS Sequoia 中使用窗口布局功能
    Windows 11 22H2 版本将于 10 月 8 日终止支持
    KB5040442:Windows 11 累积更新发布
    3 种简单方法:如何在 Windows 11 中关闭 BitLocker 加密
    GNOME 计划改变默认字体
    2 种实用方法:如何在 Ubuntu 上重置 Root 密码

    发布评论