feat: 新增 all-in-one 模块,单包聚合 17 个数据库模块 - #560
Open
xiaoyekanren wants to merge 11 commits into
Open
Conversation
新增 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 配对。
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
Collaborator
|
LGTM~ |
SpriCoder
approved these changes
Aug 24, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
改动内容
新增
all-in-oneMaven 模块,把 17 个数据库模块聚合为一个发行包。发行包布局
lib/core/—— core jar 及其依赖(FakeDB / SelfCheck 只需该目录)lib/<db>/—— 各数据库模块自身解析出的依赖集(17 个目录)bin/startup.sh/benchmark.bat按DB_SWITCH路由到对应lib/<db>,classpath 顺序为「专属目录在前、lib/core 在后」
构建方式
必须 clean 构建。
构建期去重
DedupTool(构建期由 exec-maven-plugin 执行),对lib/<db>做两步收敛:lib/core同名且逐字节一致的 jarlib/core没有、但出现在 ≥2 个模块目录且各副本逐字节一致的 jar,提升一份到
lib/core并删除各模块目录副本(日志绑定 jar 除外)zipfileset的filemode与 JDK 版本无关),保证 .sh 保持 0755 可执行位
附带修复
pom 属性,各模块自动跟随);绑定收敛——core 唯一 slf4j-reload4j、
iotdb 两模块显式声明 slf4j-api 2.0.9 与 logback 1.3.16、dolphindb
显式 slf4j-log4j12,并排除 dolphindb 传递的 slf4j-simple;
verification 同步升级
encrypt=false;修复两个上游缺陷(insertStatements槽位越界、typeMap TEXT 撞表)
验证
对 17 个数据库模块逐一验证(core 的 FakeDB/SelfCheck 本机冒烟通过)。
Docker 冒烟方式:官方镜像起容器,all-in-one 发行包按对应 DB_SWITCH
跑小规模写入,判定标准为 exit 0 + 延迟矩阵 + INGESTION 行。
--add-opens参数组tsd.http.request.enable_chunked=trueTAOS_FQDN=127.0.0.1)+ 容器内 libtaos 2.6NoSuchMethodError: commitCallbackHandler),3.x 服务端需 3.x driver(官方文档 https://docs.tdengine.com/reference/connector/java/)。cleanup 撞 VGroup offline 时序可加IS_DELETE_DATA=falseTDENGINE_REPLICA=1。容器内 libtaos 与 driver 3.2.1 配套通过;发行包 + 拷出的容器 libtaos 混搭报 0x2354(Authentication failure)encrypt=falsetimescaledb-cluster 集群验证
模块特性:连接 access node,建分布式 hypertable
(
create_distributed_hypertable)后写入,数据按 chunk 分发到 data node。因此需要一套 multi-node 集群来端到端验证。
16 = access node,17/18 = data node;PostgreSQL 15(PGDG 源)+
timescaledb 2.13.1(packagecloud 源)
移除、PostgreSQL 16 起不再支持(服务端硬编码拒绝),因此
2.13.1 + PostgreSQL 15 是最后支持 multi-node 的组合(2.29.1 等
新版本均验证过无
add_data_node/ 建分布式 hypertable 被拒)shared_preload_libraries='timescaledb'、wal_level=logical、max_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 点全对上)
模块的 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 主机侧项为部署环境混搭所致。