kubernetes TDengine 系列 |k8s部署 TDengine集群 (可外部通信)

目录

一、TDengine介绍

TDengine(时序数据库引擎)是一种开源的高性能时序数据库,专门设计用于处理大规模数据的时序数据存储和分析。TDengine旨在解决物联网、监控系统、日志分析等领域中海量时序数据的存储和查询需求,具有高性能、高可靠性和高可扩展性的特点

TDengine的一些关键特性和优势:

高性能:TDengine采用了高效的存储引擎和查询优化技术,能够快速地存储和查询大规模的时序数据。

时序数据优化:TDengine专门针对时序数据进行了优化,采用了列式存储、时间序列压缩等技术,提高了数据存储和查询的效率。

分布式架构:TDengine支持分布式部署,可以横向扩展以处理大规模数据。通过分布式部署,可以提高系统的可用性和容错能力。

多种数据类型支持:除了基本的数值型数据外,TDengine还支持字符串、布尔型等多种数据类型,适用于各种类型的时序数据场景。

SQL支持:TDengine提供了SQL接口,用户可以使用SQL语言进行数据查询和分析,方便易用。

数据安全:TDengine支持数据加密和访问控制等安全机制,确保数据的安全性和隐私性。

TDengine 技术生态图:

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

二、在 Kubernetes 上部署 TDengine 集群

本文适用 Kubernetes v1.19 以上版本

为了满足高可用的需求,集群需要满足如下要求:

3个及以上 dnode :TDengine 的同一个 vgroup 中的多个 vnode ,不允许同时分布在一个 dnode ,所以如果创建3副本的数据库,则 dnode 数大于等于3

3个 mnode :mnode 负责整个集群的管理工作,TDengine 默认是一个 mnode。如果这个 mnode 所在的 dnode 掉线,则整个集群不可用。

数据库的3副本:TDengine 的副本配置是数据库级别,所以数据库3副本可满足在3个 dnode 的集群中,任意一个 dnode 下线,都不影响集群的正常使用。如果下线 dnode 个数为2时,此时集群不可用,因为RAFT无法完成选举**

请特别注意startupProbe的配置,在 dnode 的 Pod 掉线一段时间后,再重新启动,这个时候新上线的 dnode 会短暂不可用。如果startupProbe配置过小,Kubernetes 会认为该 Pod 处于不正常的状态,并尝试重启该 Pod,该 dnode 的 Pod 会频繁重启,始终无法恢复到正常状态。

tdengine.yaml

yaml 复制代码
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: "tdengine"
  labels:
    app: "tdengine"
spec:
  serviceName: "taosd"
  replicas: 3
  updateStrategy:
    type: RollingUpdate
  selector:
    matchLabels:
      app: "tdengine"
  template:
    metadata:
      name: "tdengine"
      labels:
        app: "tdengine"
    spec:
      containers:
        - name: "tdengine"
          image: "tdengine/tdengine:3.2.3.0"
          imagePullPolicy: "IfNotPresent"
          command: ["sh", "-c"]
          args: ["sed -i '/^allowAllOrigins.*=.*true/a\\allowWebSockets = true' /etc/taos/taosadapter.toml && /tini -- /usr/bin/entrypoint.sh taosd "]
          ports:
            - name: tcp6030
              protocol: "TCP"
              containerPort: 6030
            - name: tcp6041
              protocol: "TCP"
              containerPort: 6041
          env:
            # POD_NAME for FQDN config
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            # SERVICE_NAME and NAMESPACE for fqdn resolve
            - name: SERVICE_NAME
              value: "taosd"
            - name: STS_NAME
              value: "tdengine"
            - name: STS_NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
            # TZ for timezone settings, we recommend to always set it.
            - name: TZ
              value: "Asia/Shanghai"
            # Environment variables with prefix TAOS_ will be parsed and converted into corresponding parameter in taos.cfg. For example, serverPort in taos.cfg should be configured by TAOS_SERVER_PORT when using K8S to deploy
            - name: TAOS_SERVER_PORT
              value: "6030"
            # Must set if you want a cluster.
            - name: TAOS_FIRST_EP
              value: "$(STS_NAME)-0.$(SERVICE_NAME).$(STS_NAMESPACE).svc.cluster.local:$(TAOS_SERVER_PORT)"
            # TAOS_FQND should always be set in k8s env.
            - name: TAOS_FQDN
              value: "$(POD_NAME).$(SERVICE_NAME).$(STS_NAMESPACE).svc.cluster.local"
            - name: TAOS_ADAPTER_CORS_ALLOW_ALL_ORIGINS
              value: "true"
            - name: TAOS_ADAPTER_CORS_ALLOW_WebSockets
              value: "true"
            # - name: TAOS_CHARSET
            #   value: "utf8mb4"
          volumeMounts:
            - name: taosdata
              mountPath: /var/lib/taos
          startupProbe:
            exec:
              command:
                - taos-check
            failureThreshold: 360
            periodSeconds: 10
          readinessProbe:
            exec:
              command:
                - taos-check
            initialDelaySeconds: 5
            timeoutSeconds: 5000
          livenessProbe:
            exec:
              command:
                - taos-check
            initialDelaySeconds: 15
            periodSeconds: 20
  volumeClaimTemplates:
    - metadata:
        name: taosdata
      spec:
        accessModes:
          - "ReadWriteOnce"
        storageClassName: "nfs-client"
        resources:
          requests:
            storage: "5Gi"

service.yaml

yaml 复制代码
---
apiVersion: v1
kind: Service
metadata:
  name: "taosd-np"
  namespace: "tdengine-test"
  labels:
    app: "tdengine"
spec:
  ports:
    - name: tcp6030
      protocol: "TCP"
      port: 6030
      targetPort: tcp6030
      nodePort: 31031
    - name: tcp6041
      protocol: "TCP"
      port: 6041
      targetPort: tcp6041
      nodePort: 31040
  type: NodePort
  selector:
    app: "tdengine"

三、集群测试

使用 kubectl 命令部署 TDengine 集群

首先创建对应的 namespace,然后顺序执行以下命令:

kubectl apply -f taosd-service.yaml -n tdengine-test
kubectl apply -f tdengine.yaml -n tdengine-test

上面的配置将生成一个三节点的 TDengine 集群,dnode 为自动配置,可以使用 show dnodes 命令查看当前集群的节点:

kubectl exec -it tdengine-0 -n tdengine-test -- taos -s "show dnodes"
kubectl exec -it tdengine-1 -n tdengine-test -- taos -s "show dnodes"
kubectl exec -it tdengine-2 -n tdengine-test -- taos -s "show dnodes"

输出如下:

taos> show dnodes
     id      | endpoint         | vnodes | support_vnodes |   status   |       create_time       |       reboot_time       |              note              |          active_code           |         c_active_code          |
=============================================================================================================================================================================================================================================
           1 | tdengine-0.ta... |      0 |             16 | ready      | 2023-07-19 17:54:18.552 | 2023-07-19 17:54:18.469 |                                |                                |                                |
           2 | tdengine-1.ta... |      0 |             16 | ready      | 2023-07-19 17:54:37.828 | 2023-07-19 17:54:38.698 |                                |                                |                                |
           3 | tdengine-2.ta... |      0 |             16 | ready      | 2023-07-19 17:55:01.141 | 2023-07-19 17:55:02.039 |                                |                                |                                |
Query OK, 3 row(s) in set (0.001853s)

查看当前mnode

kubectl exec -it tdengine-1 -n tdengine-test -- taos -s "show mnodes\G"
taos> show mnodes\G
*************************** 1.row ***************************
         id: 1
   endpoint: tdengine-0.taosd.tdengine-test.svc.cluster.local:6030
       role: leader
     status: ready
create_time: 2023-07-19 17:54:18.559
reboot_time: 2023-07-19 17:54:19.520
Query OK, 1 row(s) in set (0.001282s)

创建mnode
kubectl exec -it tdengine-0 -n tdengine-test -- taos -s "create mnode on dnode 2"
kubectl exec -it tdengine-0 -n tdengine-test -- taos -s "create mnode on dnode 3"

查看mnode

kubectl exec -it tdengine-1 -n tdengine-test -- taos -s "show mnodes\G"

taos> show mnodes\G
*************************** 1.row ***************************
         id: 1
   endpoint: tdengine-0.taosd.tdengine-test.svc.cluster.local:6030
       role: leader
     status: ready
create_time: 2023-07-19 17:54:18.559
reboot_time: 2023-07-20 09:19:36.060
*************************** 2.row ***************************
         id: 2
   endpoint: tdengine-1.taosd.tdengine-test.svc.cluster.local:6030
       role: follower
     status: ready
create_time: 2023-07-20 09:22:05.600
reboot_time: 2023-07-20 09:22:12.838
*************************** 3.row ***************************
         id: 3
   endpoint: tdengine-2.taosd.tdengine-test.svc.cluster.local:6030
       role: follower
     status: ready
create_time: 2023-07-20 09:22:20.042
reboot_time: 2023-07-20 09:22:23.271
Query OK, 3 row(s) in set (0.003108s)
相关推荐
小余大牛成长记3 小时前
开源对象存储新选择:在Docker上部署MinIO并实现远程管理
docker·容器·开源
神经蛙爱学习902918 小时前
一分钟掌握 kom:一行代码,轻松玩转 Kubernetes 多集群管理!
kubernetes
谢白羽9 小时前
docker与大模型(口语化原理和实操讲解)
运维·docker·容器
栀夏6139 小时前
K8s学习笔记之了解k8s的网络模型
笔记·学习·kubernetes
nangonghen9 小时前
k8clone二进制工具迁移k8s中的无状态应用
云原生·kubernetes·备份·恢复
Zoran_卓9 小时前
在k8s上部署Crunchy Postgres for Kubernetes
数据库·容器·kubernetes
檀越剑指大厂9 小时前
【Docker系列】如何在 Docker 环境中部署和运行 One API
运维·docker·容器
运维小文9 小时前
K8S资源限制之ResourceQuota
云原生·容器·kubernetes·资源限制·resourcequota
XMYX-09 小时前
Kubernetes 集群中防火墙配置的挑战及替代防护策略
云原生·容器·kubernetes
AI小杨12 小时前
【Docker容器】一、一文了解docker
spring cloud·docker·云原生·容器·eureka