【springboot】集成ShardingSphere分库分表
Apache ShardingSphere是一个开源的分布式数据库中间件解决方案,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(规划中)这三款相互独立,但又可以混合部署配合使用的产品组成。这些产品提供标准化的数据分片、分布式事务和数据库治理功能,适用于多样化的应用场景,如Java同构、异构语言、云原生等。
分库分表的基本概念
随着业务的发展和数据量的增长,单一数据库可能会面临性能瓶颈。为了解决这个问题,可以通过分库分表的方式来提升数据库性能和可扩展性。分库分表主要包括以下几种方式:
-
垂直分表:将一个表按照字段分成多个表,每个表存储一部分字段。这种方式可以减少IO争抢,提高热门数据的操作效率。
-
垂直分库:将不同的表分到不同的数据库中,每个数据库部署在不同的服务器上,实现专库专用。
-
水平分表:在同一个数据库内,将同一个表的数据按一定规则拆到多个表中,如按照ID取模或者数值范围分表。
-
水平分库:将同一个表的数据按规则拆到不同的数据库中,每个数据库可以部署在不同的服务器上。
ShardingSphere的工作原理
ShardingSphere通过配置规则,对数据库进行分片,实现数据的分散存储。它的核心组件包括:
- Sharding-JDBC:作为JDBC驱动的增强版,负责在应用端完成数据库分库分表相关的路由和操作。
- Sharding-Proxy:作为数据库代理端,提供封装了数据库二进制协议的服务端版本,支持异构语言。
- Sharding-Sidecar(规划中):作为kubernetes的云原生数据库代理,以sidecar的形式代理所有对数据库的访问。
ShardingSphere的配置和使用
-
引入依赖:在项目中引入ShardingSphere的依赖,如Sharding-JDBC的starter。
-
配置数据源:在配置文件中定义数据源,指定数据库连接信息。
-
定义分片策略:配置分片规则,包括分片键、分片算法等。
-
编写业务代码:在业务代码中,通过ShardingSphere提供的API进行数据库操作。
Apache ShardingSphere 支持所有符合 SQL-92 标准语法的数据库,包括但不限于以下几种流行的关系型数据库:
- MySQL:一种广泛使用的开源关系型数据库管理系统。
- PostgreSQL:一种功能强大的开源对象关系型数据库系统。
- SQL Server:由微软开发的关系型数据库管理系统。
- Oracle:甲骨文公司开发的一种关系型数据库管理系统。
此外,ShardingSphere 也能够兼容其他遵循 SQL92 标准的数据库,这意味着只要数据库支持 SQL-92 标准的语法,理论上都可以与 ShardingSphere 配合使用。SQL-92 是 SQL 语言的一个标准化版本,大多数现代数据库系统都遵循这个标准,因此 ShardingSphere 具有很好的通用性和兼容性。
Apache ShardingSphere 提供了对分布式事务的支持,这对于在分布式数据库环境中确保数据的一致性和完整性至关重要。ShardingSphere 实现分布式事务的方式主要有两种:XA 事务和柔性事务(BASE 事务)。
XA 事务
XA 事务是基于两阶段提交(Two-Phase Commit,2PC)协议的分布式事务实现。在这种模式下,事务的提交分为两个阶段:
-
准备阶段(Prepare Phase):事务协调者询问所有参与者(通常是各个数据库实例)是否准备好提交事务。如果所有参与者都响应“是”,则进入第二阶段;如果有任何一个参与者响应“否”,则事务终止。
-
提交阶段(Commit Phase):如果所有参与者都同意提交,协调者将通知所有参与者正式提交事务。如果任何一步失败,事务将被回滚。
ShardingSphere 集成了业界主流的 XA 事务管理器,如 Atomikos、Narayana 和 Bitronix,以支持 XA 事务的执行。
柔性事务(BASE 事务)
柔性事务遵循 BASE(Basically Available, Soft State, Eventually Consistent)原则,追求的是最终一致性,而不是强一致性。这种事务模型适用于可以容忍数据在一段时间内不一致的场景,最终会达到一致状态。
ShardingSphere 内部集成了对 Seata(一种开源的分布式事务解决方案)的支持,允许开发者使用柔性事务来处理分布式事务。Seata 的 AT 模式是一种实现 BASE 事务的机制,它通过注册、提交和回滚分支事务来管理分布式事务。
使用示例
在 ShardingSphere 中使用分布式事务通常涉及到以下步骤:
- 配置数据源:定义分布式数据源和事务管理器。
- 开启事务:通过设置自动提交为
false来开启事务。 - 执行 SQL:执行需要在事务中运行的 SQL 操作。
- 提交或回滚事务:根据操作结果提交或回滚事务。
ShardingSphere 通过 @ShardingTransactionType 注解或 TransactionTypeHolder 工具类来支持在方法级别或线程级别设置事务类型。
在Spring Boot项目中集成ShardingSphere,可以让你轻松实现数据的分片(Sharding)和读写分离(Read/Write Splitting)。以下是集成ShardingSphere的基本步骤:
1. 添加依赖
首先,需要在项目的pom.xml文件中添加ShardingSphere的Spring Boot Starter依赖。以下是一个基本的依赖配置示例:
<dependencies>
<!-- Spring Boot Starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- ShardingSphere JDBC Starter -->
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>你的ShardingSphere版本</version>
</dependency>
<!-- 其他依赖... -->
</dependencies>
2. 配置数据源
在application.yml或application.properties文件中配置数据源和分片规则。以下是一个配置示例(使用application.yml):
spring:
shardingsphere:
datasource:
names: ds0,ds1
ds0:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/ds0
username: root
password: password
ds1:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/ds1
username: root
password: password
sharding:
tables:
your_table:
actual-data-nodes: ds$->{0..1}.your_table_$->{0..1}
table-strategy:
inline:
sharding-column: your_sharding_column
algorithm-expression: your_table_$->{your_sharding_column % 2}
props:
sql:
show: true
3. 编写业务代码
在业务代码中,你可以像使用普通的JDBC一样使用ShardingSphere提供的API。ShardingSphere会自动根据配置的分片规则来路由SQL到正确的数据源和表。
import org.apache.shardingsphere.shardingjdbc.api.ShardingDataSourceFactory;
import javax.sql.DataSource;
import java.sql.SQLException;
public class ShardingSphereDemo {
public static void main(String[] args) throws SQLException {
// 创建数据源
DataSource dataSource = ShardingDataSourceFactory.createDataSource(
"your_data_source_config",
new Properties(),
"your_sharding_rule_config"
);
// 使用数据源执行SQL
// ...
}
}
4. 启动类
确保你的Spring Boot启动类上没有@EnableAutoConfiguration注解,因为ShardingSphere需要自己的配置来初始化数据源。
5. 运行和测试
启动你的Spring Boot应用,并执行一些数据库操作来测试ShardingSphere是否正常工作。你可以通过日志输出来验证SQL是否被正确路由到了指定的数据源和表。
在ShardingSphere中配置和使用XA事务管理器主要涉及以下几个步骤:
1. 添加依赖
首先,需要在项目的pom.xml文件中添加ShardingSphere的XA事务管理器依赖。以Atomikos为例,添加如下依赖:
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-transaction-xa-core</artifactId>
<version>${shardingsphere.version}</version>
</dependency>
确保${shardingsphere.version}是你所选用的ShardingSphere版本。
2. 配置数据源
在ShardingSphere中配置数据源时,需要为每个数据源指定事务管理器。以下是一个配置示例:
spring:
shardingsphere:
datasource:
names: ds0,ds1
ds0:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/ds0
username: root
password: password
# 配置XA事务管理器
xa:
type: Atomikos
atomikos:
# Atomikos配置项
ds1:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/ds1
username: root
password: password
3. 配置XA事务管理器参数(可选)
ShardingSphere默认的XA事务管理器为Atomikos,可以通过在项目的classpath中添加jta.properties来定制化Atomikos配置项。具体的配置规则请参考Atomikos的官方文档。
4. 设置事务类型
在Java代码中,通过TransactionTypeHolder工具类来设置事务类型为XA事务:
import org.apache.shardingsphere.transaction.core.TransactionTypeHolder;
// 在方法执行前设置事务类型为XA
TransactionTypeHolder.set(TransactionType.XA);
5. 执行事务操作
在设置了事务类型后,可以执行SQL操作,ShardingSphere会自动根据配置的XA事务管理器来管理事务的生命周期。
6. 提交或回滚事务
在执行完所有SQL操作后,可以根据业务逻辑来提交或回滚事务。ShardingSphere会自动调用XA事务管理器的相应方法来完成事务的提交或回滚。
注意事项
- 确保在项目的
logs目录中不要删除由Atomikos生成的xa_tx.log文件,这是XA崩溃恢复时所需的日志。 - 如果需要自定义Atomikos的配置,可以在项目的classpath中添加
jta.properties文件,并按照Atomikos的官方文档进行配置。
通过以上步骤,就可以在ShardingSphere中配置和使用XA事务管理器来处理分布式事务了。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)