1、 Docker-compose 拉取镜像部署
2、 Dockerfile
# 使用 thingsboard/openjdk17:bookworm-slim 作为基础镜像
FROM thingsboard/openjdk17:bookworm-slim
# 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/
# FROM bellsoft/liberica-openjdk-debian:17.0.13-cds
# 添加维护者信息
LABEL maintainer="thingsboard"
# 创建必要的目录
RUN mkdir -p /opt/project/thingsboard/data /opt/project/thingsboard/conf
# 设置工作目录
WORKDIR /opt/project/thingsboard
# 暴露端口
EXPOSE 18080
# 设置环境变量
ENV TZ=Asia/Shanghai \
LANG=C.UTF-8 \
LC_ALL=C.UTF-8 \
JAVA_OPTS="-Xms2g -Xmx4g -XX:+UseG1GC -XX:MaxGCPauseMillis=200" \
LOGGING_CONFIG="/opt/project/thingsboard/conf/logback.xml"
# 定义一个构建时参数
ARG BUILD_VERSION
# 将 JAR 文件复制到容器中
COPY ./thingsboard-${BUILD_VERSION}-boot.jar ./thingsboard.jar
# 容器启动命令
# -Djava.security.egd=file:/dev/./urandom 这个设置可以加速应用启动,尤其是在 Docker 环境中,减少因随机数生成器初始化
ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom \
-Dlogging.config=${LOGGING_CONFIG} \
-Dpkg.logFolder=${LOG_FOLDER} \
-Dpkg.name=${LOG_FILE_NAME} \
-jar thingsboard.jar ${JAVA_OPTS}
3、 docker-compose.yml
thingsboard.yml配置说明
www.ithingsboard.com/docs//user-…
version: '3.9.0'
services:
thingsboard:
build:
context: .
dockerfile: Dockerfile
args:
BUILD_VERSION: 3.9.0
container_name: thingsboard
image: thingsboard:3.9.0
network_mode: "host"
ports:
- "18080:18080"
- "11883:11883"
- "5683-5688:5683-5688/udp"
volumes:
- ./data:/opt/project/thingsboard/data
- ./conf:/opt/project/thingsboard/conf
- ./logs:/opt/project/thingsboard/logs
environment:
TZ: Asia/Shanghai
HTTP_BIND_PORT: 18080
MQTT_BIND_PORT: 11883
DEVICE_CONNECTIVITY_HTTP_PORT: 18080
# 用户 JWT Token 的过期时间(秒)默认 2.5 小时
JWT_TOKEN_EXPIRATION_TIME: 9000
# 用户 JWT 刷新令牌的过期时间(秒)默认 1 周
JWT_REFRESH_TOKEN_EXPIRATION_TIME: 604800
SPRING_DATASOURCE_URL: jdbc:postgresql://localhost:5432/thingsboard
SPRING_DATASOURCE_USERNAME: postgres
SPRING_DATASOURCE_PASSWORD: Liu971134228!@#
# 数据库线程池大小,默认 16
SPRING_DATASOURCE_MAXIMUM_POOL_SIZE: 32
# cassandra, sql, or timescale (for hybrid mode, DATABASE_TS_TYPE value should be cassandra, or timescale)
DATABASE_TS_TYPE: cassandra
CASSANDRA_URL: "127.0.0.1:9042"
CASSANDRA_USE_CREDENTIALS: true
CASSANDRA_USERNAME: cassandra
CASSANDRA_PASSWORD: cassandra
# 指定时间戳键值存储的分区大小。允许的值为MINUTES、HOURS、DAYS、MONTHS、INDEFINITE,默认:MONTHS
TS_KV_PARTITIONING: "MONTHS"
# 必要的性能调整 对于 100k设备,消息速率为10k/秒,系统平均可以处理约 9k/秒。CPU负载为90%,因此我们面临Postgresol性能瓶颈,使用不同的键进行的属性更新太多了。尝试更新从设备收到的条消息的属性"lastActivityTime”。对于 5k 设备,这没有问题,但对于 100k 设备,交易变得更慢。下一步我们将把设备状态写入 Cassandra.性能的巨大改进是使用以下环境变量将设备状态持久保存到 Cassandra 遥测中: 默认 false
PERSIST_STATE_TO_TELEMETRY: false
# caffeine or redis(7.2 - latest compatible version)
CACHE_TYPE: redis
REDIS_HOST: localhost
REDIS_PORT: 6379
REDIS_DB: 10
# redis密码
REDIS_PASSWORD: Liu971134228!@#
# 队列 in-memory or kafka (Apache Kafka) or aws-sqs (AWS SQS) or pubsub (PubSub) or service-bus (Azure Service Bus) or rabbitmq (RabbitMQ)
TB_QUEUE_TYPE: kafka
# 如果选择 kafka 则需要配置kafka 地址
TB_KAFKA_SERVERS: localhost:9092
# Default 16384 batch size. This setting gives the upper bound of the batch size to be sent
TB_KAFKA_BATCH_SIZE: 65536
# This variable creates a small amount of artificial delay—that is, rather than immediately sending out a record default is 1
TB_KAFKA_LINGER_MS: "5"
# 默认 10分钟不活动超时
DEFAULT_INACTIVITY_TIMEOUT: 600
# 一分钟扫描一次设备是否在线状态
DEFAULT_STATE_CHECK_INTERVAL: 60
# 最大队列数,如果设备很多,数据频繁可以调大一下,默认 1000
TB_SERVER_WS_DEFAULT_QUEUE_MESSAGES_PER_SESSION: 10000
# 创建租户会报错Not valid working directory: /opt/project/thingsboard. Please use either root project directory, application module directory or specify valid "install.data_dir" ENV variable to avoid automatic data directory lookup!
# 在thingsboard.yml最下面增加
#install:
# data_dir: "${INSTALL_DATA_DIR:/opt/project/thingsboard}"
# load_demo: "${INSTALL_LOAD_DEMO:true}"
INSTALL_DATA_DIR: /opt/project/thingsboard/data
# 设置初始堆内存为2g 设置最大堆内存为 4GB 启用 G1 垃圾回收器,适合大内存的场景 设置 G1 GC 的最大停顿时间为 200 毫秒
# JAVA_OPTS: "-Xms1g -Xmx2g -XX:+UseG1GC -XX:MaxGCPauseMillis=200"
JAVA_OPTS: "-Xms512m -Xmx1024m -XX:+UseG1GC -XX:MaxGCPauseMillis=200"
# 日志配置文件
LOGGING_CONFIG: "/opt/project/thingsboard/conf/logback.xml"
# 日志目录 将${pkg.logFolder}改为${LOG_FOLDER}
LOG_FOLDER: "/opt/project/thingsboard/logs"
# 日志文件名称 将${pkg.name}改为${LOG_FILE_NAME}
LOG_FILE_NAME: "thingsboard"
# TB_网关_仪表板_同步_存储库_统一资源定位地址 (github会超时,所以通过 gitee 同步 github,然后配置 gitee 即可)
TB_GATEWAY_DASHBOARD_SYNC_REPOSITORY_URL: https://gitee.com/onionCircle/gateway-management-extensions-dist.git
4、 ThingsBoard 在不同 AWS 实例上的性能
官方地址:www.ithingsboard.com/docs/refere…
SELECT
nspname || '.' || relname AS "relation",
pg_size_pretty ( pg_relation_size ( C.OID ) ) AS "size"
FROM
pg_class
C LEFT JOIN pg_namespace N ON ( N.OID = C.relnamespace )
WHERE
nspname NOT IN ( 'pg_catalog', 'information_schema' )
ORDER BY
pg_relation_size ( C.OID ) DESC
LIMIT 20;
5、使用cassandra存储设备实时数据
性能截图对比
# cassandra, sql, or timescale (for hybrid mode, DATABASE_TS_TYPE value should be cassandra, or timescale)
DATABASE_TS_TYPE: cassandra
CASSANDRA_URL: "127.0.0.1:9042"
CASSANDRA_USE_CREDENTIALS: true
CASSANDRA_USERNAME: cassandra
CASSANDRA_PASSWORD: cassandra
6、重新初始化数据库
初始化数据库参考文档
1、将docker-compose.yml下面的environment参数复制到thingsboard.yml中,因为我们要初始化cassandra数据库
2、执行初始化数据库
java -classpath thingsboard-3.9.0-boot.jar -Dspring.config.location=/opt/project/thingsboard/conf/thingsboard.yml -Dloader.main=org.thingsboard.server.ThingsboardInstallApplication -Dinstall.data_dir=/opt/project/thingsboard/data org.springframework.boot.loader.launch.PropertiesLauncher
7、 kafdrop安装部署
启动项目
java --add-opens=java.base/sun.nio.ch=ALL-UNNAMED -jar kafdrop-4.1.0.jar --kafka.brokerConnect=106.119.162.97:9092 --server.port=9999
可以看到队列都初始化到了 kafka,而不是内存
8、运行镜像
构建镜像
docker-compose build
运行镜像
docker-compose up -d
访问 ip + 18080登录
账号:sysadmin@thingsboard.org
密码:sysadmin