1.分库分表的背景:
随着业务量的增大,不可避免的我们需要增加数据库节点或者增加表的数量,今天介绍一款轻量级,无侵入的分库分表框架shardingsphere-jdbc.
2.依赖
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.boot.dependencies.version>2.6.2</spring.boot.dependencies.version>
<lombok.version>1.18.24</lombok.version>
<mysql.conenector.version>5.1.38</mysql.conenector.version>
<mybatis.plus.boot.stater.version>3.4.1</mybatis.plus.boot.stater.version>
<shardingsphere.version>5.1.0</shardingsphere.version>
<atomikos.version>5.0.8</atomikos.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring.boot.dependencies.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.conenector.version}</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis.plus.boot.stater.version}</version>
</dependency>
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
<version>${shardingsphere.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--lombok依赖-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<!-- 分库分表框架-->
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
<version>${shardingsphere.version}</version>
</dependency>
<!-- xa分布式事务依赖(用不到的可以删掉)-->
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-transaction-xa-core</artifactId>
<version>${shardingsphere.version}</version>
</dependency>
</dependencies>
3.数据库实体
这里我们创建一个需要分库分表的表user_info
create table user_info
(
ID bigint not null
primary key,
NICK_NAME varchar(64) charset latin1 default '' not null,
MONEY bigint default 0 not null
);
然后我在两个数据库中分别创建2张表(也可以同一个数据库创建不同的schema)
4.主键生成策略
在我们往数据库插入数据的时候,需要生成组件,原来的单库单表我们可能会使用自增策略,但是分库分表之后这个表的自增策略就无法使用了.
框架内置了uuid和雪花算法
可能有的读者需要自定义算法,框架也给我们提供了方法
public class RandomKeyGenerator implements KeyGenerateAlgorithm {
@Override
public Comparable<?> generateKey() {
return ThreadLocalRandom.current().nextLong(100000) + 1;
}
@Override
public void init() {
}
@Override
public String getType() {
return "RANDOM";
}
}
通过实现KeyGenerateAlgorithm接口,我们可以自定义实现主键生成策略.
然后在META-INF/services创建org.apache.shardingsphere.sharding.spi.KeyGenerateAlgorithm文件,将类的全限定名添加进去
这样我就可以实现自己的主键生成方法.
5.分片规则
在使用 ShardingSphere-JDBC 进行分片时,需要配置分片规则。分片规则决定了如何将数据分散到不同的数据节点上,以下是 ShardingSphere-JDBC 支持的几种分片规则:
标准分片规则:将数据按照某个键进行分片,具有相同键的数据会被分配到同一个数据节点上。
范围分片规则:将数据按照某个键的范围进行分片,例如按照时间范围进行分片,将某个时间段内的数据分配到同一个数据节点上。
模糊分片规则:将数据按照某个键的模糊匹配进行分片,例如按照某个关键字进行分片,将包含该关键字的数据分配到同一个数据节点上。
组合分片规则:将多个分片规则进行组合,按照多个键的组合进行分片。
本文实战将采取标准取余的方式,这也是大多数公司的实现方式.
详细配置参考数据分片 :: ShardingSphere
6.配置(yml)
server:
port: 9001
mybatis-plus:
mapper-locations: mapper/*.xml
type-aliases-package: com.example.shardingtest.entity
spring:
shardingsphere:
# 数据库配置
datasource:
names: ds0,ds1
ds0:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.jdbc.Driver
jdbc-url: jdbc:mysql://127.0.0.1:3306/ds0
username: root
password: root
ds1:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.jdbc.Driver
jdbc-url: jdbc:mysql://127.0.0.1:3308/ds1
username: root
password: root
# 分片规则
rules:
sharding:
tables:
# 表配置
user_info:
# 0..1代表下标0-1都是该表的目标数据库
actual-data-nodes: ds$->{0..1}.user_info
# 数据库分片配置
database-strategy:
standard:
# 对应下方的数据库分片配置
sharding-algorithm-name: db-mod-inline
# 根据哪个列名的数据分库
sharding-column: id
#主键生成策略
key-generate-strategy:
column: id
key-generator-name: random
key-generators:
snowflake:
type: SNOWFLAKE
random:
type: RANDOM
sharding-algorithms:
db-mod-inline:
type: INLINE
props:
algorithm-expression: ds$->{id % 2}
props:
sql-show: true
自此就完成了分库分表配置了,本文只进行了分库,分表的配置与分库配置几乎一致,有兴趣的可以参考官网配置数据分片 :: ShardingSphere
下一次聊聊shardingsphere中的分布式事务