当前位置:   article > 正文

【springboot】集成ShardingSphere分库分表_springboot shardingsphere 分库分表

springboot shardingsphere 分库分表

Apache ShardingSphere是一个开源的分布式数据库中间件解决方案,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(规划中)这三款相互独立,但又可以混合部署配合使用的产品组成。这些产品提供标准化的数据分片、分布式事务和数据库治理功能,适用于多样化的应用场景,如Java同构、异构语言、云原生等。

分库分表的基本概念

随着业务的发展和数据量的增长,单一数据库可能会面临性能瓶颈。为了解决这个问题,可以通过分库分表的方式来提升数据库性能和可扩展性。分库分表主要包括以下几种方式:

  1. 垂直分表:将一个表按照字段分成多个表,每个表存储一部分字段。这种方式可以减少IO争抢,提高热门数据的操作效率。

  2. 垂直分库:将不同的表分到不同的数据库中,每个数据库部署在不同的服务器上,实现专库专用。

  3. 水平分表:在同一个数据库内,将同一个表的数据按一定规则拆到多个表中,如按照ID取模或者数值范围分表。

  4. 水平分库:将同一个表的数据按规则拆到不同的数据库中,每个数据库可以部署在不同的服务器上。

ShardingSphere的工作原理

ShardingSphere通过配置规则,对数据库进行分片,实现数据的分散存储。它的核心组件包括:

  • Sharding-JDBC:作为JDBC驱动的增强版,负责在应用端完成数据库分库分表相关的路由和操作。
  • Sharding-Proxy:作为数据库代理端,提供封装了数据库二进制协议的服务端版本,支持异构语言。
  • Sharding-Sidecar(规划中):作为kubernetes的云原生数据库代理,以sidecar的形式代理所有对数据库的访问。

ShardingSphere的配置和使用

  1. 引入依赖:在项目中引入ShardingSphere的依赖,如Sharding-JDBC的starter。

  2. 配置数据源:在配置文件中定义数据源,指定数据库连接信息。

  3. 定义分片策略:配置分片规则,包括分片键、分片算法等。

  4. 编写业务代码:在业务代码中,通过ShardingSphere提供的API进行数据库操作。

Apache ShardingSphere 支持所有符合 SQL-92 标准语法的数据库,包括但不限于以下几种流行的关系型数据库:

  1. MySQL:一种广泛使用的开源关系型数据库管理系统。
  2. PostgreSQL:一种功能强大的开源对象关系型数据库系统。
  3. SQL Server:由微软开发的关系型数据库管理系统。
  4. Oracle:甲骨文公司开发的一种关系型数据库管理系统。

此外,ShardingSphere 也能够兼容其他遵循 SQL92 标准的数据库,这意味着只要数据库支持 SQL-92 标准的语法,理论上都可以与 ShardingSphere 配合使用。SQL-92 是 SQL 语言的一个标准化版本,大多数现代数据库系统都遵循这个标准,因此 ShardingSphere 具有很好的通用性和兼容性。

Apache ShardingSphere 提供了对分布式事务的支持,这对于在分布式数据库环境中确保数据的一致性和完整性至关重要。ShardingSphere 实现分布式事务的方式主要有两种:XA 事务和柔性事务(BASE 事务)。

XA 事务

XA 事务是基于两阶段提交(Two-Phase Commit,2PC)协议的分布式事务实现。在这种模式下,事务的提交分为两个阶段:

  1. 准备阶段(Prepare Phase):事务协调者询问所有参与者(通常是各个数据库实例)是否准备好提交事务。如果所有参与者都响应“是”,则进入第二阶段;如果有任何一个参与者响应“否”,则事务终止。

  2. 提交阶段(Commit Phase):如果所有参与者都同意提交,协调者将通知所有参与者正式提交事务。如果任何一步失败,事务将被回滚。

ShardingSphere 集成了业界主流的 XA 事务管理器,如 Atomikos、Narayana 和 Bitronix,以支持 XA 事务的执行。

柔性事务(BASE 事务)

柔性事务遵循 BASE(Basically Available, Soft State, Eventually Consistent)原则,追求的是最终一致性,而不是强一致性。这种事务模型适用于可以容忍数据在一段时间内不一致的场景,最终会达到一致状态。

ShardingSphere 内部集成了对 Seata(一种开源的分布式事务解决方案)的支持,允许开发者使用柔性事务来处理分布式事务。Seata 的 AT 模式是一种实现 BASE 事务的机制,它通过注册、提交和回滚分支事务来管理分布式事务。

使用示例

在 ShardingSphere 中使用分布式事务通常涉及到以下步骤:

  1. 配置数据源:定义分布式数据源和事务管理器。
  2. 开启事务:通过设置自动提交为 false 来开启事务。
  3. 执行 SQL:执行需要在事务中运行的 SQL 操作。
  4. 提交或回滚事务:根据操作结果提交或回滚事务。

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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

2. 配置数据源

application.ymlapplication.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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

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
        // ...
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

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>
  • 1
  • 2
  • 3
  • 4
  • 5

确保${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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

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);
  • 1
  • 2
  • 3
  • 4

5. 执行事务操作

在设置了事务类型后,可以执行SQL操作,ShardingSphere会自动根据配置的XA事务管理器来管理事务的生命周期。

6. 提交或回滚事务

在执行完所有SQL操作后,可以根据业务逻辑来提交或回滚事务。ShardingSphere会自动调用XA事务管理器的相应方法来完成事务的提交或回滚。

注意事项

  • 确保在项目的logs目录中不要删除由Atomikos生成的xa_tx.log文件,这是XA崩溃恢复时所需的日志。
  • 如果需要自定义Atomikos的配置,可以在项目的classpath中添加jta.properties文件,并按照Atomikos的官方文档进行配置。

通过以上步骤,就可以在ShardingSphere中配置和使用XA事务管理器来处理分布式事务了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/499756
推荐阅读
相关标签
  

闽ICP备14008679号