Docker Compose搭建TDengine集群

文章目录

      • 1. Linux上安装Docker
      • 2. 安装Docker Compose
      • 3. 自定义Docker 网络
      • 4. 搭建集群
        • 4.1 基础配置
        • 4.2 查看启动效果
        • 4.3 测试节点
          • 4.3.1 测试taosBenchamrk和vgroups
          • 4.3.2 测试高可用:
      • 5. Windows客户端访问
    • ⛲⛲FQDN踩坑!!!
      • 多场景测试证明
      • RS 和 taosc
      • 6. 相关文件
        • 6.1 docker-compose.yml
        • 6.2 taos.cfg

1. Linux上安装Docker

传送门

2. 安装Docker Compose

为什么安装?

因为这个是插件,不自带;

好处:docker-compose编写yml文件,对所有的容器统一进行管理(启动、停止)

# 建议离线安装:(因为github可能拉不下来)
https://github.com/docker/compose/releases/download/v2.6.1/docker-compose-linux-s390x
# 下载后,将docker-compose-Linux-x86_64 重命名 为docker-compose
# 将刚才下载的docker-compose文件上传到centos7的/usr/local/bin/目录下
# 这个在线安装也可以(自行修改版本号)
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.6.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

# 添加可执行权限
sudo chmod +x /usr/local/bin/docker-compose

# 查看docker-compose版本
docker-compose -v

3. 自定义Docker 网络

为什么自定义?

因为自定义的docker网络已经维护好了对应的网络关系。 不过好像进行这个操作也行(但我在试redis集群的时候,需要使用这个自定义的网络)

docker network create --driver bridge --subnet 192.76.0.0/16 --gateway 192.76.0.1 my_tdengine_net

# docker network ls 可查看网卡列表
# docker netword inspect 网卡名称 可查看网卡具体信息

4. 搭建集群

4.1 基础配置

首先设置主机时区:# timedatectl set-timezone Asia/Shanghai 修改时区为中国

1、创建路径
   # mkdir -p /home/docker-compose/tdengine; 
   # cd /home/docker-compose/tdengine
   # mkdir etc
   
2、创建taos.cfg
   # cd /home/docker-compose/tdengine/etc
   # mkdir node1etc node2etc node3etc
   
   # 在node1etc node2etc node3etc中分别创建一个taos.cfg,然后分别设置其firstEp、secondEp、fqdn和serverPort属性:
   # node1etc: firstEp=taosnode1:6030,secondEp=taosnode1:6030,fqdn=taosnode1,serverPort=6030;
   # node2etc: firstEp=taosnode1:6030,secondEp=taosnode2:7030,fqdn=taosnode2, serverPort=7030;
   # node3etc: firstEp=taosnode1:6030,secondEp=taosnode2:7030,fqdn=taosnode3, serverPort=8030;
   # 注意:taosnode1为物理节点的hostname,如果hostname变了,这也要变。
   
   # taos.cfg的基本模板在下面
   
3、创建docker-compose.yml
   # cd /home/docker-compose/tdengine
   # touch docker-compose.yml
   
   # 有注释的docker-compose.yml在下面

version: "3"
services:
  taosnode1:
      restart: always
      image: tdengine/tdengine:latest
      hostname: taosnode1
      container_name: taosnode1
      privileged: true
      ports:
        - 6020:6020
        - 6030-6042:6030-6042/tcp
        - 6030-6042:6030-6042/udp
      volumes:
        - /etc/localtime:/etc/localtime:ro
        - ./data/node1data:/var/lib/taos
        - ./etc/node1etc:/etc/taos
        - ./log/node1log:/var/log/taos
  
  taosnode2:
      restart: always
      image: tdengine/tdengine:latest
      hostname: taosnode2
      container_name: taosnode2
      privileged: true
      ports:
        - 7020:7020
        - 7030-7042:7030-7042/tcp
        - 7030-7042:7030-7042/udp
      volumes:
        - /etc/localtime:/etc/localtime:ro
        - ./data/node2data:/var/lib/taos
        - ./etc/node2etc:/etc/taos
        - ./log/node2log:/var/log/taos

  taosnode3:
      restart: always
      image: tdengine/tdengine:latest
      hostname: taosnode3
      container_name: taosnode3
      privileged: true
      ports:
        - 8020:8020
        - 8030-8042:8030-8042/tcp
        - 8030-8042:8030-8042/udp
      volumes:
        - /etc/localtime:/etc/localtime:ro
        - ./data/node3data:/var/lib/taos
        - ./etc/node3etc:/etc/taos
        - ./log/node3log:/var/log/taos

4、拉取镜像
   # docker pull tdengine/tdengine
 
5、启动tdengine (注意当前所在的目录)
   # cd /home/docker-compose/tdengine
  [root@taosnode1 tdengine]# docker-compose up -d
[+] Running 4/4
 ⠿ Network tdengine_default  Created     0.4s
 ⠿ Container taosnode3       Started     17.9s
 ⠿ Container taosnode1       Started     18.0s
 ⠿ Container taosnode2       Started     18.0s
4.2 查看启动效果

查看容器运行状态

image-20220714185102099

查看网络配置

Docker Compose搭建TDengine集群_第1张图片

4.3 测试节点
6、进去第一个节点测试与其他节点的连接
   # docker-compose exec taosnode1 bash   这个taosnode1是service名称不是容器名称
   # 不过我们这里设置的service名称和容器名称一样
   # apt-get install inetutils-ping -y 安装ping命令
root@taosnode1:~# ping taosnode2
PING taosnode2 (172.18.0.4): 56 data bytes
64 bytes from 172.18.0.4: icmp_seq=0 ttl=64 time=0.090 ms
64 bytes from 172.18.0.4: icmp_seq=1 ttl=64 time=0.079 ms

root@taosnode1:~# ping taosnode3
PING taosnode3 (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: icmp_seq=0 ttl=64 time=0.062 ms
64 bytes from 172.18.0.2: icmp_seq=1 ttl=64 time=0.078 ms
   # 依次进入其他节点进行连接测试
   
7、进去第一个节点添加其他节点
   # docker-compose exec taosnode1 bash
   # taos;
   # create dnode "taosnode2:7030"   将节点2加入集群
   # create dnode "taosnode3:8030"   将节点3加入集群
   # show dnodes;   查看物理节点
   # show mnodes;   
   # show vgroups;   没有信息的继续往下看
   # drop dnode 节点id
   可以看到节点已添加完毕

Docker Compose搭建TDengine集群_第2张图片

4.3.1 测试taosBenchamrk和vgroups

Docker Compose搭建TDengine集群_第3张图片
自动负载均衡的过程:

Docker Compose搭建TDengine集群_第4张图片

4.3.2 测试高可用:

测试从节点的宕机

Docker Compose搭建TDengine集群_第5张图片

重新开启taosnode3

Docker Compose搭建TDengine集群_第6张图片

测试主节点的宕机

toasnode1宕机之后,网络信息里直接没有了这个节点的信息,fqdn解析失败

Docker Compose搭建TDengine集群_第7张图片

5. Windows客户端访问

8、服务端hosts配置
# vim /etc/hosts
# 添加:虚拟机的IPv4 taosnode1 taosnode2 taosnode3

9、客户端连接配置
   # C:\Windows\System32\drivers\etc\hosts
   # 虚拟机的IPv4  taosnode1 taosnode2 taosnode3
   
   # 客户端下载地址:https://www.taosdata.com/cn/getting-started/#Quick%20Start
   # 客户端下载之后直接安装即可,默认路径C:\TDengine
   # 修改C:\TDengine\cfg\taos.cfg,设置firstEp为taosnode1:6030,secondEp为taosnode2:7030
   # 设置secondEp主要是为了防止taosnode1节点宕机后无法连接集群
   # C:\TDengine中cmd启动客户端,输入taos连接集群

10、vnode的高可用
   # create database testdb replica n; 创建数据库并设置副本数,n代表几个副本;
   # n可以配置为1-3,但不能超过节点数;
   # 当一个vnode group里一半或以上的vnode不工作时,不能对外提供服务;
   # 默认replica为1,此时集群不具备vnode高可用,若想高可用,大于等于2;
  
11、mnode的高可用
   # mnode的副本数,由系统配置参数numOfMnodes决定,有效范围1-3,且小于等于集群节点数;
   # 当一半或以上mnode不工作时,集群不对外工作;
   # 为保证mnode的高可用性,numOfMnodes必须设置为2或3,默认为3;
   
12、负载均衡
   # 触发情况:下面这三种情况将自动触发负载均衡,不须人工干预
   # 1、当一个新数据节点添加进集群时;
   # 2、当一个数据节点从集群中移除时;
   # 3、一个数据节点过热(数据量过大);
   
13、Arbitrator
   # 为什么要用Arbitrator:
   # 如果副本数为偶数,当一个vnode  group里一半的vnode不工作时,是无法从中选出master的。
   # 同理,一个mnode组里一半的mnode不工作时,也是无法选出mnode的master的。
   # 因为存在“split brain”的问题;
   
   # Arbitrator的作用
   # Arbitrator是一个可执行程序,模拟一个vnode或mnode在工作,但只简单的负责网络连接,不处理任何数据插入或访问。
   # 比如:对于副本数位2的情况,如果一个节点A离线,但另外一个节点B正常,如果没有Arbitrator,那么节点B也不能对外工作,
   # 但如果能连接到Arbitrator,那么节点B就能正常工作
   

注意

使用docker-compose安装tdengine,切忌使用docker-compose down命令
否则需要清空data下所有文件才能再次执行docker-compose up -d命令,如果不清空data下所有文件,tdengine服务会一直显示重启中;

rm -rf /home/docker-compose/tdengine/data 清空data文件命令,必须保证路径正确

⛲⛲FQDN踩坑!!!

我们需要注意:taosnode1为物理节点的hostname,如果hostname变了,这也要变。

我开始的时候设置的是taoscluster,其它两个是taosnode2、taosnode3

docker-compose.yml里面需要注意,我们设置的hostname是在这里的,每一个service下一个

之后,我在服务器上进行集群测试,是可以的,正常运行,但是在Windows测试失败

问题具体表现在:

GUI可以连接集群,也可以查看数据进行增加操作

Windows命令行可以连接集群,但是无法查数据

原因

因为命令行默认是原生连接方式,是需要客户端驱动的,需要修改Windos下的hosts文件,改成这样才可以解析FQDN 192.76.116.101 taosnode1 taosnode2 taosnode3

因为GUI的默认是RS连接,是不需要客户端驱动介入

Docker Compose搭建TDengine集群_第8张图片

多场景测试证明

IDEA也可以测试一下

场景一:本地未配置hosts+RS连接 Success:
Docker Compose搭建TDengine集群_第9张图片

场景二:本地未配置hosts+原生连接 Error:

Docker Compose搭建TDengine集群_第10张图片

场景三:本地配置hosts+原生连接 Success:

Docker Compose搭建TDengine集群_第11张图片

场景四就不用测了,肯定可以。。。

RS 和 taosc

问题来了

既然RS兼容性这么好,为什么不用它,要用原生的?

官方给出答案:
Docker Compose搭建TDengine集群_第12张图片

这个三个原生接口都支持

Docker Compose搭建TDengine集群_第13张图片

6. 相关文件

6.1 docker-compose.yml
version: "3"
# 没有自定义网络就不配
networks:
  my_tdengine_net:
    external: true
    
services:
  taosnode1:
      #开机自启
      restart: always
      #指定镜像
      image: tdengine/tdengine:latest
      #指定容器hostname
      hostname: taosnode1
      #容器名称
      container_name: taosnode1
      #创建容器后默认执行的命令
      privileged: true
      #容器的映射端口
      ports:
        - 6020:6020
        - 6030-6042:6030-6042/tcp
        - 6030-6042:6030-6042/udp
      #定义挂载点
      volumes:
        - /etc/localtime:/etc/localtime:ro #同步主机时区到容器
        - ./data/node1data:/var/lib/taos
        - ./etc/node1etc:/etc/taos
        - ./log/node1log:/var/log/taos
      # 没有自定义网络就不配(下面还有两个节点)
      networks:
        my_tdengine_net:
            ipv4_address: 192.76.0.101
  
  taosnode2:
      restart: always
      image: tdengine/tdengine:latest
      hostname: taosnode2
      container_name: taosnode2
      privileged: true
      ports:
        - 7020:7020
        - 7030-7042:7030-7042/tcp
        - 7030-7042:7030-7042/udp
      volumes:
        - /etc/localtime:/etc/localtime:ro #同步主机时区到容器
        - ./data/node2data:/var/lib/taos
        - ./etc/node2etc:/etc/taos
        - ./log/node2log:/var/log/taos
      networks:
         my_tdengine_net:
            ipv4_address: 192.76.0.102

  taosnode3:
      restart: always
      image: tdengine/tdengine:latest
      hostname: taosnode3
      container_name: taosnode3
      privileged: true
      ports:
        - 8020:8020
        - 8030-8042:8030-8042/tcp
        - 8030-8042:8030-8042/udp
      volumes:
        - /etc/localtime:/etc/localtime:ro #同步主机时区到容器
        - ./data/node3data:/var/lib/taos
        - ./etc/node3etc:/etc/taos
        - ./log/node3log:/var/log/taos
      networks:
        my_tdengine_net:
            ipv4_address: 192.76.0.103
6.2 taos.cfg
########################################################
#                                                      #
#                  TDengine Configuration              #
#   Any questions, please email [email protected]   #
#                                                      #
########################################################

# first fully qualified domain name (FQDN) for TDengine system
# taosd启动时,主动连接的集群中第一个dnode的end point, 默认值为localhost:6030。
# firstEp               hostname1:6030

# second fully qualified domain name (FQDN) for TDengine system, for cluster only
# taosd启动时,如果first连接不上,尝试连接集群中第二个dnode的end point, 默认值为空。
# secondEp              cluster_hostname2:6030

# local fully qualified domain name (FQDN)
# 数据节点的FQDN,缺省为操作系统配置的第一个hostname。如果习惯IP地址访问,可设置为该节点的IP地址。
# fqdn                  hostname

# first port number for the connection (12 continuous UDP/TCP port number are used) 
# taosd启动后,对外服务的端口号,默认值为6030。
# serverPort            6030

# log file's directory
# 日志文件目录,客户端和服务器的运行日志文件将写入该目录。默认值:/var/log/taos
# logDir                /var/log/taos

# data file's directory
# 数据文件目录,所有的数据文件都将写入该目录。默认值:/var/lib/taos。
# dataDir               /var/lib/taos

# the arbitrator's fully qualified domain name (FQDN) for TDengine system, for cluster only   
# 系统中裁决器的end point, 缺省值为空。
# arbitrator            arbitrator_hostname:6030     

# number of threads per CPU core
# numOfThreadsPerCore   1.0

# number of management nodes in the system
# 系统中管理节点个数。默认值:3。
# numOfMnodes           3

# enable/disable backuping vnode directory when removing dnode
# vnodeBak              1

# enable/disable load balancing
# 是否启动负载均衡。0:否,1:是。默认值:1。
# balance               1

# role for dnode. 0 - any, 1 - mnode, 2 - dnode
# dnode的可选角色。0-any; 既可作为mnode,也可分配vnode;1-mgmt;只能作为mnode,不能分配vnode;2-dnode;不能作为mnode,只能分配vnode
# role                  0

# max timer control blocks
# maxTmrCtrl            512

# time interval of system monitor, seconds 
# monitorInterval       30

# number of seconds allowed for a dnode to be offline, for cluster only 
# dnode离线阈值,超过该时间将导致该dnode从集群中删除。单位为秒,默认值:86400*10(即10天)。
# offlineThreshold      8640000

# RPC re-try timer, millisecond
# rpcTimer              300

# RPC maximum time for ack, seconds. 
# rpcMaxTime            600

# time interval of dnode status reporting to mnode, seconds, for cluster only 
# statusInterval        1

# time interval of heart beat from shell to dnode, seconds
# shellActivityTimer    3

# time of keeping table meta data in cache, seconds
# tableMetaKeepTimer    7200

# minimum sliding window time, milli-second
# minSlidingTime        10

# minimum time window, milli-second
# minIntervalTime       10

# maximum delay before launching a stream compution, milli-second
# maxStreamCompDelay    20000

# maximum delay before launching a stream computation for the first time, milli-second
# maxFirstStreamCompDelay   10000

# retry delay when a stream computation fails, milli-second
# retryStreamCompDelay      10

# the delayed time for launching a stream computation, from 0.1(default, 10% of whole computing time window) to 0.9
# streamCompDelayRatio      0.1

# max number of vgroups per db, 0 means configured automatically
# 每个数据库中能够使用的最大vnode个数。
# maxVgroupsPerDb           0

# max number of tables per vnode
# 每个vnode中能够创建的最大表个数。默认值:1000000。
# maxTablesPerVnode         1000000

# step size of increasing table number in a vnode
# tableIncStepPerVnode      1000

# cache block size (Mbyte)
# cache                     16

# number of cache blocks per vnode
# blocks                    6

# number of days per DB file
# 一个数据文件存储数据的时间跨度,单位为天,默认值:10。
# days                  10

# number of days to keep DB file
# 数据库中数据保留的天数,单位为天,默认值:3650。
# keep                  3650

# minimum rows of records in file block
# 文件块中记录的最小条数,单位为条,默认值:100。
# minRows               100

# maximum rows of records in file block
# 文件块中记录的最大条数,单位为条,默认值:4096。
# maxRows               4096

# enable/disable compression
# 文件压缩标志位,0:关闭,1:一阶段压缩,2:两阶段压缩。默认值:2。
# comp                  2

# write ahead log (WAL) level, 0: no wal; 1: write wal, but no fysnc; 2: write wal, and call fsync
# WAL级别。1:写wal, 但不执行fsync; 2:写wal, 而且执行fsync。默认值:1。
# walLevel              1

# if walLevel is set to 2, the cycle of fsync being executed, if set to 0, fsync is called right away
# 当wal设置为2时,执行fsync的周期。设置为0,表示每次写入,立即执行fsync。单位为毫秒,默认值:3000
# fsync                 3000

# number of replications, for cluster only 
# 副本个数,取值范围:1-3。单位为个,默认值:1
# replica               1

# mqtt uri  
# mqttBrokerAddress     mqtt://username:password@hostname:1883/taos/

# mqtt client name 
# mqttBrokerClientId    taos_mqtt

# the compressed rpc message, option:
#  -1 (no compression)
#   0 (all message compressed),
# > 0 (rpc message body which larger than this value will be compressed)
# compressMsgSize       -1

# max length of an SQL # # 
# 设置sql语句的最大长度,默认值:65380字节。最大值为1048576或者1M。
maxSQLLength          1048576

# the maximum number of records allowed for super table time sorting
# maxNumOfOrderedRes    100000

# system time zone
# 默认值:从系统中动态获取当前的时区设置
# timezone              Asia/Shanghai (CST, +0800)

# system locale
# 默认值:系统中动态获取,如果自动获取失败,需要用户在配置文件设置或通过API设置
# locale                en_US.UTF-8

# default system charset
# 默认值:系统中动态获取,如果自动获取失败,需要用户在配置文件设置或通过API设置
# charset               UTF-8

# max number of connections allowed in dnode
# maxShellConns         5000

# max numerber of connections allowed in client 
# maxConnections        5000

# stop writing logs when the disk size of the log folder is less than this value
# minimalLogDirGB       0.1

# stop writing temporary files when the disk size of the log folder is less than this value
# minimalTmpDirGB       0.1

# stop writing data when the disk size of the log folder is less than this value
# minimalDataDirGB      0.1

# enbale/disable http service
# http                  1

# enable/disable muqq service
# mqtt                  0

# enable/disable system monitor 
# monitor               1

# enable/disable recording the SQL statements via restful interface
# httpEnableRecordSql   0

# number of threads used to process http requests
# httpMaxThreads        2

# maximum number of rows returned by the restful interface
# restful返回数据行数限制
 restfulRowLimit       1024000

# The following parameter is used to limit the maximum number of lines in log files.
# max number of rows per log filters
# 单个日志文件允许的最大行数。默认值:10,000,000行。
# numOfLogLines         10000000

# enable/disable async log
# asyncLog              1

# The following parameters are used for debug purpose only.
# debugFlag 8 bits mask: FILE-SCREEN-UNUSED-HeartBeat-DUMP-TRACE_WARN-ERROR
# 131: output warning and error, 135: output debug, warning and error, 143 : output trace, debug, warning and error to log.
# 199: output debug, warning and error to both screen and file
# 207: output trace, debug, warning and error to both screen and file

# debug flag for all log type, take effect when non-zero value
 debugFlag             135

# debug flag for meta management messages
# mDebugFlag            135

# debug flag for dnode messages
# dDebugFlag            135

# debug flag for sync module
# sDebugFlag            135

# debug flag for WAL
# wDebugFlag            135

# debug flag for SDB
# sdbDebugFlag          135

# debug flag for RPC 
# rpcDebugFlag          131

# debug flag for TAOS TIMER
# tmrDebugFlag          131

# debug flag for TDengine client 
# cDebugFlag            131

# debug flag for JNI
# jniDebugflag          131

# debug flag for ODBC
# odbcDebugflag         131

# debug flag for storage
# uDebugflag            131

# debug flag for http server
# httpDebugFlag         131

# debug flag for mqtt
# mqttDebugFlag         131

# debug flag for monitor
# monitorDebugFlag      131

# debug flag for query
# qDebugflag            131

# debug flag for vnode
# vDebugflag            131

# debug flag for http server
# tsdbDebugFlag         131

# enable/disable recording the SQL in taos client
# tscEnableRecordSql    0

# generate core file when service crash
# enableCoreFile        1

# maximum display width of binary and nchar fields in the shell. The parts exceeding this limit will be hidden
# shell中二进制和nchar字段的最大显示宽度。超过此限制的部分将被隐藏
# maxBinaryDisplayWidth 30

参考文章
简书:TDEngine2.0在Docker集群网络环境中的使用
CSDN:docker swarm搭建生产用的tdengine数据库集群
Github:How to install TDengine cluster on docker compose #6032

你可能感兴趣的:(TSDB,云原生,docker,tdengine,容器)