首页
/
行业洞察
/
正文
INDUSTRY INSIGHT · 深度
ThingsBoard 多租户备份:一条流水线跑通自动导出、校验与恢复演练
📅 2026/9/6 16:57:27
✍️ 爱科研究院
👁 阅读 3,247
ThingsBoard 多租户备份一条流水线跑通自动导出、校验与恢复演练【免费下载链接】thingsboardOpen-source IoT Platform - Device management, data collection, processing and visualization.项目地址: https://gitcode.com/GitHub_Trending/th/thingsboard运营一台多租户 ThingsBoard 平台最怕的不是数据丢了而是丢的那一刻发现备份文件打不开。下面给出一条可直接落地的 ThingsBoard 多租户备份流水线自动备份脚本 定时任务配置 数据完整性校验 备份恢复测试从单租户导出到全量遍历每一步都是最小可用命令。先定边界备份到底保什么动手写脚本前先回答三个问题避免什么都备、什么都备不全。保什么ThingsBoard 的核心状态分三层。设备历史时序在时序库表如ts_kv_*中实时属性在attributes_*表中租户/设备/规则链等元数据在主库表里。三层都要进备份范围。按什么粒度以租户为单位。ThingsBoard 通过 Tenant ID 做数据隔离租户管理的 DAO 层入口在 dao/src/main/java/org/thingsboard/server/dao/tenant/TenantDao负责租户记录的读写。备份脚本按TENANT_ID参数化天然做到租户间互不干扰。保留多久每日备份保留 30 天月度备份保留 12 个月由清理任务统一执行。另外注意 EDQSEdge Data Query Service本地模式下有一份 RocksDB 数据其存储路径由配置项queue.edqs.local.rocksdb_path决定默认${user.home}/.rocksdb/edqs见 EdqsRocksDb.java。如果业务启用了 EDQS把该目录也纳入备份清单。环境与前置条件一次列清避免跑脚本时再回头排查Docker 部署的 ThingsBoardPostgreSQL 容器可访问容器名与库名按实际 compose 文件调整参考 docker/docker-compose.postgres.yml。宿主机可执行docker exec具备目标容器用户权限。宿主机已安装curl、jq、tar。一个拥有 API 读权限的 token系统管理员或租户管理员均可。一个独立的测试库thingsboard_test只用于恢复演练与生产隔离。数据主配置文件为 application/src/main/conf/thingsboard.conf数据落盘位置数据库类型、队列、缓存都在此确认。打通备份链路从单租户到定时任务整条链路按执行顺序分四步前一步的输出就是后一步的输入。第一步单租户导出。按租户 ID 定向 dump 时序表与属性表压缩归档#!/bin/bash # backup_tenant.sh —— 导出指定租户的时序与属性数据 TENANT_ID$1 BACKUP_DIR./backups/tenant_${TENANT_ID}_$(date %Y%m%d_%H%M%S) mkdir -p $BACKUP_DIR # -t 精确匹配该租户的表避免全库 dump docker exec -t thingsboard_postgres_1 pg_dump -U postgres -d thingsboard \ -t ts_kv_${TENANT_ID}* $BACKUP_DIR/ts_kv.sql docker exec -t thingsboard_postgres_1 pg_dump -U postgres -d thingsboard \ -t attributes_${TENANT_ID}* $BACKUP_DIR/attributes.sql tar -zcf backups/$(basename $BACKUP_DIR).tar.gz -C backups $(basename $BACKUP_DIR)第二步全租户遍历。从 API 拉取租户 ID 列表逐个调用上一步的脚本# backup_all_tenants.sh 核心逻辑 TENANT_IDS$(curl -s -X GET http://localhost:8080/api/tenants \ -H X-Authorization: Bearer $JWT_TOKEN | jq -r .data[].id.id) for id in $TENANT_IDS; do ./backup_tenant.sh $id || echo FAIL: $id done第三步定时挂接。一行 crontab 挂在每日凌晨 2 点日志落盘0 2 * * * /path/to/backup_all_tenants.sh /var/log/thingsboard_backup.log 21第四步可选异地同步。压缩包生成后用rclone或aws s3 cp推一份到对象存储本地与远端各留一副本。让备份可被信任校验与告警备份文件存在不等于能用。校验逻辑只有一句话导出前后的记录数必须一致。在backup_tenant.sh的压缩步骤前插入PRE$(docker exec -t thingsboard_postgres_1 psql -U postgres -d thingsboard \ -tAc SELECT COUNT(*) FROM ts_kv_${TENANT_ID}) # 把 dump 文件导回临时库/临时 schema再数一遍 POST$(docker exec -i thingsboard_postgres_1 psql -U postgres -d thingsboard \ -tAc CREATE TEMP TABLE t AS SELECT * FROM ts_kv_${TENANT_ID}; SELECT COUNT(*) FROM t) if [ $PRE -eq $POST ]; then echo OK: $TENANT_ID ($PRE rows) else echo 备份验证失败: $TENANT_ID pre$PRE post$POST /var/log/thingsboard_backup_error.log fi失败不中断全量遍历只写错误日志。监控侧只需盯一个文件在 monitoring/ 部署的监控组件中配置一条规则匹配thingsboard_backup_error.log中出现备份验证失败即触发 CRITICAL 级告警无需解析大量备份日志。恢复演练最小流程不演练的备份只是压缩文件。每月挑一个租户走一遍三步骤解包tar -xzf 备份包 -C ./restore_test导入测试库docker exec -i thingsboard_test_postgres_1 psql -U postgres -d thingsboard_test ./restore_test/ts_kv.sql对数SELECT COUNT(*) FROM ts_kv_TENANT_ID;与备份时记录的行数比对一致即通过演练库必须独立于生产导入用的pg_restore/psql目标都指向thingsboard_test。上线清单✅存储本地备份目录挂持久化卷参考 docker/docker-compose.volumes.yml 的卷配置方式同时保留一份异地副本✅保留策略每日备份 30 天、月度备份 12 个月清理任务与备份任务同机调度✅增量数据量上来后用pg_dump --inserts替换为pg_dump -Fc自定义格式 pg_restore选择性恢复减少单次导出体积✅并行租户数多时在遍历循环中用xargs -P 4限并发而非串行 for✅资源限制备份命令加docker exec无特殊参数即可重活发生在数据库侧给 pg_dump 容器设 CPU/内存上限可参考 docker/docker-compose.yml 中其他服务容器的限制写法✅演练每月一次恢复演练并留档校验失败率连续 0 才算流水线稳定流水线跑起来后下一个值得做的扩展是把校验环节换成pg_dump文件本身的 checksum 比对sha256sum入库这样异地副本也能验证未被截断或损坏。【免费下载链接】thingsboardOpen-source IoT Platform - Device management, data collection, processing and visualization.项目地址: https://gitcode.com/GitHub_Trending/th/thingsboard创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📌 标签:
工业官网
设计趋势
AI 建站
SEO
获取完整报告 →
RELATED ARTICLES
推荐阅读
2026/9/6 16:57:27
Cua 完整上手指南:5 分钟让 AI 自己会用电脑
2026/9/6 16:57:27
微信小程序图书馆座位预约系统:从并发控制到订阅消息落地
2026/9/6 16:57:27
AI图像修复工具IOPaint:三步免费擦除照片中的水印、物体和人物
2026/9/6 17:27:29
NFC自动运行程序实战:NDEF消息、AAR记录与Tag Dispatch原理详解
2026/9/6 17:27:29
WeKnora 完整教程:5 分钟部署基于 RAG 的文档问答与智能检索系统
2026/9/6 17:27:29
薅的人工智能证书Certificate
2026/9/6 17:27:29
猫抓:嗅探网页媒体资源,把视频音频存成本地文件
2026/9/6 17:27:29
免费解锁 Wand 专业版功能:开源 Wand-Enhancer 补丁工具,4 个勾选项加 1 次点击搞定
2026/9/6 17:22:28
中文大语言模型多轮对话评测指南:上下文一致性与连贯性如何验证
2026/9/6 0:01:31
超人会飞不算本事:系统稳定依赖清晰规则与边界设计
2026/9/6 0:01:31
超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论
2026/9/6 0:01:31
基于CNN的调制信号识别:MATLAB实现时频图分类实战
2026/9/6 0:01:31
超人会飞不算本事:系统稳定依赖清晰规则与边界设计
2026/9/6 0:01:31
超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论
2026/9/6 0:01:31
基于CNN的调制信号识别:MATLAB实现时频图分类实战