使用Docker部署TDengine集群

TDengine集群部署

TDengine 是一款高性能、分布式、支持 SQL 的时序数据库 (Database)。

1. 集群管理

TDengine 支持集群,提供水平扩展的能力。如果需要获得更高的处理能力,只需要多增加节点即可。TDengine 采用虚拟节点技术,将一个节点虚拟化为多个虚拟节点,以实现负载均衡。同时,TDengine可以将多个节点上的虚拟节点组成虚拟节点组,通过多副本机制,以保证供系统的高可用。

v2.6

https://docs.taosdata.com/2.6/cluster/

v3.0

https://docs.taosdata.com/deployment/

Arbitrator

TDengine中的Arbitrator类似于PostgreSQL中的witness服务,防止集群出现脑裂(split brain)。

如果副本数(replicas)为偶数,当一个 vnode group 里一半或超过一半的 vnode 不工作时,是无法从中选出 master 的。同理,一半或超过一半的 mnode 不工作时,是无法选出 mnode 的 master 的,因为存在“split brain”问题。

为解决这个问题,TDengine 引入了 Arbitrator 的概念。Arbitrator 模拟一个 vnode 或 mnode 在工作,但只简单的负责网络连接,不处理任何数据插入或访问。只要包含 Arbitrator 在内,超过半数的 vnode 或 mnode 工作,那么该 vnode group 或 mnode 组就可以正常的提供数据插入或查询服务。比如对于副本数为 2 的情形,如果一个节点 A 离线,但另外一个节点 B 正常,而且能连接到 Arbitrator,那么节点 B 就能正常工作。

2.6版本下,TDengine 建议在双副本环境要配置 Arbitrator,以提升系统的可用性。

3.0的版本中,官方文档并没有提及Arbitrator。

taosAdapter

提供了一种使用restful接口直接访问TD数据的方式。

taosAdapter 是一个 TDengine 的配套工具,是 TDengine 集群和应用程序之间的桥梁和适配器。它提供了一种易于使用和高效的方式来直接从数据收集代理软件(如 Telegraf、StatsD、collectd 等)摄取数据。它还提供了 InfluxDB/OpenTSDB 兼容的数据摄取接口,允许 InfluxDB/OpenTSDB 应用程序无缝移植到 TDengine。

连接器是 TDengine 的一个重要组成部分,它可以让用户通过不同的编程语言和接口方式与 TDengine 数据库进行交互,执行 SQL 语句,实现数据的插入、查询、订阅等操作。TDengine 提供连接器的两种使用方式:

  1. 通过 TDengine 客户端驱动程序(taosc)原生连接 TDengine 实例
  2. 通过 taosAdapter 提供的 REST 接口连接 TDengine 实例

连接器的优点有以下几点:

  • 易用性:连接器支持多种编程语言,用户可以根据自己的喜好和需求选择合适的语言进行开发,无需学习新的语法或框架。
  • 兼容性:连接器支持 SQL 语言,可以与众多第三方工具无缝集成,方便用户进行数据分析和可视化。
  • 灵活性:连接器支持两种接口方式,即原生接口和 REST 接口,用户可以根据自己的网络环境和性能需求选择合适的方式进行连接。
  • 功能性:连接器支持 TDengine 的全部或部分功能特性,如参数绑定、数据订阅、Schemaless 等,提供了丰富的 API 和示例代码,帮助用户快速实现自己的业务逻辑。

serverPort

2.6

https://docs.taosdata.com/2.6/reference/config/#serverport

属性 说明
适用范围 仅服务端适用
含义 taosd 启动后,对外服务的端口号
缺省值 6030
补充说明 RESTful 服务在 2.4.0.0 之前(不含)由 taosd 提供,默认端口为 6041; 在 2.4.0.0 及后续版本由 taosAdapter,默认端口为 6041

note: 确保集群中所有主机在端口 6030-6042 上的 TCP/UDP 协议能够互通。(详细的端口情况请参见下表)

协议 默认端口 用途说明 修改方法
TCP 6030 客户端与服务端之间通讯。 由配置文件设置 serverPort 决定。
TCP 6035 多节点集群的节点间通讯。 随 serverPort 端口变化。
TCP 6040 多节点集群的节点间数据同步。 随 serverPort 端口变化。
TCP 6041 客户端与服务端之间的 RESTful 通讯。 随 serverPort 端口变化。注意 taosAdapter 配置或有不同,请参考相应文档
TCP 6042 Arbitrator 的服务端口。 随 Arbitrator 启动参数设置变化。
TCP 6043 TaosKeeper 监控服务端口。 随 TaosKeeper 启动参数设置变化。
TCP 6044 支持 StatsD 的数据接入端口。 随 taosAdapter 启动参数设置变化(2.3.0.1+以上版本)。
UDP 6045 支持 collectd 数据接入端口。 随 taosAdapter 启动参数设置变化(2.3.0.1+以上版本)。
TCP 6060 企业版内 Monitor 服务的网络端口。
UDP 6030-6034 客户端与服务端之间通讯。 随 serverPort 端口变化。
UDP 6035-6039 多节点集群的节点间通讯。 随 serverPort 端口变化。

6030-6034端口负责客户端和服务端的通信。而6035-6040端口存在多节点集群之间的通讯和数据同步。6041 RestFul通讯,6042 Arbitrator

3.0

https://docs.taosdata.com/reference/config/#serverport

属性 说明
适用范围 仅服务端适用
含义 taosd 启动后,对外服务的端口号
缺省值 6030

note: 确保集群中所有主机在端口 6030 上的 TCP 协议能够互通。(详细的端口情况请参见下表)

协议 默认端口 用途说明 修改方法
TCP 6030 客户端与服务端之间通讯,多节点集群的节点间通讯。 由配置文件设置 serverPort 决定。
TCP 6041 客户端与服务端之间的 RESTful 通讯。 随 serverPort 端口变化。注意 taosAdapter 配置或有不同,请参考相应文档
TCP 6043 taosKeeper 监控服务端口。 随 taosKeeper 启动参数设置变化。
TCP 6044 支持 StatsD 的数据接入端口。 随 taosAdapter 启动参数设置变化
UDP 6045 支持 collectd 数据接入端口。 随 taosAdapter 启动参数设置变化
TCP 6060 企业版内 Monitor 服务的网络端口。

部署测试

使用docker部署的方式,参考3.0的集群部署。

版本: 2.6

方式:docker

配置文件taos.cfg:fqdn:port

docker(失败)

TDengine 集群的每个节点是由 End Point 来唯一标识的,End Point 是由 FQDN 外加 Port 组成,比如 h1.tdengine.com:6030。

在docker容器内部,由于容器与主机网络是隔离的,td解析fqdn失败,运行td失败。

可以设置--network host让容器直接使用主机的网络配置(ip+port),可以成功部署td集群。(不如直接安装TD 😃)

netstat -tuln 该命令将显示所有当前监听TCP和UDP端口

https://www.taosdata.com/assets-download/taosTools-2.2.5-Linux-x64.tar.gz

# 在Docker环境下,TDengine的客户端为什么连不上集群

docker swarm

参考3.0集群使用docker swarm部署

集群共有3个节点,分别部署如下:

IP 内网 node role
140.1.1.1 192.168.0.1 tdengine-1 db1
140.1.1.2 192.168.0.2 tdengine-2 db2
140.1.1.3 192.168.0.3 tdengine-3 db3

swarm集群有3个节点机器,TD集群也是三个node节点,分别部署在每台机器上。

1.swarm集群节点搭建

选择db1机器作为swarm管理节点,在db1机器执行docker swarm init命令初始化一个swarm集群。

[root@docker ~]# docker swarm init
Swarm initialized: current node (oxhmdmvduwwclftkzjm4ir2h1) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-5nlx3sw1eqv10kbk1tpaa6h67okrpjcxk4ib49ai2q10grzhul-d0pcpep7qy5yms64jip18844t 192.168.0.1:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

[root@dock

将另外两个节点加入集群,分别在db2和db3上执行命令:

docker swarm join --token SWMTKN-1-5nlx3sw1eqv10kbk1tpaa6h67okrpjcxk4ib49ai2q10grzhul-d0pcpep7qy5yms64jip18844t 192.168.0.1:2377

查看集群信息

docker info

在管理节点db1查看集群各节点信息:

docker node ls


ID                            HOSTNAME           STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
oxhmdmvduwwclftkzjm4ir2h1 *   ecs-82aa-0407211   Ready     Active         Leader           20.10.18
t592m8lnn8ec35nele68atdxm     ecs-e2a4-0329421   Ready     Active                          20.10.18
qal6impfrpis2pqrz96y47hja     ecs-f75b-1206132   Ready     Active                          20.10.18

参考

【Docker】进阶之路:(十三)Docker Swarm-CSDN博客

docker swarm搭建tdengine数据库集群_docker搭建tdengine集群-CSDN博客

2.配置文件

各自的配置文件taos.cfg主要内容如下:(主要修改fqdn和severPort、其他保持一致)

td-1

# first fully qualified domain name (FQDN) for TDengine system
firstEp tdengine-1:6030
secondEp tdengine-2:6030

# local fully qualified domain name (FQDN) 
fqdn tdengine-1 

# first port number for the connection (12 continuous UDP/TCP port number are used)
serverPort 6030 

# the arbitrator's fully qualified domain name (FQDN) for TDengine system, for cluster only
arbitrator tdengine-1:6042 

# number of management nodes in the system
numOfMnodes 2 

# number of replications, for cluster only
replica 3

td-2

# first fully qualified domain name (FQDN) for TDengine system
firstEp                   tdengine-1:6030
secondEp                  tdengine-2:6030
# local fully qualified domain name (FQDN)
fqdn                      tdengine-2
# first port number for the connection (12 continuous UDP/TCP port number are used)
serverPort                6030
# the arbitrator's fully qualified domain name (FQDN) for TDengine system, for cluster only
arbitrator               tdengine-1:6042
# number of management nodes in the system
numOfMnodes               2
# number of replications, for cluster only
replica                   3

td-3

# first fully qualified domain name (FQDN) for TDengine system
firstEp                   tdengine-1:6030
secondEp                  tdengine-2:6030
# local fully qualified domain name (FQDN)
fqdn                      tdengine-3
# first port number for the connection (12 continuous UDP/TCP port number are used)
serverPort                6030
# the arbitrator's fully qualified domain name (FQDN) for TDengine system, for cluster only
arbitrator               tdengine-1:6042
# number of management nodes in the system
numOfMnodes               2
# number of replications, for cluster only
replica                   3

使用docker-compose.yml部署集群,内容如下:

version: "3"

services:
  arbitrator:
    image: tdengine/tdengine:2.6.0.30
    command: tarbitrator
    deploy:
      placement:
        constraints:
          - node.labels.role == db3
  tdengine-1:
    image: tdengine/tdengine:2.6.0.30
    hostname: tdengine-1
    environment:
#      TAOS_FQDN: "tdengine-1"
#      TAOS_FIRST_EP: "tdengine-1"
#      TAOS_NUM_OF_MNODES: "2"
#      TAOS_REPLICA: "3"
      TAOS_ARBITRATOR: arbitrator:6042
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
      - /data/tdengine-cluster/volume/tdengine1/lib:/var/lib/taos/
      - /data/tdengine-cluster/volume/tdengine1/log:/var/log/taos/
      - /data/tdengine-cluster/volume/tdengine1/taos.cfg:/etc/taos/taos.cfg
    deploy:
      replicas: 1
      placement:
        constraints:
          - node.labels.role == db1
  tdengine-2:
    image: tdengine/tdengine:2.6.0.30
    hostname: tdengine-2
    environment:
      TAOS_ARBITRATOR: arbitrator:6042
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
      - /data/tdengine-cluster/volume/tdengine2/lib:/var/lib/taos/
      - /data/tdengine-cluster/volume/tdengine2/log:/var/log/taos/
      - /data/tdengine-cluster/volume/tdengine2/taos.cfg:/etc/taos/taos.cfg
    depends_on:
      - tdengine-1
    deploy:
      replicas: 1
      placement:
        constraints:
          - node.labels.role == db2
  tdengine-3:
    image: tdengine/tdengine:2.6.0.30
    hostname: tdengine-3
    environment:
      TAOS_ARBITRATOR: arbitrator:6042
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
      - /data/tdengine-cluster/volume/tdengine3/lib:/var/lib/taos/
      - /data/tdengine-cluster/volume/tdengine3/log:/var/log/taos/
      - /data/tdengine-cluster/volume/tdengine3/taos.cfg:/etc/taos/taos.cfg
    depends_on:
      - tdengine-2
    deploy:
      replicas: 1
      placement:
        constraints:
          - node.labels.role == db3
  adapter:
    image: tdengine/tdengine:2.6.0.30
    command: taosadapter
    environment:
      TAOS_FIRST_EP: "tdengine-1"
      TAOS_SECOND_EP: "tdengine-2"
    deploy:
      replicas: 3
#      placement:
#        constraints:
#          - node.labels.role == db3
  nginx:
    image: nginx
    depends_on:
      - adapter
    ports:
      - 6041:6041
      - 6044:6044/udp
    deploy:
      placement:
        constraints:
          - node.labels.role == db3
    command: [
        "sh",
        "-c",
        "while true;
        do curl -s http://adapter:6041/-/ping >/dev/null && break;
        done;
        printf 'server{listen 6041;location /{proxy_pass http://adapter:6041;}}'
        > /etc/nginx/conf.d/rest.conf;
        printf 'stream{server{listen 6044 udp;proxy_pass adapter:6044;}}'
        >> /etc/nginx/nginx.conf;cat /etc/nginx/nginx.conf;
        nginx -g 'daemon off;'",
      ]

注意事项

1.TDengine使用FQDN来标识节点,需要在hosts文件配置域名解析。

分别在三个服务器节点机器上修改vim /etc/hosts,添加以下内容:

192.168.0.1  tdengien-1
192.168.0.2  tdengien-2
192.168.0.2  tdengien-3

2.TD集群需要第一个启动firstEp节点,第二个启动secendEP节点。

3.部署多个taosAdapter来提高吞吐量并提供高可用性,使用nginx反向代理来提供统一的访问入口。

因此服务启动时存在依赖关系,在yml中配置:

depends_on:
   - tdengine-2

depends_on:
   - adapter

4.共运行3个TD节点分别在3台指定机器上,nginx部署在db3,arbitrator部署在db3。

要指定swarm集群节点运行服务,我们需要在节点上添加标签label,然后配置文件添加部署depoly约束条件。

分别在三个节点机器上添加标签role=db1\db2\db3

# docker node update --label-add role=<your_role> <node_id_or_name>

docker node update --label-add role=db3 oxhmdmvduwwclftkzjm4ir2h1

yml文件添加配置如下:

deploy:
  placement:
    constraints:
       - node.labels.role == db3

5.TD使用adapter提供restful API访问接口,为了高可用,创建3个副本

    deploy:
      replicas: 3

3.TD集群部署

swarm部署、查看和管理命令:

# 部署
docker stack deploy -c docker-compose.yml TD-cluster
# 查看
docker stack ps TD-cluster
docker stack ps --no-trunc TD-cluster
# 删除
docker stack rm TD-cluster

# 查看当前集群运行的服务列表
docker service ls


docker node update --label-add role=<your_role> <node_id_or_name>

添加node集群节点

创建集群后,进入td-1容器内,手动添加td-2、td-3节点。

# 进入docker
docker exec -it tdengine-1 /bin/bash

# 连接 tdengine cli
taos

#查看当前节点,只有td-1
show dnodes;

taos> show dnodes;
   id   |           end_point            | vnodes | cores  |   status   | role  |       create_time       |      offline reason      |
======================================================================================================================================
      1 | tdengine-1:6030                |      1 |      8 | ready      | any   | 2024-04-17 10:00:58.348 |                          |
      0 | arbitrator:6042                |      0 |      0 | ready      | arb   | 2024-04-17 10:03:05.602 | -                        |
Query OK, 2 row(s) in set (0.000690s)

# 添加 td-2, td-3
create dnode "tdengine-2:6030";
create dnode "tdengine-3:6030";

# 再次查看,全部添加,状态为正常、集群创建成功
taos> show dnodes;
   id   |           end_point            | vnodes | cores  |   status   | role  |       create_time       |      offline reason      |
======================================================================================================================================
      1 | tdengine-1:6030                |      1 |      8 | ready      | any   | 2024-04-17 10:00:58.348 |                          |
      2 | tdengine-2:6030                |      0 |      8 | ready      | any   | 2024-04-17 10:11:16.616 |                          |
      3 | tdengine-3:6030                |      0 |     16 | ready      | any   | 2024-04-17 10:11:34.367 |                          |
      0 | arbitrator:6042                |      0 |      0 | ready      | arb   | 2024-04-17 10:03:05.602 | -                        |
Query OK, 4 row(s) in set (0.000637s)


# DROP DNODE "fqdn:port";
# DROP DNODE dnodeId;

数据导入导出

导出和导出TDengine中的数据,可以使用taosdump 工具

TDengine 通过官方的 Docker 镜像安装,会包含taosdump 工具,在目录下:

/usr/local/taos/bin/taosdump

TDengine支持在运行时进行数据的导出和导入,还支持按照时间范围进行数据备份。

在搭建完集群后,可以先备份一次原先全部数据,导出到TD集群后,将服务访问的数据库地址迁移到新的TD集群,然后再选择上次备份时间到迁移后时间范围(时间范围可扩大)再次进行备份并导入到TD集群中。

导出步骤如下:

  1. 进入 Docker 容器
    进入正在运行的 TDengine 容器内部。使用以下命令进入容器的交互式 shell:

    # <container_id_or_name> 是 TDengine 容器的 ID 或名称
    docker exec -it <container_id_or_name> /bin/bash
    
  2. 定位到 taosdump 工具
    在容器内部,导航到包含 taosdump 工具的目录。

    cd /usr/local/taos/bin
    
  3. 执行数据导出
    使用 taosdump 工具导出数据

    # -o 参数后面跟的是导出文件存放的目录,--all-databases 表示导出所有数据库的数据
    ./taosdump -o /root/taosdump_output --all-databases
    
    
    
    # 选择时间范围进行数据备份
    ./taosdump -o /root/taosdump_output1 -S "2024-04-16T00:00:00Z" -E "2024-04-18T17:00:00Z" --all-databases
    
    

    -o 参数后面跟的是导出文件存放的目录(在本例中是 /root/taosdump_output),--all-databases 表示导出所有数据库的数据,-S 参数指定开始时间,-E 参数指定结束时间。

  4. 查看导出结果
    导出完成后,查看导出的文件。

    ls /root/taosdump_output
    
  5. 将导出的数据复制到宿主机
    使用 docker cp 命令将导出的数据从容器复制到宿主机:

    `docker cp <container_id_or_name>:/root/taosdump_output <host_directory>`
    

    <host_directory> 是宿主机上的目标目录。

导入步骤如下:

  1. 准备数据文件
    使用前一步骤导出到主机的备份数据taosdump_output,复制到任一TD容器内部。

    docker cp ./taosdump_output <container_id_or_name>:/root/taosdump_output
    
  2. 进入 TDengine 容器
    进入TD节点容器内部。

    docker exec -it <container_id_or_name> /bin/bash
    
  3. 进行数据恢复
    在容器内部,切换到包含导出数据的目录:

    cd /usr/local/taos/bin
    
    
    ./taosdump -i /root/taosdump_output -u root
    

    -i 参数指定了输入数据的目录,-u 参数是 TDengine 数据库的用户名。

  4. 验证导入结果
    导入完成后,可以使用 taos 命令行工具连接到 TDengine 数据库并查询数据,以验证导入是否成功。

posted @ 2024-04-19 19:36  cralor  阅读(45)  评论(0编辑  收藏  举报