什么是TDengine 

TDengine 是一款开源的,专为物联网、工业互联网等场景设计并优化的大数据平台,其核心模块是高性能、集群开源、云原生、极简的时序数据库。它能安全高效地将大量设备、数据采集器每天产生的高达 TB 甚至 PB 级的数据进行汇聚、存储、分析和分发,对业务运行状态进行实时监测、预警,提供实时的商业洞察。

TDengine的优势

由于 TDengine 充分利用了时序数据特点,比如结构化、无需事务、很少删除或更新、写多读少等等,因此与其他时序数据库相比,TDengine 有以下特点:

  • 高性能:TDengine 是唯一一个解决了时序数据存储的高基数难题的时序数据库,支持上亿数据采集点,并在数据插入、查询和数据压缩上远胜其它时序数据库。
  • 极简时序数据平台:TDengine 内建缓存、流式计算和数据订阅等功能,为时序数据的处理提供了极简的解决方案,从而大幅降低了业务系统的设计复杂度和运维成本。
  • 云原生:通过原生的分布式设计、数据分片和分区、存算分离、RAFT 协议、Kubernetes 部署和完整的可观测性,TDengine 是一款云原生时序数据库并且能够部署在公有云、私有云和混合云上。
  • 简单易用:对系统管理员来说,TDengine 大幅降低了管理和维护的代价。对开发者来说, TDengine 提供了简单的接口、极简的解决方案和与第三方工具的无缝集成。对数据分析专家来说,TDengine 提供了便捷的数据访问能力。
  • 分析能力:通过超级表、存储计算分离、分区分片、预计算和其它技术,TDengine 能够高效地浏览、格式化和访问数据。
  • 核心开源:TDengine 的核心代码包括集群功能全部在开源协议下公开。全球超过 140k 个运行实例,GitHub Star 20k,且拥有一个活跃的开发者社区。

[详解]如何在 Ubuntu22.04 上安装和使用 TDengine _时序数据库

上图中,左侧是各种数据采集或消息队列,包括 OPC-UA、MQTT、Telegraf、也包括 Kafka,他们的数据将被源源不断的写入到 TDengine。右侧则是可视化、BI 工具、组态软件、应用程序。下侧则是 TDengine 自身提供的命令行程序(CLI)以及可视化管理工具。

在 Ubuntu22.04 上安装 TDengine

将系统软件包更新到可用的最新版本。

sudo apt-get update && sudo apt-get upgrade -y

安装有用的工具。

sudo apt-get install gnupg2 wget ca-certificates lsb-release software-properties-common

使用以下命令配置稳定版本的软件包存储库

curl -sL http://repos.taosdata.com/tdengine.key | gpg --dearmor | sudo tee /usr/share/keyrings/tdengine.key >/dev/null
echo "deb [arch=amd64] http://repos.taosdata.com/tdengine-stable stable main" | sudo tee /etc/apt/sources.list.d/tdengine-stable.list

安装TDengine:

sudo apt update
apt-cache policy tdengine
sudo apt install tdengine

运行以下命令以启动

sudo systemctl start taosd

Chcek 表示服务的状态。

$ systemctl status taosd
● taosd.service - TDengine server service
     Loaded: loaded (/etc/systemd/system/taosd.service; enabled; vendor preset:>
     Active: active (running) since Tue 2022-10-25 18:57:55 EAT; 6s ago
    Process: 28005 ExecStartPre=/usr/local/taos/bin/startPre.sh (code=exited, s>
   Main PID: 28010 (taosd)
      Tasks: 34 (limit: 9457)
     Memory: 6.3M
        CPU: 56ms

要连接TDengine服务器,请执行以下命令。

taos

成功连接的示例输出。

Welcome to the TDengine Command Line Interface, Client Version:3.0.1.5
Copyright (c) 2022 by TDengine, all rights reserved.

   ******************************  Tab Completion  **********************************
   *   The TDengine CLI supports tab completion for a variety of items,             *
   *   including database names, table names, function names and keywords.          *
   *   The full list of shortcut keys is as follows:                                *
   *    [ TAB ]        ......  complete the current word                            *
   *                   ......  if used on a blank line, display all valid commands  *
   *    [ Ctrl + A ]   ......  move cursor to the st[A]rt of the line               *
   *    [ Ctrl + E ]   ......  move cursor to the [E]nd of the line                 *
   *    [ Ctrl + W ]   ......  move cursor to the middle of the line                *
   *    [ Ctrl + L ]   ......  clear the entire screen                              *
   *    [ Ctrl + K ]   ......  clear the screen after the cursor                    *
   *    [ Ctrl + U ]   ......  clear the screen before the cursor                   *
   **********************************************************************************

Server is Community Edition.

taos>

创建数据库

若要创建数据库,请从终端连接到服务器并运行以下命令。

taos> CREATE DATABASE demo;

您可以检查数据库是否已创建

taos> SHOW DATABASES;

              name              |
=================================
 information_schema             |
 performance_schema             |
 demo                           |
Query OK, 3 rows in database (0.002981s)

选择以通过以下命令使用该表

taos> USE demo;
Database changed.

现在创建一个具有以下属性的表。

taos> CREATE TABLE gray (ts TIMESTAMP, speed INT);

接下来是使用以下命令将数据插入到表中

taos> INSERT INTO gray VALUES ('2021-07-15 00:00:00', 10);
taos> INSERT INTO gray VALUES ('2022-07-15 01:00:00', 20);

您可以使用以下命令查看数据。

taos> SELECT * FROM gray;

这将列出表中的所有值。

ts            |    speed    |
========================================
 2021-07-15 00:00:00.000 |          10 |
 2022-07-15 01:00:00.000 |          20 |
Query OK, 2 rows in database (0.001157s)

若要删除表,请使用以下命令语法。

DROP TABLE [IF EXISTS] [db_name.]tb_name

就我而言,我会使用以下命令删除它。

DROP TABLE demo.gray;

删除数据库:

DROP DATABASE demo;

然后它将不再可用。

taos> SHOW DATABASES;
              name              |
=================================
 information_schema             |
 performance_schema             |
Query OK, 2 rows in database (0.004446s)

退出服务器

exit;

测试数据库性能

为了测试数据库的性能,我们将运行一个基准测试命令,该命令将在测试数据库中创建一个名为 meters 的“超级表”,其中包含 10,000 个名为 d0 到 d9999 的子表。因此,它将创建一个包含 1 亿个数据点的部署,您可以使用这些数据点进行测试。

为每个表分配一个从 1 到 10 的 groupId 标记和位置标记:California.Campbell、California.Cupertino、California.LosAngeles、California.MountainView、California.PaloAlto、California.SanDiego、California.SanFrancisco、California.SanJose、California.SantaClara 或 California.Sunnyvale。

确保您的服务器正在运行以下命令,然后按 Enter 键继续。

taosBenchmark

成功基准测试的示例输出。

.....
[10/25 19:21:29.254183] SUCC: thread[5] completed total inserted rows: 12500000, 73792.70 records/second
[10/25 19:21:30.574324] SUCC: thread[3] completed total inserted rows: 12500000, 73229.58 records/second
[10/25 19:21:31.971561] SUCC: thread[7] completed total inserted rows: 12500000, 72617.38 records/second
[10/25 19:21:32.093287] SUCC: thread[1] completed total inserted rows: 12500000, 72537.42 records/second
[10/25 19:21:32.467108] SUCC: thread[2] completed total inserted rows: 12500000, 72457.54 records/second
[10/25 19:21:32.787241] SUCC: thread[0] completed total inserted rows: 12500000, 72297.20 records/second
[10/25 19:21:33.182926] SUCC: thread[6] completed total inserted rows: 12500000, 72145.27 records/second
[10/25 19:21:33.302117] SUCC: thread[4] completed total inserted rows: 12500000, 72086.83 records/second
[10/25 19:21:33.304207] SUCC: Spent 176.059714 seconds to insert rows: 100000000 with 8 thread(s) into test 567989.11 records/second
[10/25 19:21:33.304390] SUCC: insert delay, min: 15.42ms, avg: 137.66ms, p90: 362.32ms, p95: 450.53ms, p99: 537.09ms, max: 667.85ms

完成后,您现在可以在TDengine CLI中运行查询以测试其性能:

连接到服务器

taos

确认数据库已创建。

taos> SHOW DATABASES;

              name              |
=================================
 information_schema             |
 performance_schema             |
 test                           |
Query OK, 3 rows in database (0.002152s)

更改为使用测试数据库进行查询。

taos> use test;
Database changed.

使用以下命令查询 meters supertable 中的行数

taos> SELECT COUNT(*) FROM test.meters;

       count(*)        |
========================
             100000000 |
Query OK, 1 rows in database (0.510931s)

查询表中所有数据行的平均值、最大值和最小值

taos> SELECT AVG(current), MAX(voltage), MIN(phase) FROM test.meters;

       avg(current)        | max(voltage) |      min(phase)      |
==================================================================
               9.978508020 |          114 |              0.00000 |
Query OK, 1 rows in database (0.250465s)

查询位置标记为 California.Sunnyvale 的行:

taos> SELECT COUNT(*) FROM test.meters WHERE location = "California.Sunnyvale";

       count(*)        |
========================
              10290000 |
Query OK, 1 rows in database (0.111535s)

查询 groupId 为 6 的所有行的平均值、最大值和最小值:

taos> SELECT AVG(current), MAX(voltage), MIN(phase) FROM test.meters WHERE groupId = 6;

       avg(current)        | max(voltage) |      min(phase)      |
==================================================================
               9.978508020 |          114 |              0.00000 |
Query OK, 1 rows in database (0.053160s)

以 10 秒为间隔查询表 d15 的平均值、最大值和最小值。

taos> SELECT FIRST(ts), AVG(current), MAX(voltage), MIN(phase) FROM test.d15 INTERVAL(10s);

        first(ts)        |       avg(current)        | max(voltage) |      min(phase)      |
============================================================================================
 2017-07-14 05:40:00.000 |               9.978508020 |          114 |              0.29167 |
Query OK, 1 rows in database (0.005136s)

其他有用的命令


重启TDengine:

sudo systemctl restart taosd

要停止TDengine:

sudo systemctl stop taosd

从 Ubuntu 卸载 TDengine

要从系统中卸载 TDengine,请运行以下命令。

$ sudo apt remove tdengine
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following packages will be REMOVED:
  tdengine
0 upgraded, 0 newly installed, 1 to remove and 7 not upgraded.
After this operation, 68.3 MB disk space will be freed.
Do you want to continue? [Y/n] y
(Reading database ... 177078 files and directories currently installed.)
Removing tdengine (3.0.1.5) ...
TDengine is removed successfully!

如需卸载TDengine taosTools,请执行以下命令。

sudo apt remove taostools

运维指南

容量规划

使用 TDengine 来搭建一个物联网大数据平台,计算资源、存储资源需要根据业务场景进行规划。下面分别讨论系统运行所需要的内存、CPU 以及硬盘空间。

服务端内存需求

每个 Database 可以创建固定数目的 vgroup,默认 2 个 vgroup,在创建数据库时可以通过vgroups <num>参数来指定,其副本数由参数replica <num>指定。vgroup 中的每个副本会是一个 vnode;所以每个数据库占用的内存由以下几个参数决定:

  • vgroups
  • replica
  • buffer
  • pages
  • pagesize
  • cachesize

一个数据库所需要的内存大小等于

vgroups * replica * (buffer + pages * pagesize + cachesize)

但要注意的是这些内存并不需要由单一服务器提供,而是由整个集群中所有数据节点共同负担,相当于由这些数据节点所在的服务器共同负担。如果集群中有不止一个数据库,则所需内存要累加。更复杂的场景是如果集群中的数据节点并非在最初就一次性全部建立,而是随着使用中系统负载的增加逐步增加服务器并增加数据节点,则新创建的数据库会导致新旧数据节点上的负载并不均衡,此时简单的理论计算并不能直接使用,要结合各数据节点的负载情况。

客户端内存需求

客户端应用采用 taosc 客户端驱动连接服务端,会有内存需求的开销。

客户端的内存开销主要由写入过程中的 SQL 语句、表的元数据信息缓存、以及结构性开销构成。系统最大容纳的表数量为 N(每个通过超级表创建的表的 meta data 开销约 256 字节),最大并行写入线程数量 T,最大 SQL 语句长度 S(通常是 1 Mbytes)。由此可以进行客户端内存开销的估算(单位 MBytes):

M = (T * S * 3 + (N / 4096) + 100)

举例如下:用户最大并发写入线程数 100,子表数总数 10,000,000,那么客户端的内存最低要求是:

100 * 3 + (10000000 / 4096) + 100 = 2741 (MBytes)

即配置 3 GBytes 内存是最低要求。

CPU 需求

CPU 的需求取决于如下两方面:

  • 数据插入 TDengine 单核每秒能至少处理一万个插入请求。每个插入请求可以带多条记录,一次插入一条记录与插入 10 条记录,消耗的计算资源差别很小。因此每次插入,条数越大,插入效率越高。如果一个插入请求带 200 条以上记录,单核就能达到每秒插入 100 万条记录的速度。但对前端数据采集的要求越高,因为需要缓存记录,然后一批插入。
  • 查询需求 TDengine 提供高效的查询,但是每个场景的查询差异很大,查询频次变化也很大,难以给出客观数字。需要用户针对自己的场景,写一些查询语句,才能确定。

因此仅对数据插入而言,CPU 是可以估算出来的,但查询所耗的计算资源无法估算。在实际运行过程中,不建议 CPU 使用率超过 50%,超过后,需要增加新的节点,以获得更多计算资源。

存储需求

TDengine 相对于通用数据库,有超高的压缩比,在绝大多数场景下,TDengine 的压缩比不会低于 5 倍,有的场合,压缩比可达到 10 倍以上,取决于实际场景的数据特征。压缩前的原始数据大小可通过如下方式计算:

Raw DataSize = numOfTables * rowSizePerTable * rowsPerTable

示例:1000 万台智能电表,每台电表每 15 分钟采集一次数据,每次采集的数据 128 字节,那么一年的原始数据量是:10000000 * 128 * 24 * 60 / 15 * 365 = 44.8512T。TDengine 大概需要消耗 44.851 / 5 = 8.97024T 空间。

用户可以通过参数 keep,设置数据在磁盘中的最大保存时长。为进一步减少存储成本,TDengine 还提供多级存储,最冷的数据可以存放在最廉价的存储介质上,应用的访问不用做任何调整,只是读取速度降低了。

为提高速度,可以配置多块硬盘,这样可以并发写入或读取数据。需要提醒的是,TDengine 采取多副本的方式提供数据的高可靠,因此不再需要采用昂贵的磁盘阵列。

物理机或虚拟机台数

根据上面的内存、CPU、存储的预估,就可以知道整个系统需要多少核、多少内存、多少存储空间。如果数据副本数不为 1,总需求量需要再乘以副本数。

因为 TDengine 具有很好的水平扩展能力,根据总量,再根据单个物理机或虚拟机的资源,就可以轻松决定需要购置多少台物理机或虚拟机了。

系统监控

TDengine 通过 taosKeeper 将服务器的 CPU、内存、硬盘空间、带宽、请求数、磁盘读写速度等信息定时写入指定数据库。TDengine 还将重要的系统操作(比如登录、创建、删除数据库等)日志以及各种错误报警信息进行记录。系统管理员可以从 CLI 直接查看这个数据库,也可以在 WEB 通过图形化界面查看这些监测信息。

这些监测信息的采集缺省是打开的,但可以修改配置文件里的选项 monitor 将其关闭或打开。

TDinsight - 使用监控数据库 + Grafana可视化监控

我们提供了一个自动化脚本 TDinsight.sh 对 TDinsight 进行部署。

下载 TDinsight.sh

wget https://github.com/taosdata/grafanaplugin/raw/master/dashboards/TDinsight.sh
chmod +x TDinsight.sh

准备:

  1. TDengine Server 信息:
  • TDengine RESTful 服务:对本地而言,可以是 http://localhost:6041,使用参数 -a
  • TDengine 用户名和密码,使用 -u -p 参数设置。
  1. Grafana 告警通知
  • 使用已经存在的 Grafana Notification Channel uid,参数 -E。该参数可以使用 curl -u admin:admin localhost:3000/api/alert-notifications |jq 来获取。
./TDinsight.sh -a http://localhost:6041 -u root -p taosdata -E <notifier uid>

运行程序并重启 Grafana 服务,打开面板:http://localhost:3000/d/tdinsight

[详解]如何在 Ubuntu22.04 上安装和使用 TDengine _tdengine_02

网络连接诊断

当出现客户端应用无法访问服务端时,需要确认客户端与服务端之间网络的各端口连通情况,以便有针对性地排除故障。

目前网络连接诊断支持在:Linux/Windows/macOS 之间进行诊断测试。

诊断步骤:

  1. 如拟诊断的端口范围与服务器 taosd 实例的端口范围相同,须先停掉 taosd 实例
  2. 服务端命令行输入:taos -n server -P <port> -l <pktlen> 以服务端身份启动对端口 port 为基准端口的监听
  3. 客户端命令行输入:taos -n client -h <fqdn of server> -P <port> -l <pktlen> 以客户端身份启动对指定的服务器、指定的端口发送测试包

-l <pktlen>: 测试网络包的大小(单位:字节)。最小值是 11、最大值是 64000,默认值为 1000。 注:两端命令行中指定的测试包长度必须一致,否则测试显示失败。

服务端运行正常的话会输出以下信息:

# taos -n server -P 6030 -l 1000
network test server is initialized, port:6030
request is received, size:1000
request is received, size:1000
...
...
...
request is received, size:1000
request is received, size:1000

客户端运行正常会输出以下信息:

# taos -n client -h 172.27.0.7 -P 6000
taos -n client -h v3s2 -P 6030 -l 1000
network test client is initialized, the server is v3s2:6030
request is sent, size:1000
response is received, size:1000
request is sent, size:1000
response is received, size:1000
...
...
...
request is sent, size:1000
response is received, size:1000
request is sent, size:1000
response is received, size:1000

total succ:  100/100	cost:   16.23 ms	speed:    5.87 MB/s