# ThingsBoard 架构图 Docker 部署方案分析 ## 1. 架构图组件映射 根据提供的架构图,各组件在 Docker 部署中的映射关系如下: ``` 架构图组件 → Docker 服务 ───────────────────────────────────────────────────────── ThingsBoard Transports → tb-mqtt-transport (多个实例) → tb-http-transport (多个实例) → tb-coap-transport → tb-lwm2m-transport → tb-snmp-transport Queue → kafka (消息队列) → 或 rabbitmq (可选) ThingsBoard Core → tb-core1, tb-core2 (核心服务) Rule Engine → tb-rule-engine1, tb-rule-engine2 SQL Database → postgres (PostgreSQL) NoSQL Database → cassandra (Cassandra,可选) → 或 timescaledb (PostgreSQL扩展) ThingsBoard UI → tb-web-ui1, tb-web-ui2 External Systems → 外部系统(不包含在部署中) ZooKeeper → zookeeper (服务发现) JS Executor → tb-js-executor (JavaScript执行器) HAProxy → haproxy (负载均衡器) ``` ## 2. 完整 Docker Compose 部署架构 ### 2.1 微服务模式部署结构 ```yaml # 完整部署包含以下服务组: 基础设施层: - zookeeper # 服务发现 - postgres # SQL数据库(实体数据) - cassandra # NoSQL数据库(时序数据,可选) - kafka # 消息队列 - valkey/redis # 缓存 核心服务层: - tb-core1, tb-core2 # 核心服务(2个实例,高可用) - tb-rule-engine1, tb-rule-engine2 # 规则引擎(2个实例) 传输层服务: - tb-mqtt-transport1, tb-mqtt-transport2 # MQTT传输(2个实例) - tb-http-transport1, tb-http-transport2 # HTTP传输(2个实例) - tb-coap-transport # CoAP传输 - tb-lwm2m-transport # LWM2M传输 - tb-snmp-transport # SNMP传输 前端服务: - tb-web-ui1, tb-web-ui2 # Web UI(2个实例) 辅助服务: - tb-js-executor # JavaScript执行器(10个副本) - tb-vc-executor1, tb-vc-executor2 # 版本控制执行器 - haproxy # 负载均衡器 ``` ### 2.2 数据流在 Docker 中的实现 ``` 设备 (Devices) ↓ ├─ 直接连接 ──────────────────────────────┐ │ (MQTT/HTTP/CoAP/LWM2M/SNMP) │ │ │ └─ 通过网关 (Gateways) ──────────────────┤ (Modbus/OPC-UA/其他协议) │ 转为 MQTT ────────────────────────────┤ ↓ ┌───────────────────────────────┐ │ ThingsBoard Transports │ │ (Docker 服务) │ │ - tb-mqtt-transport1/2 │ │ - tb-http-transport1/2 │ │ - tb-coap-transport │ │ - tb-lwm2m-transport │ │ - tb-snmp-transport │ └───────────┬───────────────────┘ │ ↓ ┌───────────────────────────────┐ │ Queue (Kafka) │ │ Docker: kafka │ │ Port: 9092 │ └───────────┬───────────────────┘ │ ↓ ┌───────────────────────────────┐ │ ThingsBoard Core │ │ Docker: tb-core1, tb-core2 │ │ 通过 ZooKeeper 服务发现 │ └───────────┬───────────────────┘ │ ┌───────────────────┴───────────────────┐ │ │ ↓ ↓ ┌───────────────────────┐ ┌───────────────────────┐ │ SQL Database │ │ Queue (Kafka) │ │ Docker: postgres │ │ (路由到规则引擎) │ │ Port: 5432 │ └───────────┬───────────┘ │ 存储: 实体数据 │ │ └────────────────────────┘ ↓ ┌───────────────────────────────┐ │ Rule Engine │ │ Docker: tb-rule-engine1/2 │ └───────────┬───────────────────┘ │ ↓ ┌───────────────────────────────┐ │ NoSQL Database │ │ Docker: cassandra │ │ Port: 9042 │ │ 存储: 时序数据 │ └───────────────────────────────┘ 前端访问: ┌───────────────────────────────┐ │ ThingsBoard UI │ │ Docker: tb-web-ui1, tb-web-ui2 │ │ 通过 HAProxy 负载均衡 │ └───────────┬───────────────────┘ │ ↓ REST API / WebSockets ┌───────────────────────────────┐ │ ThingsBoard Core │ │ (tb-core1, tb-core2) │ └───────────────────────────────┘ ``` ## 3. Docker Compose 配置文件组合 ### 3.1 配置文件组合方式 ThingsBoard 使用多个 Docker Compose 文件组合的方式: ```bash # 基础服务配置 docker-compose.yml # 主配置文件(定义所有服务) # 数据库配置(选择其一) docker-compose.postgres.yml # PostgreSQL模式(SQL数据库) docker-compose.hybrid.yml # 混合模式(PostgreSQL + Cassandra) # 消息队列配置(选择其一) docker-compose.kafka.yml # Kafka队列 docker-compose.confluent.yml # Confluent Kafka(生产环境) # 缓存配置(选择其一) docker-compose.valkey.yml # Valkey单节点 docker-compose.valkey-cluster.yml # Valkey集群 docker-compose.valkey-sentinel.yml # Valkey哨兵模式 # 其他可选配置 docker-compose.edqs.yml # 事件驱动查询服务 docker-compose.prometheus-grafana.yml # 监控服务 ``` ### 3.2 完整部署命令示例 ```bash # 组合所有配置文件启动(PostgreSQL + Kafka + Valkey) docker-compose \ -f docker-compose.yml \ -f docker-compose.postgres.yml \ -f docker-compose.kafka.yml \ -f docker-compose.valkey.yml \ up -d # 或使用混合模式(PostgreSQL + Cassandra + Kafka) docker-compose \ -f docker-compose.yml \ -f docker-compose.hybrid.yml \ -f docker-compose.kafka.yml \ -f docker-compose.valkey-cluster.yml \ up -d ``` ## 4. 各组件详细配置 ### 4.1 ThingsBoard Transports(传输层) #### MQTT Transport ```yaml tb-mqtt-transport1: image: "${DOCKER_REPO}/${MQTT_TRANSPORT_DOCKER_NAME}:${TB_VERSION}" ports: - "1883" # MQTT端口 environment: TB_SERVICE_ID: tb-mqtt-transport1 ZOOKEEPER_ENABLED: "true" ZOOKEEPER_URL: zookeeper:2181 MQTT_BIND_ADDRESS: 0.0.0.0 MQTT_BIND_PORT: 1883 env_file: - tb-mqtt-transport.env - queue-kafka.env # 队列配置 depends_on: - zookeeper - kafka - tb-core1 - tb-core2 ``` **端口映射**: - `1883`: MQTT协议(非加密) - `8883`: MQTT over SSL(通过配置启用) **数据流**: ``` 设备 (MQTT客户端) ↓ 连接 tb-mqtt-transport (接收MQTT消息) ↓ 认证设备 ↓ 解析消息 ↓ 发送到队列 Kafka Queue ↓ 消费 tb-core (处理设备数据) ``` #### HTTP Transport ```yaml tb-http-transport1: image: "${DOCKER_REPO}/${HTTP_TRANSPORT_DOCKER_NAME}:${TB_VERSION}" ports: - "8081" # HTTP API端口 environment: TB_SERVICE_ID: tb-http-transport1 HTTP_BIND_PORT: 8081 depends_on: - zookeeper - kafka - tb-core1 - tb-core2 ``` #### CoAP Transport ```yaml tb-coap-transport: image: "${DOCKER_REPO}/${COAP_TRANSPORT_DOCKER_NAME}:${TB_VERSION}" ports: - "5683:5683/udp" # CoAP端口(UDP) environment: TB_SERVICE_ID: tb-coap-transport depends_on: - zookeeper - kafka - tb-core1 - tb-core2 ``` #### LWM2M Transport ```yaml tb-lwm2m-transport: image: "${DOCKER_REPO}/${LWM2M_TRANSPORT_DOCKER_NAME}:${TB_VERSION}" ports: - "5685:5685/udp" # LWM2M非加密 - "5686:5686/udp" # LWM2M over DTLS environment: TB_SERVICE_ID: tb-lwm2m-transport ``` #### SNMP Transport ```yaml tb-snmp-transport: image: "${DOCKER_REPO}/${SNMP_TRANSPORT_DOCKER_NAME}:${TB_VERSION}" ports: - "1620:1620/udp" # SNMP Trap端口 environment: TB_SERVICE_ID: tb-snmp-transport ``` ### 4.2 Queue(消息队列) #### Kafka 配置 ```yaml kafka: image: "bitnamilegacy/kafka:4.0" ports: - "9092:9092" # Kafka Broker端口 environment: KAFKA_CFG_LISTENERS: "PLAINTEXT://:9092" KAFKA_CFG_ADVERTISED_LISTENERS: "PLAINTEXT://:9092" KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 env_file: - kafka.env depends_on: - zookeeper ``` **队列主题**: - `tb.rule-engine.*`: 规则引擎消息 - `tb.core.*`: 核心服务消息 - `tb.transport.*`: 传输层消息 **服务连接配置**: ```bash # queue-kafka.env TB_QUEUE_TYPE=kafka TB_KAFKA_SERVERS=kafka:9092 ``` ### 4.3 ThingsBoard Core(核心服务) ```yaml tb-core1: image: "${DOCKER_REPO}/${TB_NODE_DOCKER_NAME}:${TB_VERSION}" ports: - "8080" # HTTP API端口 - "7070" # Edge RPC端口 environment: TB_SERVICE_ID: tb-core1 TB_SERVICE_TYPE: tb-core # 核心服务类型 ZOOKEEPER_ENABLED: "true" ZOOKEEPER_URL: zookeeper:2181 TRANSPORT_TYPE: remote # 使用远程传输服务 JS_EVALUATOR: remote # 使用远程JS执行器 env_file: - tb-node.env - tb-node.postgres.env # 数据库配置 - queue-kafka.env # 队列配置 depends_on: - zookeeper - postgres - kafka - tb-js-executor ``` **核心功能**: - 设备管理 - 用户和租户管理 - REST API服务 - Actor系统管理 - 与传输层和规则引擎通信 ### 4.4 Rule Engine(规则引擎) ```yaml tb-rule-engine1: image: "${DOCKER_REPO}/${TB_NODE_DOCKER_NAME}:${TB_VERSION}" ports: - "8080" # HTTP端口(用于管理) environment: TB_SERVICE_ID: tb-rule-engine1 TB_SERVICE_TYPE: tb-rule-engine # 规则引擎类型 ZOOKEEPER_ENABLED: "true" ZOOKEEPER_URL: zookeeper:2181 env_file: - tb-node.env - tb-node.postgres.env - queue-kafka.env depends_on: - zookeeper - postgres - kafka - tb-js-executor ``` **数据流**: ``` tb-core (处理设备数据) ↓ 发送消息到队列 Kafka Queue (tb.rule-engine.*) ↓ 消费消息 tb-rule-engine (执行规则链) ↓ 保存时序数据 Cassandra/PostgreSQL (时序数据库) ↓ 触发动作 External Systems (HTTP/Email/RPC等) ``` ### 4.5 SQL Database(PostgreSQL) ```yaml postgres: image: "postgres:16" ports: - "5432" # 仅内部访问 environment: POSTGRES_DB: thingsboard POSTGRES_PASSWORD: postgres volumes: - ./tb-node/postgres:/var/lib/postgresql/data ``` **存储内容**: - 租户、用户、设备等实体数据 - 设备配置和属性 - 规则链配置 - 仪表板配置 - 如果使用SQL模式,还存储时序数据 ### 4.6 NoSQL Database(Cassandra) ```yaml cassandra: image: "cassandra:5.0" ports: - "9042" # CQL端口 volumes: - ./tb-node/cassandra:/var/lib/cassandra ``` **存储内容**: - 设备遥测数据(时序数据) - 高写入性能 - 适合大规模时序数据存储 **配置**: ```bash # tb-node.hybrid.env DATABASE_TS_TYPE=cassandra CASSANDRA_CLUSTER_NAME=ThingsBoard Cluster CASSANDRA_URL=cassandra:9042 ``` ### 4.7 ThingsBoard UI(前端) ```yaml tb-web-ui1: image: "${DOCKER_REPO}/${WEB_UI_DOCKER_NAME}:${TB_VERSION}" ports: - "8080" # HTTP端口 env_file: - tb-web-ui.env depends_on: - tb-core1 - tb-core2 ``` **功能**: - 提供Web用户界面 - 通过REST API与tb-core通信 - 通过WebSocket接收实时数据 **负载均衡**: 通过HAProxy在多个UI实例间负载均衡。 ### 4.8 ZooKeeper(服务发现) ```yaml zookeeper: image: "zookeeper:3.8.1" ports: - "2181" # ZooKeeper端口 environment: ZOO_MY_ID: 1 ZOO_SERVERS: server.1=zookeeper:2888:3888;zookeeper:2181 ``` **作用**: - 服务注册与发现 - 负载均衡 - 服务健康检查 - 分区管理 ### 4.9 JS Executor(JavaScript执行器) ```yaml tb-js-executor: image: "${DOCKER_REPO}/${JS_EXECUTOR_DOCKER_NAME}:${TB_VERSION}" deploy: replicas: 10 # 10个副本 env_file: - tb-js-executor.env ``` **作用**: - 执行规则引擎中的JavaScript代码 - 数据处理和转换 - 支持高并发执行 ### 4.10 HAProxy(负载均衡器) ```yaml haproxy: image: thingsboard/haproxy-certbot:2.2.33-alpine ports: - "80:80" # HTTP - "443:443" # HTTPS - "1883:1883" # MQTT - "7070:7070" # Edge RPC environment: HTTP_PORT: 80 HTTPS_PORT: 443 MQTT_PORT: 1883 EDGES_RPC_PORT: 7070 links: - tb-core1 - tb-core2 - tb-web-ui1 - tb-web-ui2 - tb-mqtt-transport1 - tb-mqtt-transport2 ``` **功能**: - HTTP/HTTPS负载均衡(Web UI和API) - MQTT连接负载均衡 - Edge RPC负载均衡 - SSL/TLS终止 ## 5. 部署步骤 ### 5.1 准备环境 ```bash # 1. 创建日志目录 cd docker ./docker-create-log-folders.sh # 2. 配置环境变量(.env文件) DATABASE=hybrid # 或 postgres CACHE=valkey-cluster # 或 valkey, valkey-sentinel QUEUE=kafka # 或 rabbitmq ``` ### 5.2 安装数据库 ```bash # 安装并初始化数据库 ./docker-install-tb.sh --loadDemo ``` 这会: - 启动PostgreSQL(和Cassandra,如果使用混合模式) - 初始化数据库schema - 加载演示数据(如果使用--loadDemo) ### 5.3 启动所有服务 ```bash # 启动所有服务 ./docker-start-services.sh ``` 实际执行的命令: ```bash docker-compose \ -f docker-compose.yml \ -f docker-compose.hybrid.yml \ -f docker-compose.kafka.yml \ -f docker-compose.valkey-cluster.yml \ up -d ``` ### 5.4 验证部署 ```bash # 查看服务状态 docker-compose ps # 查看日志 docker-compose logs -f tb-core1 # 访问Web UI # http://localhost (通过HAProxy) ``` ## 6. 架构图流程在Docker中的完整实现 ### 6.1 设备直接连接流程 ``` 设备 (MQTT客户端) ↓ 连接 mqtt://localhost:1883 HAProxy (负载均衡) ↓ 分发到 tb-mqtt-transport1 或 tb-mqtt-transport2 ↓ 认证设备(通过tb-core) ↓ 接收遥测数据 ↓ 发送到Kafka队列 (tb.transport.telemetry) Kafka Queue ↓ 消费消息 tb-core1 或 tb-core2 (通过ZooKeeper服务发现) ↓ 处理设备数据 ↓ 保存实体数据到PostgreSQL ↓ 发送到规则引擎队列 (tb.rule-engine.*) Kafka Queue (规则引擎队列) ↓ 消费消息 tb-rule-engine1 或 tb-rule-engine2 ↓ 执行规则链 ↓ 保存时序数据到Cassandra ↓ 触发动作(HTTP/Email等) External Systems ``` ### 6.2 网关连接流程 ``` 设备 (Modbus/OPC-UA) ↓ 连接 ThingsBoard Gateway (边缘设备,独立部署) ↓ 转换为MQTT ↓ 连接 mqtt://localhost:1883 HAProxy ↓ 分发 tb-mqtt-transport1/2 ↓ (后续流程同上) ``` ### 6.3 前端访问流程 ``` 用户浏览器 ↓ 访问 http://localhost HAProxy (负载均衡) ↓ 分发到 tb-web-ui1 或 tb-web-ui2 ↓ REST API调用 tb-core1 或 tb-core2 (通过ZooKeeper发现) ↓ 查询PostgreSQL ↓ 返回数据 tb-web-ui ↓ 展示数据 用户浏览器 实时数据: tb-web-ui ↓ WebSocket连接 tb-core ↓ 推送实时数据 tb-web-ui (实时更新) ``` ## 7. 高可用性配置 ### 7.1 服务冗余 - **tb-core**: 2个实例(tb-core1, tb-core2) - **tb-rule-engine**: 2个实例(tb-rule-engine1, tb-rule-engine2) - **tb-mqtt-transport**: 2个实例(负载均衡) - **tb-http-transport**: 2个实例(负载均衡) - **tb-web-ui**: 2个实例(负载均衡) ### 7.2 数据库高可用 - **PostgreSQL**: 可以配置主从复制 - **Cassandra**: 集群模式(多节点) - **Kafka**: 集群模式(多broker) ### 7.3 负载均衡 - **HAProxy**: 统一入口,分发请求到多个服务实例 - **ZooKeeper**: 服务发现和负载均衡 ## 8. 网络配置 ### 8.1 Docker网络 所有服务在同一个Docker Compose网络中,通过服务名访问: ``` zookeeper:2181 # ZooKeeper postgres:5432 # PostgreSQL cassandra:9042 # Cassandra kafka:9092 # Kafka tb-core1:8080 # Core服务1 tb-core2:8080 # Core服务2 ``` ### 8.2 端口映射 **对外暴露的端口**(通过HAProxy): - `80`: HTTP - `443`: HTTPS - `1883`: MQTT - `7070`: Edge RPC **内部端口**(不映射到宿主机): - `5432`: PostgreSQL - `9042`: Cassandra - `9092`: Kafka - `2181`: ZooKeeper ## 9. 监控配置 ### 9.1 Prometheus + Grafana ```bash # 启用监控 export MONITORING_ENABLED=true # 启动监控服务 docker-compose -f docker-compose.prometheus-grafana.yml up -d ``` **访问地址**: - Prometheus: `http://localhost:9090` - Grafana: `http://localhost:3000` ### 9.2 指标暴露 所有服务都启用了Prometheus指标: ```yaml environment: METRICS_ENABLED: "true" METRICS_ENDPOINTS_EXPOSE: prometheus ``` ## 10. 总结 ### 10.1 架构图到Docker的映射 | 架构图组件 | Docker服务 | 镜像 | 端口 | |-----------|-----------|------|------| | ThingsBoard Transports | tb-mqtt-transport* | thingsboard/tb-mqtt-transport | 1883 | | | tb-http-transport* | thingsboard/tb-http-transport | 8081 | | | tb-coap-transport | thingsboard/tb-coap-transport | 5683 | | | tb-lwm2m-transport | thingsboard/tb-lwm2m-transport | 5685/5686 | | | tb-snmp-transport | thingsboard/tb-snmp-transport | 1620 | | Queue | kafka | bitnamilegacy/kafka | 9092 | | ThingsBoard Core | tb-core* | thingsboard/tb-node | 8080/7070 | | Rule Engine | tb-rule-engine* | thingsboard/tb-node | 8080 | | SQL Database | postgres | postgres:16 | 5432 | | NoSQL Database | cassandra | cassandra:5.0 | 9042 | | ThingsBoard UI | tb-web-ui* | thingsboard/tb-web-ui | 8080 | | ZooKeeper | zookeeper | zookeeper:3.8.1 | 2181 | | JS Executor | tb-js-executor | thingsboard/tb-js-executor | - | | Load Balancer | haproxy | thingsboard/haproxy-certbot | 80/443/1883 | ### 10.2 部署特点 1. **微服务架构**: 每个组件独立部署,可单独扩展 2. **高可用性**: 关键服务多实例部署 3. **负载均衡**: HAProxy统一入口,ZooKeeper服务发现 4. **可扩展性**: 支持水平扩展各个服务 5. **灵活性**: 可选择不同的数据库和队列配置 ### 10.3 数据流总结 ``` 设备数据流: 设备 → Transport → Kafka → Core → Kafka → Rule Engine → Cassandra 控制流: UI → HAProxy → Core → PostgreSQL 实时流: UI ← WebSocket ← Core ← Transport ← 设备 ``` 通过Docker Compose的组合配置,可以实现架构图中展示的完整数据流和处理流程。