使用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 提供连接器的两种使用方式:
- 通过 TDengine 客户端驱动程序(taosc)原生连接 TDengine 实例
- 通过 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集群中。
导出步骤如下:
-
进入 Docker 容器:
进入正在运行的 TDengine 容器内部。使用以下命令进入容器的交互式 shell:# <container_id_or_name> 是 TDengine 容器的 ID 或名称 docker exec -it <container_id_or_name> /bin/bash
-
定位到
taosdump
工具:
在容器内部,导航到包含taosdump
工具的目录。cd /usr/local/taos/bin
-
执行数据导出:
使用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
参数指定结束时间。 -
查看导出结果:
导出完成后,查看导出的文件。ls /root/taosdump_output
-
将导出的数据复制到宿主机:
使用docker cp
命令将导出的数据从容器复制到宿主机:`docker cp <container_id_or_name>:/root/taosdump_output <host_directory>`
<host_directory>
是宿主机上的目标目录。
导入步骤如下:
-
准备数据文件:
使用前一步骤导出到主机的备份数据taosdump_output
,复制到任一TD容器内部。docker cp ./taosdump_output <container_id_or_name>:/root/taosdump_output
-
进入 TDengine 容器:
进入TD节点容器内部。docker exec -it <container_id_or_name> /bin/bash
-
进行数据恢复:
在容器内部,切换到包含导出数据的目录:cd /usr/local/taos/bin ./taosdump -i /root/taosdump_output -u root
-i
参数指定了输入数据的目录,-u
参数是 TDengine 数据库的用户名。 -
验证导入结果:
导入完成后,可以使用taos
命令行工具连接到 TDengine 数据库并查询数据,以验证导入是否成功。