528 lines
9.8 KiB
Markdown
528 lines
9.8 KiB
Markdown
|
|
# ThingsBoard 部署方案分析
|
|||
|
|
|
|||
|
|
## 1. 概述
|
|||
|
|
|
|||
|
|
ThingsBoard 支持两种主要的部署模式:单体模式(Monolith)和微服务模式(Microservices)。此外,还支持 Docker 容器化部署和 Kubernetes 部署。
|
|||
|
|
|
|||
|
|
## 2. 部署模式
|
|||
|
|
|
|||
|
|
### 2.1 单体模式(Monolith)
|
|||
|
|
|
|||
|
|
**适用场景**:
|
|||
|
|
- 小型部署
|
|||
|
|
- 开发和测试环境
|
|||
|
|
- 设备数量较少(< 10,000)
|
|||
|
|
|
|||
|
|
**特点**:
|
|||
|
|
- 所有服务运行在一个进程中
|
|||
|
|
- 配置简单
|
|||
|
|
- 资源占用较少
|
|||
|
|
- 不支持水平扩展
|
|||
|
|
|
|||
|
|
**配置**:
|
|||
|
|
```yaml
|
|||
|
|
service:
|
|||
|
|
type: monolith
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**启动方式**:
|
|||
|
|
```bash
|
|||
|
|
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**: 版本控制执行器
|
|||
|
|
|
|||
|
|
**配置**:
|
|||
|
|
```yaml
|
|||
|
|
service:
|
|||
|
|
type: tb-core # 或 tb-rule-engine, tb-transport 等
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 3. Docker 部署
|
|||
|
|
|
|||
|
|
### 3.1 Docker Compose 配置
|
|||
|
|
|
|||
|
|
**位置**: `docker/docker-compose.yml`
|
|||
|
|
|
|||
|
|
**主要服务**:
|
|||
|
|
|
|||
|
|
```yaml
|
|||
|
|
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`
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
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`
|
|||
|
|
|
|||
|
|
```yaml
|
|||
|
|
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`
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
DATABASE_TS_TYPE=cassandra
|
|||
|
|
CASSANDRA_CLUSTER_NAME=ThingsBoard Cluster
|
|||
|
|
CASSANDRA_URL=cassandra:9042
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Docker Compose**: `docker/docker-compose.hybrid.yml`
|
|||
|
|
|
|||
|
|
```yaml
|
|||
|
|
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`
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
CACHE_TYPE=valkey
|
|||
|
|
REDIS_URL=valkey:6379
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### Valkey Cluster
|
|||
|
|
|
|||
|
|
**配置文件**: `docker/cache-valkey-cluster.env`
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
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`
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
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`
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
QUEUE_TYPE=kafka
|
|||
|
|
KAFKA_SERVERS=kafka:9092
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Docker Compose**: `docker/docker-compose.kafka.yml`
|
|||
|
|
|
|||
|
|
```yaml
|
|||
|
|
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`
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
QUEUE_TYPE=rabbitmq
|
|||
|
|
RABBITMQ_URL=amqp://rabbitmq:5672
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3.5 部署步骤
|
|||
|
|
|
|||
|
|
#### 3.5.1 准备环境
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 1. 创建日志目录
|
|||
|
|
./docker-create-log-folders.sh
|
|||
|
|
|
|||
|
|
# 2. 配置环境变量(.env 文件)
|
|||
|
|
DATABASE=postgres # 或 hybrid
|
|||
|
|
CACHE=valkey # 或 valkey-cluster, valkey-sentinel
|
|||
|
|
QUEUE=kafka # 或 rabbitmq
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 3.5.2 安装
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 安装 ThingsBoard(包含数据库初始化)
|
|||
|
|
./docker-install-tb.sh --loadDemo
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 3.5.3 启动服务
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 启动所有服务
|
|||
|
|
./docker-start-services.sh
|
|||
|
|
|
|||
|
|
# 查看服务状态
|
|||
|
|
docker-compose ps
|
|||
|
|
|
|||
|
|
# 查看日志
|
|||
|
|
docker-compose logs -f tb-core1
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 3.5.4 停止服务
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 停止服务
|
|||
|
|
./docker-stop-services.sh
|
|||
|
|
|
|||
|
|
# 删除服务
|
|||
|
|
./docker-remove-services.sh
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 3.5.5 更新服务
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 更新所有服务
|
|||
|
|
./docker-update-service.sh
|
|||
|
|
|
|||
|
|
# 更新特定服务
|
|||
|
|
./docker-update-service.sh tb-core1 tb-mqtt-transport1
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 3.5.6 升级
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 停止服务
|
|||
|
|
./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 运行示例
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 使用 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 配置示例
|
|||
|
|
|
|||
|
|
```yaml
|
|||
|
|
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
|
|||
|
|
|
|||
|
|
**启用监控**:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 设置环境变量
|
|||
|
|
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 进行服务发现:
|
|||
|
|
|
|||
|
|
```yaml
|
|||
|
|
services:
|
|||
|
|
zookeeper:
|
|||
|
|
image: zookeeper:3.8.1
|
|||
|
|
ports:
|
|||
|
|
- "2181"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 9.2 内部通信
|
|||
|
|
|
|||
|
|
服务间通过消息队列和 ZooKeeper 进行通信,不需要直接网络连接。
|
|||
|
|
|
|||
|
|
## 10. 存储配置
|
|||
|
|
|
|||
|
|
### 10.1 数据持久化
|
|||
|
|
|
|||
|
|
使用 Docker Volumes 持久化数据:
|
|||
|
|
|
|||
|
|
```yaml
|
|||
|
|
volumes:
|
|||
|
|
postgres-data:
|
|||
|
|
cassandra-data:
|
|||
|
|
tb-logs:
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 10.2 日志管理
|
|||
|
|
|
|||
|
|
日志目录映射到宿主机:
|
|||
|
|
|
|||
|
|
```yaml
|
|||
|
|
volumes:
|
|||
|
|
- ./tb-node/log:/var/log/thingsboard
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 11. 安全配置
|
|||
|
|
|
|||
|
|
### 11.1 SSL/TLS
|
|||
|
|
|
|||
|
|
**位置**: `docker/haproxy/config/`
|
|||
|
|
|
|||
|
|
配置 SSL 证书:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 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 参数
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
JAVA_OPTS="-Xms512m -Xmx2048m -XX:+UseG1GC"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 12.2 数据库连接池
|
|||
|
|
|
|||
|
|
```yaml
|
|||
|
|
spring:
|
|||
|
|
datasource:
|
|||
|
|
hikari:
|
|||
|
|
maximum-pool-size: 50
|
|||
|
|
minimum-idle: 10
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 12.3 消息队列配置
|
|||
|
|
|
|||
|
|
```yaml
|
|||
|
|
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
|
|||
|
|
|