首页 > 技术文章 > Spring-boot2X基于sharding-jdbc3.x分表分库

baby123 2019-09-30 18:46 原文

ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(计划中)这3款相互独立的产品组成。他们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如Java同构、异构语言、云原生等各种多样化的应用场景。

ShardingSphere定位为关系型数据库中间件,旨在充分合理地在分布式的场景下利用关系型数据库的计算和存储能力,而并非实现一个全新的关系型数据库。

Sharding-JDBC

定位为轻量级Java框架,在Java的JDBC层提供的额外服务。 它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。

  • 适用于任何基于Java的ORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC。
  • 基于任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP等。
  • 支持任意实现JDBC规范的数据库。目前支持MySQL,Oracle,SQLServer和PostgreSQL。

 

在数据量不是很多的情况下,可以将数据库进行读写分离,以应对高并发的需求,通过水平扩展从库,来缓解查询的压力

在数据量达到500万的时候,可以将数据进行分表存储

在数据量继续扩大,可以考虑分库分表,将数据存储在不同数据库的不同表中

Sharding-JDBC分片策略存有两种维度:

  • 数据源分片策略(DatabaseShardingStrategy):数据被分配的目标数据源
  • 表分片策略(TableShardingStrategy):数据被分配的目标表

1.应用

spring boot 版本:2.1.8.RELEASE

没使用最新的4.x,采用的3.x

(1)添加依赖

<dependency>
       <groupId>javax.persistence</groupId>
       <artifactId>persistence-api</artifactId>
       <version>1.0.2</version>
</dependency>

<dependency>
       <groupId>mysql</groupId>
       <artifactId>mysql-connector-java</artifactId>
       <scope>runtime</scope>
</dependency>

<dependency>
       <groupId>org.mybatis.spring.boot</groupId>
       <artifactId>mybatis-spring-boot-starter</artifactId>
       <version>2.0.0</version>
</dependency>

<dependency>
       <groupId>com.alibaba</groupId>
       <artifactId>druid-spring-boot-starter</artifactId>
       <version>1.1.20</version>
</dependency>

<dependency>
       <groupId>io.shardingsphere</groupId>
       <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
       <version>3.1.0</version>
</dependency>

<dependency>
      <groupId>io.shardingsphere</groupId>
      <artifactId>sharding-jdbc-spring-namespace</artifactId>
      <version>3.1.0</version>
</dependency>
<dependency>
     <groupId>org.projectlombok</groupId>
     <artifactId>lombok</artifactId>
     <optional>true</optional>
</dependency>

(2)增加配置

##数据库配置
sharding.jdbc.datasource.names=ds0,ds1

sharding.jdbc.datasource.ds0.type=com.alibaba.druid.pool.DruidDataSource
sharding.jdbc.datasource.ds0.driver-class-name=com.mysql.cj.jdbc.Driver
sharding.jdbc.datasource.ds0.url=jdbc:mysql://localhost:3306/db0?serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true
sharding.jdbc.datasource.ds0.username=root
sharding.jdbc.datasource.ds0.password=root

sharding.jdbc.datasource.ds1.type=com.alibaba.druid.pool.DruidDataSource
sharding.jdbc.datasource.ds1.driver-class-name=com.mysql.cj.jdbc.Driver
sharding.jdbc.datasource.ds1.url=jdbc:mysql://localhost:3306/db1?serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true
sharding.jdbc.datasource.ds1.username=root
sharding.jdbc.datasource.ds1.password=root

sharding.jdbc.config.sharding.default-data-source-name=ds0
sharding.jdbc.config.sharding.default-database-strategy.inline.sharding-column=file_id
sharding.jdbc.config.sharding.default-database-strategy.inline.algorithm-expression=ds$->{file_id % 2}

sharding.jdbc.config.sharding.tables.assets.actual-data-nodes=ds$->{0..1}.assets$->{0..5}
sharding.jdbc.config.sharding.tables.assets.table-strategy.inline.sharding-column=id
sharding.jdbc.config.sharding.tables.assets.table-strategy.inline.algorithm-expression=assets$->{id % 6}
sharding.jdbc.config.sharding.tables.assets.key-generator-column-name=id

sharding.jdbc.config.sharding.tables.structures.key-generator-column-name=id

sharding.jdbc.config.sharding.binding-tables=files
sharding.jdbc.config.sharding.props.sql.show=true

说明:

sharding.jdbc.config.sharding.default-database-strategy.inline.sharding-column 配置的分库的字段

sharding.jdbc.config.sharding.default-database-strategy.inline.algorithm-expression 配置的分库的逻辑,根据file_id%2进行分

sharding.jdbc.config.sharding.tables.assets.actual-data-nodes  配置的是user表在真实数据库中的位置

sharding.jdbc.config.sharding.tables.assets.table-strategy.inline.sharding-column 配置assets表数据切分的字段

sharding.jdbc.config.sharding.tables.assets.table-strategy.inline.algorithm-expression=assets$->{id % 6}  配置assets表数据切分的策略

  files表不分库

  structures表只分库部分表

更多可以查看文档 https://shardingsphere.apache.org/document/legacy/3.x/document/cn/manual/sharding-jdbc/usage/sharding/

2.扩容

  采用双倍扩容的方案 

  从2台服务器扩到4台,接着再扩到8台……

 

推荐阅读