Administrator
发布于 2023-06-20 / 100 阅读
0
0

Tdengine Best Practise

2024重新梳理

安装

rpm -ivh TDengine-server-3.0.4.2-Linux-x64.rpm

创建数据存储的目录

cd /mnt/sdc/
mkdir tdengine

cd tdengine
mkdir dataDir
mkdir tempDir
mkdir logDir

修改配置文件/etc/taos

cd /etc/taos
vim taos.cfg

修改以下内容:

dataDir                   /mnt/sdc/tdengine/dataDir

tempDir                   /mnt/sdc/tdengine/tempDir

logDir                    /mnt/sdc/tdengine/logDir

启动:

systemctl start taosd
 
systemctl status taosd

修改密码:
-h HOST: 要连接的 TDengine 服务端所在服务器的 FQDN, 默认为连接本地服务

-P PORT: 指定服务端所用端口号

-u USER: 连接时使用的用户名

-p PASSWORD: 连接服务端时使用的密码

# 连接taosd服务
taos -u root -p
# 用户管理
# refer to :  https://docs.taosdata.com/2.6/operation/admin/
# 修改用户密码  密码的缺省值是taosdata
ALTER USER root PASS 'long123456';

安装taosadapter:

systemctl start taosadapter

开启端口:

firewall-cmd --add-port=6030/tcp --permanent
 
firewall-cmd --add-port=6030/udp --permanent 
 
firewall-cmd --add-port=6041/tcp --permanent
 
firewall-cmd --add-port=6041/udp --permanent 
 
firewall-cmd --reload

Install

https://docs.taosdata.com/get-started/package/

 rpm -ivh TDengine-server-3.0.1.2-Linux-x64.rpm 
 
 systemctl start taosd
 
systemctl status taosd

## 默认账户
root

## 默认密码
taosdata
  • 启动服务进程:systemctl start taosd
  • 停止服务进程:systemctl stop taosd
  • 重启服务进程:systemctl restart taosd
  • 查看服务状态:systemctl status taosd

port

# taosd
6030   tcp/udp


 firewall-cmd --add-port=6030/tcp --permanent
 
 firewall-cmd --add-port=6030/udp --permanent 
 
 firewall-cmd --reload
 
 
# taosAdapter
6041   tcp/udp


 firewall-cmd --add-port=6041/tcp --permanent
 
 firewall-cmd --add-port=6041/udp --permanent 
 
 firewall-cmd --reload

uninstall

https://docs.taosdata.com/operation/pkg-install/

systemctl stop taosadapter
systemctl stop taosd


rpm -e tdengine

rm -rf /etc/taos

rm -rf /var/lib/taos

rm -rf /var/log/taos 

rm -rf /usr/local/taos

配置FQDN

https://www.taosdata.com/engineering/1824.html

taos-client连接taos-server端

https://docs.taosdata.com/develop/connect/

我们的client是安装在windows上的,而server端,是安装到linux上的。

server端的配置,这里暂时部说了,下面说下client端怎么配置

在client端安装完成后,需要首先配置FQDN,也就说域名映射成IP,参考https://www.taosdata.com/engineering/1824.html,具体操作如下:

1.需要修改C:\Windows\System32\drivers\etc 目录下的hosts文件

49.4.13.102 hecs-15e2

这个hecs-15e2的值,其实就是taos-server端对应的linux主机的主机名,怎么查看这个linux服务器的主机名呢?

vim /etc/hostname

这个就是linux主机的主机名了

2.接下来,我们需要在client端,编辑 taos.cfg 文件(默认路径 C:\TDengine\cfg\taos.cfg),将 firstEP 修改为 TDengine 服务器的 End Point,例如:hecs-15e2:6030

firstEp                   hecs-15e2:6030

注意,这个主机名,不能随意乱写,特别是taos-server端安装完成后,linux主机的主机名,就不能再变了。如果变了的话,taos-client就连接不上server端了。

如果主机名,还想要能连接上,参考TDengine ERROR (8000000b): Unable to establish connection · Issue #6691 · taosdata/TDengine · GitHub

解决方案如下:
1.clients需要配置FQDN /etc/hosts 里面配置192.168.128.160 td1.
2.server端修改主机的名字,/etc/hostname 中添加td1
3.server端修改/var/lib/taos/dnode/下的dnodeEps.json,mnodeEpSet.json中的localhost替换为修改过的hostname td1.
4.重启之后,发现windows client能够成功连接server,并能够进行select * from table; 和select count(*) from table; 操作。

测试

PS C:\TDengine> .\taos.exe
Welcome to the TDengine Command Line Interface, Client Version:3.0.1.2
Copyright (c) 2022 by TDengine, all rights reserved.

Server is Community Edition.

taos> show databases;
              name              |
=================================
 information_schema             |
 performance_schema             |
 demo                           |
Query OK, 3 rows in database (0.109000s)

如何理解fqdn & End Point

FQDN(fully qualified domain name,完全限定域名)是internet上特定计算机或主机的完整域名。FQDN由两部分组成:主机名和域名。例如,假设邮件服务器的FQDN可能是mail.taosdata.com。主机名是mail,主机位于域名taosdata.com中

DNS(Domain Name System),负责将FQDN翻译成IP,是互联网绝大多数应用的寻址方式。

有2个重要的文件/etc/hostname/etc/hosts 。其中 /etc/hostname记录了这个服务器的主机名,而/etc/hosts 记录了 域名和 ip的映射关系。

注意,这里出现了3个概念:主机名、ip、域名

2个服务器之间,除了可以使用ip沟通,还可以使用域名沟通,另外,还可以使用主机名沟通,比如:查看主机名hostname -f ping host,当执行 ping host时,其实是拿着host,去/etc/hosts 中,找到host对应的ip,然后通过ip进行沟通。

而我们一般开发过程中,是没有域名的,所以,fqdn直接使用主机名即可。然后我们将fqdn 和 ip的映射关系,配置到/etc/hosts

[root@localhost ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
218.93.228.30  linu1.com.com

上面的linu1.com.com,就是fqdn,他完全是用主机名,不包含域名。

一个集群中,每一个物理节点的fqdn都是不同的,比如物理节点A的fqdn是linu1.com.com,那么物理节点B的fqdn是linu2.com.com

每个节点的End Point 等于fdqn 外加端口号,比如:

firstEp                   linu1.com.com:6030

这样,我们在tacos.cfg文件中,

// firstEp 是每个数据节点首次启动后连接的第一个数据节点
firstEp               h1.taosdata.com:6030

// 必须配置为本数据节点的 FQDN,如果本机只有一个 hostname,可注释掉本项
fqdn                  h1.taosdata.com

// 配置本数据节点的端口号,缺省是 6030
serverPort            6030

firstEp,主要用于,当taosd 或者 taos服务启动时,连接到集群中的哪一个节点,用来做沟通的

fqdn ,主要用于,本节点的唯一标识。

因此,在每个数据节点,firstEp 需全部配置成一样,但 fqdn 一定要配置成其所在数据节点的值。

参数配置

refer to : https://docs.taosdata.com/reference/config/

refer to : https://docs.taosdata.com/taos-sql/database/

配置文件路径: /etc/taos/taos.cfg


  • CACHEMODEL:表示是否在内存中缓存子表的最近数据。默认为 none。

    • none:表示不缓存。

    • last_row:表示缓存子表最近一行数据。这将显著改善 LAST_ROW 函数的性能表现。

    • last_value:表示缓存子表每一列的最近的非 NULL 值。这将显著改善无特殊影响(WHERE、ORDER BY、GROUP BY、INTERVAL)下的 LAST 函数的性能表现。

    • both:表示同时打开缓存最近行和列功能。

taos-cli

https://docs.taosdata.com/reference/taos-shell/

  • -h HOST: 要连接的 TDengine 服务端所在服务器的 FQDN, 默认为连接本地服务

  • -P PORT: 指定服务端所用端口号

  • -u USER: 连接时使用的用户名

  • -p PASSWORD: 连接服务端时使用的密码

# 连接taosd服务
taos -h linu1.com.com -u root -p
# 用户管理
# refer to :  https://docs.taosdata.com/2.6/operation/admin/
# 修改用户密码  密码的缺省值是taosdata
ALTER USER root PASS 'long123456';

maven连接

 <dependency>
            <groupId>com.taosdata.jdbc</groupId>
            <artifactId>taos-jdbcdriver</artifactId>
            <version>3.0.0</version>
        </dependency>
package com.wp;

import com.taosdata.jdbc.TSDBDriver;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

public class TdEngineConnTest {

    public static void main(String[] args) throws SQLException {

        String jdbcUrl = "jdbc:TAOS://49.4.13.102:6030?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();

    }
}

taosAdapter

refer to : https://docs.taosdata.com/reference/taosadapter/

systemctl start taosadapter
systemctl stop taosadapter

Rest连接设置

refer to: https://docs.taosdata.com/connector/java/

设置rest连接的参数,包括最小连接数、最大连接数等。

使用tdengine-gui

tdengine-gui,其实就是调用tdengine提供的restful接口,然后将接口返回的数据,展现出来

而要使用restful接口,必须使用启用taosAdapter,参考https://docs.taosdata.com/reference/taosadapter/

systemctl start taosadapter

当taosadapter被启用后,还需要打开6041端口

6041   tcp/udp


 firewall-cmd --add-port=6041/tcp --permanent
 
 firewall-cmd --add-port=6041/udp --permanent 
 
 firewall-cmd --reload

最后,我们就可以,使用tdengine-gui,连接tdengine-server了

常用sql

DDL

# 查询建表语句
SHOW CREATE TABLE tb_name;

SHOW CREATE TABLE iot.dm_228964512222830219;


# 查询超级表的建表语句
SHOW CREATE STABLE  iot.s_bool;

# 查询当前数据库下,所有表名
show iot.tables;

# 查询某个盒子下的数据
168317994510

修改表结构

ALTER STABLE demo8.smeter_bool ADD COLUMN is_addition BOOL;

查询DML

# 查询普通表
select * from iot.dm_228964512222830219 order by ts desc;


# 查询超级表,并且使用tag标签过滤      这里的id 和 box_no都是属于 tag标签列
select ts,val from iot.s_float where 1=1  and id=228964512223878831 and box_no=301021111407 order by ts desc ;

时间窗口切分查询---interval

refer to: https://docs.taosdata.com/taos-sql/distinguished/#%E7%AA%97%E5%8F%A3%E5%AD%90%E5%8F%A5%E7%9A%84%E8%A7%84%E5%88%99

使用TDengine,最重要的是时间戳。创建并插入记录、查询历史记录的时候,均需要指定时间戳。时间戳有如下规则:

  • 时间格式为YYYY-MM-DD HH:mm:ss.MS, 默认时间分辨率为毫秒。比如:2017-08-12 18:25:58.128
  • 内部函数now是服务器的当前时间
  • 插入记录时,如果时间戳为now,插入数据时使用服务器当前时间
  • Epoch Time: 时间戳也可以是一个长整数,表示从1970-01-01 08:00:00.000开始的毫秒数
  • 时间可以加减,比如 now-2h,表明查询时刻向前推2个小时(最近2小时)。 数字后面的时间单位可以是 a(毫秒)、s(秒)、 m(分)、h(小时)、d(天)、w(周)。 比如select * from t1 where ts > now-2w and ts <= now-1w, 表示查询两周前整整一周的数据。 在指定降频操作(down sampling)的时间窗口(interval)时,时间单位还可以使用 n(自然月) 和 y(自然年)。
select first(ts) ,avg(val) from iot.dm_228964512221781629 where ts> 1677292383000 and ts < 1678933983000  INTERVAL(1m);

填充---Fill

FILL 语句指定某一窗口区间数据,缺失的情况下的填充模式。

select first(ts) ,avg(val) from iot.dm_228964512221781629 
where ts> 1677292383000 and ts < 1678933983000  
INTERVAL(1m)  FILL(PREV) 

使用fill 填充,可能会出现值null的情况,此时,需要找到距离开始时间最近的,一条数据;然后,用这个数据,来替换null

select * from iot.dm_228964512221781629 where ts < 1677292383000 order by ts desc limit 1

查找值无效数据

select distinct(id) from iot.s_float where val>100000 limit 10;

select * from iot.dm_228964512223878843 where val>100000 limit 10;

添加测试数据

select * from iot.dm_5853449478635520	


insert into iot.dm_5853449478635520(ts,val) values(1681091587000,20)

最后一行记录

select last_row(ts) as ts,val,id from iot.s_float where id in ('228964791275115307','228964512222830219','228964512237506563','228964512223878845') group by tbname


select last_row(ts) as ts,val,id from iot.s_float where id in ('228964791275115307','228964512222830219','228964512237506563','228964512223878845') group by id

集群

基础概念

refer to: https://www.bookstack.cn/read/TDengin-2.0-zh/spilt.5.771310a0ef87f612.md

dnode:实际的数据存储节点。一个dnode,就是一台物理机

vnode group & vnode & replica

一个DB,为了高可用,必须采用副本,这样,即使一个副本宕机了,还有其他的副本可用。多个副本之间的数据,完全一致。

一个DB,为了水平可扩展,必须采用分片。比如一个DB中需要存储100条数据,分成5个分片,每个分片只存储20条数据。

基于上面的副本 和 分片思想,引入了vnode group & vnode & replica这些概念:

一个DB里的数据会被切片分到多个vnode group,vnode group里的vnode数目就是DB的副本数,同一个vnode group里各vnode的数据是完全一致的

不同vnode group,存储的数据,不同

为保证高可用性,vnode group里的vnode一定要分布在不同的数据节点dnode里(实际部署时,需要在不同的物理机上),只要一个vgroup里超过半数的vnode处于工作状态,这个vgroup就能正常的对外服务

同时,集群的节点数必须大于等于副本数,否则创建表时将返回错误“more dnodes are needed”。也就是说:dnodes >= replica

假设,要存储的数据是1,2,3...100,假设dnodes 是3,副本数也是3,分为5个分片,下面画图示意下:

image-20230129192359739

结论如下:

颜色相同,属于同一个vgroup,同一个vgroup内的多个vnode,存储的数据是相同的


不同颜色的vnode,存储的数据是不同的

每一个DB的副本数 <= dnodes数

每一个vnode,只属于某一个DB;但是一个DB,可以有多个vnode

多个vnode是分布在 dnode上的

我们可以从数学的角度看,是将vnode,进行分类。分类的依据有2个:

​ 第一个依据:vnode属于哪一个vgroup;

​ 第二个依据:同一个vgroup中,vnode对应的序号

查询Vnode

show dnodes;
{
    "res": true,
    "count": 3,
    "data": [
        {
            "id": 1,
            "endpoint": "linu1.com.com:6030",
            "vnodes": 7,
            "support_vnodes": 16,
            "status": "ready",
            "create_time": "2022-08-16T12:54:14.701Z",
            "note": ""
        },
        {
            "id": 2,
            "endpoint": "linu2.com.com:6030",
            "vnodes": 7,
            "support_vnodes": 16,
            "status": "ready",
            "create_time": "2022-08-16T12:57:26.533Z",
            "note": ""
        },
        {
            "id": 3,
            "endpoint": "linu3.com.com:6030",
            "vnodes": 8,
            "support_vnodes": 16,
            "status": "ready",
            "create_time": "2022-08-16T12:57:41.453Z",
            "note": ""
        }
    ]
}

查询数据库创建时的参数

SELECT * FROM INFORMATION_SCHEMA.INS_DATABASES where name='iot';
{
    "res": true,
    "count": 1,
    "data": [
        {
            "name": "iot",
            "create_time": "2022-08-21T00:50:37.948Z",
            "vgroups": 2,
            "ntables": 403,
            "replica": 1,
            "strict": "off",
            "duration": "14400m",
            "keep": "5256000m,5256000m,5256000m",
            "buffer": 96,
            "pagesize": 4,
            "pages": 256,
            "minrows": 100,
            "maxrows": 4096,
            "comp": 2,
            "precision": "ms",
            "status": "ready",
            "retention": null,
            "single_stable": false,
            "cachemodel": "none",
            "cachesize": 1,
            "wal_level": 1,
            "wal_fsync_period": 3000,
            "wal_retention_period": 345600,
            "wal_retention_size": -1,
            "wal_roll_period": 86400,
            "wal_segment_size": 0
        }
    ]
}

评论