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

528 lines
9.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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-***: 传输服务MQTTHTTPCoAPLWM2MSNMP
- **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. **数据库选择**: 支持 PostgreSQLTimescaleDBCassandra
4. **高可用性**: 支持服务冗余和数据库集群
5. **监控集成**: 内置 Prometheus Grafana 支持
6. **易于扩展**: 微服务模式支持水平扩展
根据实际需求选择合适的部署方案
- **小型部署**: 单体模式 + Docker
- **中型部署**: 微服务模式 + Docker Compose
- **大型部署**: 微服务模式 + Kubernetes