thingsboard/summary/04-部署方案分析.md

9.8 KiB
Raw Permalink Blame History

ThingsBoard 部署方案分析

1. 概述

ThingsBoard 支持两种主要的部署模式单体模式Monolith和微服务模式Microservices。此外还支持 Docker 容器化部署和 Kubernetes 部署。

2. 部署模式

2.1 单体模式Monolith

适用场景:

  • 小型部署
  • 开发和测试环境
  • 设备数量较少(< 10,000

特点:

  • 所有服务运行在一个进程中
  • 配置简单
  • 资源占用较少
  • 不支持水平扩展

配置:

service:
  type: monolith

启动方式:

java -jar thingsboard.jar

2.2 微服务模式Microservices

适用场景:

  • 生产环境
  • 大规模部署
  • 高可用性要求
  • 需要水平扩展

特点:

  • 服务拆分,独立部署
  • 支持水平扩展
  • 高可用性
  • 配置复杂

服务组件:

  • tb-core: 核心服务设备管理、用户管理、API
  • tb-rule-engine: 规则引擎服务
  • tb-transport-*: 传输服务MQTT、HTTP、CoAP、LWM2M、SNMP
  • tb-js-executor: JavaScript 执行器
  • tb-web-ui: Web UI 服务
  • tb-vc-executor: 版本控制执行器

配置:

service:
  type: tb-core  # 或 tb-rule-engine, tb-transport 等

3. Docker 部署

3.1 Docker Compose 配置

位置: docker/docker-compose.yml

主要服务:

services:
  # 核心服务
  tb-core1:
    image: "${DOCKER_REPO}/${TB_NODE_DOCKER_NAME}:${TB_VERSION}"
    environment:
      TB_SERVICE_ID: tb-core1
      TB_SERVICE_TYPE: tb-core
    env_file:
      - tb-node.env
    
  tb-core2:
    image: "${DOCKER_REPO}/${TB_NODE_DOCKER_NAME}:${TB_VERSION}"
    environment:
      TB_SERVICE_ID: tb-core2
      TB_SERVICE_TYPE: tb-core
    
  # 规则引擎服务
  tb-rule-engine1:
    image: "${DOCKER_REPO}/${TB_NODE_DOCKER_NAME}:${TB_VERSION}"
    environment:
      TB_SERVICE_ID: tb-rule-engine1
      TB_SERVICE_TYPE: tb-rule-engine
    
  # 传输服务
  tb-mqtt-transport1:
    image: "${DOCKER_REPO}/${MQTT_TRANSPORT_DOCKER_NAME}:${TB_VERSION}"
    environment:
      TB_SERVICE_ID: tb-mqtt-transport1
    ports:
      - "1883"
    
  # Web UI 服务
  tb-web-ui1:
    image: "${DOCKER_REPO}/${WEB_UI_DOCKER_NAME}:${TB_VERSION}"
    
  # 负载均衡器
  haproxy:
    image: thingsboard/haproxy-certbot:2.2.33-alpine
    ports:
      - "80:80"
      - "443:443"
      - "1883:1883"

3.2 数据库配置

PostgreSQL 模式

配置文件: docker/tb-node.postgres.env

DATABASE_TS_TYPE=sql
SPRING_DRIVER_CLASS_NAME=org.postgresql.Driver
SPRING_DATASOURCE_URL=jdbc:postgresql://postgres:5432/thingsboard
SPRING_DATASOURCE_USERNAME=postgres
SPRING_DATASOURCE_PASSWORD=postgres

Docker Compose: docker/docker-compose.postgres.yml

services:
  postgres:
    image: postgres:16.6
    environment:
      POSTGRES_DB: thingsboard
      POSTGRES_PASSWORD: postgres
    volumes:
      - postgres-data:/var/lib/postgresql/data

混合模式PostgreSQL + Cassandra

配置文件: docker/tb-node.hybrid.env

DATABASE_TS_TYPE=cassandra
CASSANDRA_CLUSTER_NAME=ThingsBoard Cluster
CASSANDRA_URL=cassandra:9042

Docker Compose: docker/docker-compose.hybrid.yml

services:
  postgres:
    # PostgreSQL 配置(用于实体数据)
  
  cassandra:
    image: cassandra:4.1
    environment:
      CASSANDRA_CLUSTER_NAME: ThingsBoard Cluster
    volumes:
      - cassandra-data:/var/lib/cassandra

3.3 缓存配置

Valkey Standalone

配置文件: docker/cache-valkey.env

CACHE_TYPE=valkey
REDIS_URL=valkey:6379

Valkey Cluster

配置文件: docker/cache-valkey-cluster.env

CACHE_TYPE=valkey-cluster
REDIS_CLUSTER_NODES=valkey-node-1:6379,valkey-node-2:6379,valkey-node-3:6379

Valkey Sentinel

配置文件: docker/cache-valkey-sentinel.env

CACHE_TYPE=valkey-sentinel
REDIS_SENTINEL_MASTER=mymaster
REDIS_SENTINEL_NODES=valkey-sentinel-1:26379,valkey-sentinel-2:26379,valkey-sentinel-3:26379

3.4 消息队列配置

Kafka

配置文件: docker/queue-kafka.env

QUEUE_TYPE=kafka
KAFKA_SERVERS=kafka:9092

Docker Compose: docker/docker-compose.kafka.yml

services:
  zookeeper:
    image: zookeeper:3.8.1
  
  kafka:
    image: confluentinc/cp-kafka:7.5.0
    depends_on:
      - zookeeper
    environment:
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181

RabbitMQ

配置文件: docker/queue-rabbitmq.env

QUEUE_TYPE=rabbitmq
RABBITMQ_URL=amqp://rabbitmq:5672

3.5 部署步骤

3.5.1 准备环境

# 1. 创建日志目录
./docker-create-log-folders.sh

# 2. 配置环境变量(.env 文件)
DATABASE=postgres  # 或 hybrid
CACHE=valkey      # 或 valkey-cluster, valkey-sentinel
QUEUE=kafka       # 或 rabbitmq

3.5.2 安装

# 安装 ThingsBoard包含数据库初始化
./docker-install-tb.sh --loadDemo

3.5.3 启动服务

# 启动所有服务
./docker-start-services.sh

# 查看服务状态
docker-compose ps

# 查看日志
docker-compose logs -f tb-core1

3.5.4 停止服务

# 停止服务
./docker-stop-services.sh

# 删除服务
./docker-remove-services.sh

3.5.5 更新服务

# 更新所有服务
./docker-update-service.sh

# 更新特定服务
./docker-update-service.sh tb-core1 tb-mqtt-transport1

3.5.6 升级

# 停止服务
./docker-stop-services.sh

# 执行升级
./docker-upgrade-tb.sh --fromVersion=3.6.0

# 启动服务
./docker-start-services.sh

4. 单 Docker 镜像部署

4.1 适用场景

  • 快速测试
  • 小型部署
  • 开发环境

4.2 镜像类型

位置: msa/tb/

  1. thingsboard/tb: 使用 HSQLDB内存数据库
  2. thingsboard/tb-postgres: 使用 PostgreSQL
  3. thingsboard/tb-cassandra: 使用混合模式PostgreSQL + Cassandra

4.3 运行示例

# 使用 PostgreSQL
docker run -it -p 9090:9090 -p 1883:1883 \
  -v ~/.mytb-data:/data \
  --name mytb \
  thingsboard/tb-postgres

5. Kubernetes 部署

5.1 服务拆分

在 Kubernetes 中,每个服务可以作为独立的 Deployment

  • tb-core: Core Service Deployment
  • tb-rule-engine: Rule Engine Deployment
  • tb-transport-*: Transport Service Deployments
  • tb-web-ui: Web UI Deployment

5.2 配置示例

apiVersion: apps/v1
kind: Deployment
metadata:
  name: tb-core
spec:
  replicas: 2
  selector:
    matchLabels:
      app: tb-core
  template:
    metadata:
      labels:
        app: tb-core
    spec:
      containers:
      - name: tb-core
        image: thingsboard/tb-node:latest
        env:
        - name: TB_SERVICE_TYPE
          value: "tb-core"
        - name: SPRING_DATASOURCE_URL
          value: "jdbc:postgresql://postgres:5432/thingsboard"

6. 监控配置

6.1 Prometheus + Grafana

启用监控:

# 设置环境变量
export MONITORING_ENABLED=true

访问地址:

  • Prometheus: http://localhost:9090
  • Grafana: http://localhost:3000 (默认用户名: admin, 密码: foobar)

配置文件:

  • Prometheus: docker/monitoring/prometheus/prometheus.yml
  • Grafana: docker/monitoring/grafana/provisioning/dashboards/

7. 高可用性配置

7.1 服务冗余

  • tb-core: 至少 2 个实例
  • tb-rule-engine: 至少 2 个实例
  • tb-transport-*: 至少 2 个实例(每个传输协议)

7.2 数据库高可用

  • PostgreSQL: 使用主从复制或集群模式
  • Cassandra: 使用集群模式(至少 3 个节点)

7.3 缓存高可用

  • Valkey Cluster: 3 主 3 从
  • Valkey Sentinel: 1 主 1 从 1 哨兵

7.4 消息队列高可用

  • Kafka: 使用集群模式(至少 3 个 broker
  • RabbitMQ: 使用集群模式或镜像队列

8. 负载均衡

8.1 HAProxy 配置

位置: docker/haproxy/config/

HAProxy 负责:

  • HTTP/HTTPS 流量负载均衡
  • MQTT 连接负载均衡
  • WebSocket 连接负载均衡

8.2 端口映射

  • 80/443: HTTP/HTTPS
  • 1883: MQTT
  • 7070: Edge RPC
  • 9999: HAProxy 统计

9. 网络配置

9.1 服务发现

使用 ZooKeeper 进行服务发现:

services:
  zookeeper:
    image: zookeeper:3.8.1
    ports:
      - "2181"

9.2 内部通信

服务间通过消息队列和 ZooKeeper 进行通信,不需要直接网络连接。

10. 存储配置

10.1 数据持久化

使用 Docker Volumes 持久化数据:

volumes:
  postgres-data:
  cassandra-data:
  tb-logs:

10.2 日志管理

日志目录映射到宿主机:

volumes:
  - ./tb-node/log:/var/log/thingsboard

11. 安全配置

11.1 SSL/TLS

位置: docker/haproxy/config/

配置 SSL 证书:

# Let's Encrypt 证书
- ./haproxy/letsencrypt:/etc/letsencrypt

# 自定义证书
- ./haproxy/certs.d:/usr/local/etc/haproxy/certs.d

11.2 防火墙

建议只开放必要端口:

  • 80/443: HTTP/HTTPS
  • 1883: MQTT
  • 5683: CoAP

12. 性能调优

12.1 JVM 参数

JAVA_OPTS="-Xms512m -Xmx2048m -XX:+UseG1GC"

12.2 数据库连接池

spring:
  datasource:
    hikari:
      maximum-pool-size: 50
      minimum-idle: 10

12.3 消息队列配置

queue:
  core:
    pack-processing-timeout: 3000
    poll-interval: 25

13. 总结

ThingsBoard 的部署方案具有以下特点:

  1. 灵活的部署模式: 支持单体和微服务两种模式
  2. 容器化支持: 完整的 Docker 和 Kubernetes 支持
  3. 数据库选择: 支持 PostgreSQL、TimescaleDB、Cassandra
  4. 高可用性: 支持服务冗余和数据库集群
  5. 监控集成: 内置 Prometheus 和 Grafana 支持
  6. 易于扩展: 微服务模式支持水平扩展

根据实际需求选择合适的部署方案:

  • 小型部署: 单体模式 + Docker
  • 中型部署: 微服务模式 + Docker Compose
  • 大型部署: 微服务模式 + Kubernetes