一、环境准备与安装部署
1.1 单机安装全流程
TDengine 支持在 Linux 和 Windows 等多平台上进行部署,为开发者提供了极大的便利。在众多安装方式中,官方提供的 tar.gz 包是一个非常可靠且推荐的选择,它能确保我们获取到最新版本的 TDengine 以及完整的安装支持。
在 Linux 系统下,我们首先需要获取 TDengine 的安装包。可以从 TDengine 的官方网站(https://www.taosdata.com/cn/download/)下载最新版本的 tar.gz 包,下载完成后,将其放置在合适的目录中,比如/usr/local/src。接下来,使用以下命令解压安装包:
tar -xvf TDengine-server-*.tar.gz
解压完成后,进入解压后的目录,执行安装脚本:
cd TDengine-server-*
sudo ./install.sh
安装过程中,会提示一些配置信息,对于单机安装,我们可以直接使用默认配置,一路回车即可完成安装。
安装完成后,启动 TDengine 服务。在 Linux 系统中,我们可以使用 systemctl 命令来启动服务:
sudo systemctl start taosd
通过systemctl status taosd命令可以查看服务的运行状态,确保服务正常启动。
在 Windows 系统下,安装过程也相对简单。首先从官网下载 Windows 版本的安装包,下载完成后,双击安装包,按照安装向导的提示进行安装。安装完成后,进入安装目录(默认路径为C:\TDengine),在命令提示符中运行taosd.exe即可启动服务。
安装完成并启动服务后,我们需要验证安装是否成功。打开终端,输入taos命令,即可进入 TDengine 的命令行界面(CLI)。在 CLI 中,输入show databases;命令,如果能够看到系统中已有的数据库列表,说明 TDengine 已经成功安装并运行。例如:
taos> show databases;
name | created_time | ntables | columns | tags | vgroups | replicas | quorum | days | keep | cache(MB) | blocks | minrows | maxrows | wallevel | fsync | comp | cachelast | precision | update |
========================================================================================================================================================================================================================================================================================================
information_schema | 2024-01-01 00:00:00.000 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 100 | 1 | 3000000 | 0 | 0 | us | |
log | 2024-01-01 00:00:00.000 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 100 | 1 | 3000000 | 0 | 0 | us | |
Query OK, 2 row(s) in set (0.001455s)
1.2 集群搭建实战
在实际应用中,为了满足大规模数据处理和高可用性的需求,我们通常会搭建 TDengine 集群。下面以一个 4 节点的集群配置为例,其中包括 3 个数据节点和 1 个客户端节点,详细介绍集群的搭建过程。
首先,对集群进行规划。假设我们有 4 台服务器,其 IP 地址和主机名分别如下:
节点类型 |
IP 地址 |
主机名 |
数据节点 1 |
192.168.1.101 |
dnode1 |
数据节点 2 |
192.168.1.102 |
dnode2 |
数据节点 3 |
192.168.1.103 |
dnode3 |
客户端节点 |
192.168.1.104 |
client |
在每个节点上,都需要配置 hostname 和 hosts 文件,以确保节点之间能够通过主机名进行通信。在 Linux 系统中,可以使用以下命令修改 hostname:
sudo hostnamectl set-hostname dnode1
修改完成后,需要重启系统使修改生效。然后,编辑/etc/hosts文件,添加所有节点的 IP 地址和主机名映射,例如:
192.168.1.101 dnode1
192.168.1.102 dnode2
192.168.1.103 dnode3
192.168.1.104 client
在每个数据节点上,都需要修改 TDengine 的配置文件taos.cfg。打开taos.cfg文件,找到并修改以下关键参数:
# 指定第一个数据节点的Endpoint,格式为FQDN:port
firstEp = dnode1:6030
# 设置本数据节点的FQDN
fqdn = dnode1
在每个数据节点上,按照上述步骤解压、安装 TDengine。在安装过程中,当提示是否加入已有的集群时,对于第一个数据节点(dnode1),直接回车创建新集群;对于其他数据节点(dnode2 和 dnode3),输入第一个数据节点的 FQDN 和端口号(例如dnode1:6030)。
安装完成后,在每个数据节点上启动 TDengine 服务:
sudo systemctl start taosd
在第一个数据节点(dnode1)上,打开 TDengine 的命令行界面,使用以下命令添加其他数据节点:
CREATE DNODE "dnode2:6030";
CREATE DNODE "dnode3:6030";
添加完成后,可以使用show dnodes;命令查看集群中的数据节点状态,确保所有节点都已成功加入集群。
随着业务的发展,可能需要对集群进行动态扩展,添加新的数据节点。假设我们需要添加一个新的数据节点(dnode4,IP 地址为 192.168.1.105),首先在 dnode4 上按照上述步骤配置 hostname、hosts 文件和taos.cfg文件,然后在已有的数据节点上执行以下命令添加新节点:
CREATE DNODE "dnode4:6030";
添加完成后,TDengine 会自动进行负载均衡,将部分数据迁移到新节点上,实现集群的水平扩容。
二、核心 SQL 语法详解
2.1 数据建模三板斧
在 TDengine 中,数据建模是构建高效数据存储和查询体系的基础,主要包括创建数据库、定义超级表和生成子表这三个关键步骤。
创建数据库是整个数据建模的第一步,它为后续的数据存储和管理提供了一个逻辑容器。在 TDengine 中,我们使用CREATE DATABASE语句来创建数据库,并且可以通过一些参数来对数据库进行配置。例如,我们要创建一个名为power的数据库,并且设置数据保留期限为 365 天,数据文件的时间跨度为 10 天,可以使用以下语句:
CREATE DATABASE power KEEP 365 DURATION 10;
这里的KEEP参数用于指定数据的保留天数,DURATION参数用于指定每个数据文件所包含的数据时间跨度。合理设置这些参数,可以有效地管理数据存储和查询性能。
定义超级表是 TDengine 数据建模的核心概念之一。超级表是一种抽象的数据结构,它定义了一组具有相同结构的子表的模板。通过超级表,我们可以方便地对大量具有相似结构的数据进行统一管理和查询。在 TDengine 中,使用CREATE STABLE语句来定义超级表。例如,我们要创建一个名为meters的超级表,用于存储电表数据,每个数据记录包含时间戳ts和电流值current,并且带有一个标签location用于表示电表的位置,可以使用以下语句:
CREATE STABLE meters (ts timestamp, current float) TAGS (location nchar(64));
这里的TAGS关键字用于定义超级表的标签,标签是一种静态的元数据,用于对数据进行分组和过滤。
生成子表是将超级表的模板应用到具体的数据采集点上。每个子表对应一个具体的采集设备或实体,它继承了超级表的结构和标签定义。在 TDengine 中,使用CREATE TABLE语句来生成子表,并且需要指定子表所使用的超级表和标签值。例如,我们要创建一个名为d1001的子表,使用meters超级表,并且设置标签location的值为Beijing,可以使用以下语句:
CREATE TABLE d1001 USING meters TAGS('Beijing', 1);
通过这三个步骤,我们就完成了 TDengine 的数据建模,为后续的数据写入和查询奠定了基础。
2.2 高效写入技巧
在 TDengine 中,数据写入是一个关键的操作,它直接影响到系统的性能和数据的实时性。以下是一些高效写入的技巧。
单条写入是最基本的数据写入方式,适用于数据量较小或者对写入实时性要求极高的场景。在 TDengine 中,使用INSERT INTO语句来进行单条写入。例如,我们要向d1001子表中插入一条数据,记录当前时间的电流值为 220.5,可以使用以下语句:
INSERT INTO d1001 VALUES(now, 220.5);
这里的now是 TDengine 提供的一个系统函数,用于获取当前的时间戳。
批量写入可以大大提高数据写入的效率,减少写入操作的次数和开销。在 TDengine 中,我们可以在一条INSERT INTO语句中插入多条数据。例如,我们要向d1001子表中插入两条数据,记录不同时间的电流值,可以使用以下语句:
INSERT INTO d1001 VALUES(now, 221.3)(now, 222.1);
通过这种方式,可以将多条数据一次性写入到数据库中,减少了与数据库的交互次数,提高了写入效率。
自动建表功能是 TDengine 的一个特色功能,它可以在写入数据时自动创建不存在的子表,极大地简化了数据管理的流程。在 TDengine 中,使用INSERT INTO...USING...TAGS语句来实现自动建表。例如,我们要向一个可能不存在的d2001子表中插入数据,并且使用meters超级表和指定的标签值,可以使用以下语句:
INSERT INTO d2001 USING meters TAGS('Shanghai', 2) VALUES(now, 220.0);
如果d2001子表不存在,TDengine 会自动根据meters超级表的结构和指定的标签值创建该子表,然后再将数据写入。
2.3 查询优化实战
在 TDengine 中,数据查询是获取数据价值的关键操作,通过合理的查询优化,可以提高查询效率,快速获取所需的数据。以下是一些查询优化的实战技巧。
基础查询是最常用的查询操作,用于从表中获取指定的数据。在 TDengine 中,使用SELECT语句来进行基础查询。例如,我们要从d1001子表中获取前 10 条数据,可以使用以下语句:
SELECT * FROM d1001 LIMIT 10;
这里的LIMIT关键字用于限制查询结果的数量,通过合理设置LIMIT的值,可以减少返回的数据量,提高查询效率。
聚合计算是对数据进行统计和分析的重要操作,在 TDengine 中,支持丰富的聚合函数,如avg、sum、count等。通过使用这些聚合函数,我们可以对数据进行各种统计分析。例如,我们要计算meters超级表中每个小时的平均电流值,并且对缺失的数据进行线性插值填充,可以使用以下语句:
SELECT avg(current) FROM meters INTERVAL(1h) FILL(linear);
这里的INTERVAL关键字用于指定时间间隔,FILL关键字用于指定填充策略,通过合理设置这些参数,可以实现对数据的降采样和填充处理。
标签过滤是根据标签的值来筛选数据的操作,在 TDengine 中,标签是一种重要的元数据,通过标签过滤可以快速定位到所需的数据。例如,我们要从meters超级表中查询位置为Beijing的所有数据,可以使用以下语句:
SELECT * FROM meters WHERE location='Beijing';
通过这种方式,可以根据标签的值对数据进行精确筛选,提高查询的针对性和效率。