Skip to content

feat: 新增 all-in-one 模块,单包聚合 17 个数据库模块 - #560

Open
xiaoyekanren wants to merge 11 commits into
thulab:masterfrom
xiaoyekanren:feat/all-in-one
Open

feat: 新增 all-in-one 模块,单包聚合 17 个数据库模块#560
xiaoyekanren wants to merge 11 commits into
thulab:masterfrom
xiaoyekanren:feat/all-in-one

Conversation

@xiaoyekanren

@xiaoyekanren xiaoyekanren commented Aug 13, 2026

Copy link
Copy Markdown
Collaborator

改动内容

新增 all-in-one Maven 模块,把 17 个数据库模块聚合为一个发行包。

发行包布局

  • lib/core/ —— core jar 及其依赖(FakeDB / SelfCheck 只需该目录)
  • lib/<db>/ —— 各数据库模块自身解析出的依赖集(17 个目录)
  • bin/startup.sh / benchmark.batDB_SWITCH 路由到对应 lib/<db>
    classpath 顺序为「专属目录在前、lib/core 在后」

构建方式

mvn clean package -pl all-in-one -am -DskipTests
# 产物:all-in-one/target/iot-benchmark-all-in-one.zip

必须 clean 构建。

构建期去重

  • 新增 DedupTool(构建期由 exec-maven-plugin 执行),对 lib/<db> 做两步收敛:
    • 删除与 lib/core 同名且逐字节一致的 jar
    • lib/core 没有、但出现在 ≥2 个模块目录且各副本逐字节一致的 jar,
      提升一份到 lib/core 并删除各模块目录副本(日志绑定 jar 除外)
    • 同名不同版本的 jar 保留在模块目录
  • zip 改由 maven-antrun-plugin 在去重后重建(zipfilesetfilemode
    与 JDK 版本无关),保证 .sh 保持 0755 可执行位

附带修复

  1. 日志生态统一:slf4j 1.7.x/logback 1.1.3 → 2.0.9/1.3.16(版本收敛到根
    pom 属性,各模块自动跟随);绑定收敛——core 唯一 slf4j-reload4j、
    iotdb 两模块显式声明 slf4j-api 2.0.9 与 logback 1.3.16、dolphindb
    显式 slf4j-log4j12,并排除 dolphindb 传递的 slf4j-simple;
    verification 同步升级
  2. timescaledb(-cluster):补充 postgresql 驱动依赖
  3. opentsdb:写入改用普通 put 模式;POST 显式固定长度;cleanup 容忍空库
  4. mssql:连接串加 encrypt=false;修复两个上游缺陷(insertStatements
    槽位越界、typeMap TEXT 撞表)
  5. core:补充 slf4j 绑定,FakeDB/SelfCheck 的日志与结果矩阵可正常输出

验证

对 17 个数据库模块逐一验证(core 的 FakeDB/SelfCheck 本机冒烟通过)。
Docker 冒烟方式:官方镜像起容器,all-in-one 发行包按对应 DB_SWITCH
跑小规模写入,判定标准为 exit 0 + 延迟矩阵 + INGESTION 行。

模块 版本 测试方式 是否测试 备注
influxdb 1.8 Docker 镜像 influxdb:1.8
influxdb-2.0 2.7 Docker 镜像 influxdb:2.7
cnosdb Docker 镜像 cnosdb/cnosdb
kairosdb 1.3.0 本地部署(官方 tar.gz 1.3.0,默认 H2 datastore) JDK 17 需 guice --add-opens 参数组
opentsdb 2.4.1 本地部署(官方 tar.gz 2.4.1 + HBase 2.4.18 standalone) 部署需开 tsd.http.request.enable_chunked=true
tdengine 2.6.0.34 Docker 镜像 tdengine/tdengine:2.6.0.34(host 网络,TAOS_FQDN=127.0.0.1)+ 容器内 libtaos 2.6 模块对位 2.x(driver 2.0.32,JNI),配 2.6 服务端 + 2.6 libtaos 实测通过(INGESTION ~6.9k/s);连 3.x 服务端(3.4.2.2)不兼容(NoSuchMethodError: commitCallbackHandler),3.x 服务端需 3.x driver(官方文档 https://docs.tdengine.com/reference/connector/java/)。cleanup 撞 VGroup offline 时序可加 IS_DELETE_DATA=false
tdengine-3.0 3.3 Docker 镜像 tdengine/tdengine:3.3.6.13 单节点容器,TDENGINE_REPLICA=1。容器内 libtaos 与 driver 3.2.1 配套通过;发行包 + 拷出的容器 libtaos 混搭报 0x2354(Authentication failure)
questdb 6.5.4 Docker 镜像 questdb/questdb:6.5.4
dolphindb-2.0 2.00.19 Docker 镜像 dolphindb/dolphindb:v2.00.19 MTW/PTA 两条写入路径;镜像自带社区版 license
dolphindb-3.0 3.00.6 Docker 镜像 dolphindb/dolphindb:v3.00.6 同上
timescaledb 16 Docker 镜像 timescale/timescaledb:pg16
timescaledb-cluster 2.13.1 三台 Ubuntu 24.04 apt 直装 PostgreSQL 15 + timescaledb 2.13.1 组 multi-node 集群 详见下方「timescaledb-cluster 集群验证」
victoriametrics Docker 镜像 victoriametrics/victoria-metrics
iotdb-1.3 1.3.2 Docker 镜像 apache/iotdb:1.3.2-standalone
iotdb-2.0 2.0.2 Docker 镜像 apache/iotdb:2.0.2-standalone
mssqlserver 2022 Docker 镜像 mcr.microsoft.com/mssql/server(2022) 预建 test 库;连接串 encrypt=false
sqlite 嵌入式 无需部署 单连接(多 client 并发撞表为模块自身限制)

timescaledb-cluster 集群验证

模块特性:连接 access node,建分布式 hypertable
create_distributed_hypertable)后写入,数据按 chunk 分发到 data node。
因此需要一套 multi-node 集群来端到端验证。

  • 部署:172.20.31.16-18 三台 Ubuntu 24.04(apt 直装,无 Docker):
    16 = access node,17/18 = data node;PostgreSQL 15(PGDG 源)+
    timescaledb 2.13.1(packagecloud 源)
  • 版本选择原因:multi-node 支持在 timescaledb 2.14.0 起从新装脚本中
    移除、PostgreSQL 16 起不再支持(服务端硬编码拒绝),因此
    2.13.1 + PostgreSQL 15 是最后支持 multi-node 的组合(2.29.1 等
    新版本均验证过无 add_data_node / 建分布式 hypertable 被拒)
  • 集群配置:三台 shared_preload_libraries='timescaledb'
    wal_level=logicalmax_prepared_transactions=100
    timescaledb.standalone_mode=off;access node 上 add_data_node
    (带 password 选项)+ 建 user mapping 注册两台 data node
  • 冒烟结果DB_SWITCH=TimescaleDB-cluster 小规模写入
    ✅ exit 0 + 延迟矩阵 + INGESTION 10000 点 0 失败(~5.2k/s);
    通过 chunk 归属映射与 data node 物理表行数确认数据实际落在 data node
    (chunk → dn2,10000 点全对上)
  • 注意点:data node 为集群级注册(一个库注册后其他库复用);
    模块的 DB_NAME 需指向注册过 data node 的库(默认 test 库不适用)

17/17 模块实测写入通过。tdengine 模块(driver 2.0.32,JNI)配 2.6
服务端配套实测通过(见表格备注,连 3.x 服务端不兼容)。

slf4j 统一后对统一后的发行包做全量冒烟(19 项 + tdengine-3.0 主机侧项):
18/19 项通过,日志无 multiple bindings 警告;tdengine 项 FAIL 为 driver
兼容问题(见表格备注),tdengine-3.0 主机侧项为部署环境混搭所致。

新增 all-in-one 模块,把 core + 16 个数据库模块打进一个发行包:
- lib/core:core.jar + 依赖(FakeDB/SelfCheck 仅需该目录)
- lib/<db>:各数据库模块自己的发行 lib(逐模块依赖语义,版本互不干扰)
- all-in-one 的 assembly 直接 fileSet 聚合各模块自己 assembly 出的
  target 发行目录,绕开 moduleSet/dependencySet 的全局依赖图仲裁
  (会把 slf4j 1.7 与 2.x 生态混装)。构建必须带 -am 且增量重建必须
  clean(dir 格式不清空输出目录,旧构建 jar 会残留)。
- core 模块补 assembly 打包与日志套装(logback 1.1.3),FakeDB/SelfCheck
  场景下 Latency 矩阵原本会因缺 slf4j 绑定被 NOP 吞掉。
- startup.sh / benchmark.bat 按 DB_SWITCH 前缀路由到对应 lib/<db>,
  classpath 顺序为专属目录在前、lib/core 在后;兼容旧 lib 平铺布局。
  startup.sh 在 MSYS/Git Bash 下把路径转 C:/ 形式并用分号分隔
  (Windows java 不认冒号分隔,修复 ClassNotFoundException)。

本地验证:SQLite(lib/sqlite 路由)与 FakeDB(仅 lib/core)均完整跑通
一轮 verification,Latency Matrix 正常输出。
1. timescaledb / timescaledb-cluster 模块 pom 缺 postgresql jdbc 依赖,
   运行时报 ClassNotFoundException: org.postgresql.Driver(上游 bug)。
2. iotdb-2.0/1.3 模块 lib 含 logback-classic 1.3.16(对 slf4j-api 1.7
   不可见),SLF4J 回退选中 reload4j binding,但发行包无 log4j 配置,
   LOGGER 输出(含 Latency 矩阵)被 log4j "No appenders" 吞掉。
   修复:conf 新增 log4j.properties,startup.sh / benchmark.bat 把 conf
   目录加入 classpath(log4j 1.2 自动加载 classpath 上的 log4j.properties)。
3. 注释说明 conf 进 classpath 的原因,双平台路径保持一致。

验证:Docker 起 8 个数据库(iotdb 2.0/1.3、influxdb 1.8/2.7、questdb
6.5.4、victoriametrics、timescaledb、cnosdb)全部冒烟通过;另注
questdb 官方镜像 6.6+ 已移除 commitLag 建表参数,压测需配 6.5.x 及更早。
- tdengine/tdengine-3.0: JDBC URL 改 jdbc:TAOS-RS://(REST 连接器,纯 Java),
  不依赖 libtaos 原生库,打包发行版在无 TDengine 客户端库环境下可用
- tdengine: REST 下 use 语句不生效(httpd 无状态),SQL 一律改用
  db.表名 全限定前缀,去掉 use 调用
- mssqlserver: 连接串加 encrypt=false(mssql-jdbc 12.2+ 默认强制 SSL,
  容器/自签证书环境 PKIX 校验失败)
- mssqlserver: insertStatements/queryStatements 槽位改按
  SensorType.values().length 分配(枚举 6→11 个后写死 6 槽 ordinal 越界)
- mssqlserver: 建表/清理按唯一类型名去重(typeMap default 与 TEXT 都映射
  text,循环建表撞表报 already an object named)
各数据库模块的发行目录各自带 core 全部传递依赖(fastutil 16MB
等),17 个数据库目录重复 18 份共约 490MB。新增 DedupTool(构建期
exec-maven-plugin 执行)删除 lib/<db> 中与 lib/core 文件名与内容
完全一致的 jar(同名不同版本保留在模块目录,运行时由「专属目录在
前、lib/core 在后」的 classpath 顺序从 core 加载);zip 改由
maven-antrun-plugin 在去重后重建(ant zipfileset 的 filemode 与
JDK 版本无关,保住 .sh 的 0755 可执行位)。

产物:zip 526MB→121MB(解压 599MB→132MB)、268 条目、18 个 lib
目录、fastutil 仅 1 份;15 个数据库 key 冒烟全过。
iotdb-2.0/1.3 模块显式用 logback 1.3.16(slf4j 2.x 生态),但
Maven 仲裁把 slf4j-api 定成 core 传递的 1.7.36;且 iotdb-2.0 依赖
iotdb-jdbc 2.0.11 SNAPSHOT,传递依赖漂移后模块目录完全没有 slf4j
2.x → 运行期 NoClassDefFoundError: org.slf4j.spi.LoggingEventAware。
显式声明 slf4j-api 2.0.9(与 iotdb-jdbc 传递版本一致),depth 1
仲裁胜过 core 传递的 1.7.36,模块目录与 logback 1.3.16 配对。
@xiaoyekanren xiaoyekanren changed the title feat: add all-in-one distribution module (one package for all DBs, 526MB->121MB) feat: 新增 all-in-one 模块,单包聚合 17 个数据库模块 Aug 13, 2026
2.0.32 只兼容 TDengine 2.x:
- JNI 连接器与 3.x 客户端库不兼容(commitCallbackHandler 符号缺失)
- REST 连接器读不到 3.x 响应的 code 字段(NPE: status is null)
3.2.9 实测兼容 3.4.2.2 服务端的 REST 与 JNI 两种连接器。
- writeUrl 去掉 ?summary 模式:summary 模式要求每个数据点带 summary
  字段而 OpenTSDBDataModel 没有,2.4.1 上写入必 400;普通 put 模式
  配合 auto_create_metrics 即可
- sendPost 显式固定长度(setFixedLengthStreamingMode)+ UTF-8 编码:
  批量写入的 JSON 体约 90KB,超过 HttpURLConnection 内部缓冲会隐式走
  chunked 传输;OpenTSDB 默认禁用 chunked 请求(enable_chunked=false)
- cleanup 容忍空库:首次运行时 metric 不存在,DELETE 返回 400
  (No such name),此时没有旧数据可删,跳过而非中断压测
- 根 pom 属性 org.slf4j.version=2.0.9、logback.version=1.3.16,各模块跟随
- core 目录只携带唯一绑定 slf4j-reload4j 2.0.9(删除并存的 logback-classic):
  JVM 对 classpath 通配符展开顺序不作保证,多绑定并存时 SLF4J 2.x
  ServiceLoader 随机选取其一
- iotdb 两模块显式 logback 1.3.16、dolphindb 两模块显式 slf4j-log4j12,
  经「模块目录优先」规则确定性生效
- dolphindb 排除 dolphindb-javaapi 传递的 slf4j-simple 第三方绑定
- verification 的 logback 1.2.13 同步升级并显式依赖 slf4j-api
@SpriCoder

Copy link
Copy Markdown
Collaborator

LGTM~

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants