766 lines
21 KiB
Markdown
766 lines
21 KiB
Markdown
|
|
# 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的组合配置,可以实现架构图中展示的完整数据流和处理流程。
|
|||
|
|
|