MySplitter 是什么?
[English] [GitHub] [Apache License 2.0]
MySplitter 是一个轻量级 JDBC 中间件,面向读写分离、多数据源路由、高可用、负载均衡和多数据库连接管理。
当前发布版本是 1.1.0。生产默认事务模式仍然是安全的本地 JDBC 事务;同时,1.1.0 引入了带实验开关的 XA 事务 MVP,用于验证跨多个数据源、跨不同数据库品牌的分布式事务能力。
MySplitter 适合解决什么问题?
- 一个
DataSource管理多个逻辑数据库。 - SQL 按规则路由到不同数据库。
- 读请求走 reader,写请求走 writer。
- 一个逻辑 JDBC 连接内复用已打开的真实物理连接。
- 事务期间将读写流量固定到 writer 路由,避免破坏事务语义。
- 数据源异常时自动标记不可用,并按配置间隔恢复检测。
- 每条路由 SQL 都会执行 datasource filter,包括复用连接和事务固定路由。
- 通过
MySplitterDataSource#getStatus()查看数据源状态。 - 使用安全 YAML 解析配置。
- 支持面向本地开发和生产部署的密码来源模式。
- 通过
mysplitter-spring-boot-starter集成 Spring Boot2.7.x。
发布状态
| 模块 | 状态 |
|---|---|
| 最新版本 | 1.1.0 |
| Java 基线 | Java 8+ |
| Spring Boot Starter | Spring Boot 2.7.x |
| 首选连接池 | HikariCP |
| 配置格式 | YAML |
| 生产默认事务模式 | local |
| 实验事务模式 | xa,需要 mysplitter.experimental.xa.enabled=true |
核心能力
- 支持一个或多个逻辑数据库下的多个数据源节点。
- 支持读写分离,默认 SQL 分类策略偏保守,锁敏感或不确定 SQL 会走 writer。
- 支持自定义数据库路由和 SQL 重写。
- 支持轮询、随机权重负载均衡。
- 支持数据源高可用、异常节点标记和恢复检测。
- 使用 SnakeYAML 安全构造进行 YAML 配置加载。
- 密码来源模式:
plain:本地开发便利模式。environment:从系统属性或环境变量解析生产部署密钥。legacy-rsa:仅作为历史 RSA 配置兼容模式。
- Spring Boot Starter 同时发布
spring.factories和AutoConfiguration.imports。 - 实验性 XA 基础能力:文件事务日志、持久化决策和恢复执行器。
1.1.0 中的实验性 XA
XA 已可用于开发验证,但还不是生产默认能力。
已经实现:
- 事务 SPI 和嵌入式事务协调器。
- 基于
XADataSource的 XA 分支注册。 - 两阶段 prepare、commit、rollback。
- append-only 文件事务日志。
- 持久化 commit / rollback 决策。
- 基于
XAResource.recover(...)的恢复执行器。 - H2 路由 XA 生命周期覆盖。
- MySQL、PostgreSQL prepared branch 文件日志恢复覆盖。
- PostgreSQL 数据库不可达时的恢复失败覆盖,确保 prepared 分支仍保持可恢复。
重要限制:
- 只有设置
-Dmysplitter.experimental.xa.enabled=true才能启用 XA。 - 生产部署仍建议使用
transaction.mode: local,除非你明确接受当前实验契约。 - 如果要验证恢复能力,请使用
transaction.coordinator.logStore: file。 - PostgreSQL 需要设置
max_prepared_transactions > 0。 - 管理 API、指标、结构化恢复事件、多进程协调器 fencing 还未实现。
Maven 坐标
核心库:
<dependency>
<groupId>com.mysplitter</groupId>
<artifactId>mysplitter</artifactId>
<version>1.1.0</version>
</dependency>
Spring Boot Starter:
<dependency>
<groupId>com.mysplitter</groupId>
<artifactId>mysplitter-spring-boot-starter</artifactId>
<version>1.1.0</version>
</dependency>
Spring Boot 快速开始
application.yml
spring:
datasource:
mysplitter:
configuration-file: classpath:mysplitter.yml
mysplitter.yml
mysplitter:
passwordSource: environment
databasesRoutingHandler: com.example.DatabaseRouter
readAndWriteParser: com.example.ReadAndWriteParser
illAlertHandler: com.example.DataSourceIllAlertHandler
common:
dataSourceClass: com.zaxxer.hikari.HikariDataSource
loadBalance:
read:
enabled: true
strategy: polling
failTimeout: 30s
write:
enabled: true
strategy: polling
failTimeout: 30s
databases:
database-a:
readers:
reader-1:
configuration:
jdbcUrl: jdbc:mysql://localhost:3306/user
username: ${DB_USER}
password: ${DB_PASSWORD}
driverClassName: com.mysql.cj.jdbc.Driver
connectionTimeout: 1000
writers:
writer-1:
configuration:
jdbcUrl: jdbc:mysql://localhost:3306/user
username: ${DB_USER}
password: ${DB_PASSWORD}
driverClassName: com.mysql.cj.jdbc.Driver
connectionTimeout: 1000
本地开发如果希望明文写在 YAML 中,也可以使用 passwordSource: plain。
实验性 XA 配置预览
mysplitter:
transaction:
mode: xa
coordinator:
type: embedded
logStore: file
logFile: ./target/mysplitter-xa.log
recovery:
enabled: true
interval: 10s
databases:
database-a:
writers:
writer-1:
configuration:
jdbcUrl: jdbc:mysql://127.0.0.1:3306/app
username: ${DB_USER}
password: ${DB_PASSWORD}
driverClassName: com.mysql.cj.jdbc.Driver
xaDataSourceClass: com.mysql.jdbc.jdbc2.optional.MysqlXADataSource
xaProperties:
url: jdbc:mysql://127.0.0.1:3306/app?useSSL=false
user: ${DB_USER}
password: ${DB_PASSWORD}
启动时显式打开实验开关:
java -Dmysplitter.experimental.xa.enabled=true ...
仓库文档
- Release notes
- Verification commands
- v1.0 compatibility matrix
- v1.1 XA compatibility matrix
- v1.1 XA operations notes
后续方向
1.1.x:带实验开关的 XA MVP 和事务基础设施。1.2.x:扩展异构数据库 XA 兼容矩阵和失败恢复矩阵。1.3.x:为部分关系型数据库提供 AT 风格自动补偿事务。1.4.x:为无法安全使用 XA 或 AT 的资源提供 TCC / Saga 扩展点。