赞
踩
随着业务量的增大,不可避免的我们需要增加数据库节点或者增加表的数量,今天介绍一款轻量级,无侵入的分库分表框架shardingsphere-jdbc.
- <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>

这里我们创建一个需要分库分表的表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)
在我们往数据库插入数据的时候,需要生成组件,原来的单库单表我们可能会使用自增策略,但是分库分表之后这个表的自增策略就无法使用了.
框架内置了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文件,将类的全限定名添加进去
这样我就可以实现自己的主键生成方法.
在使用 ShardingSphere-JDBC 进行分片时,需要配置分片规则。分片规则决定了如何将数据分散到不同的数据节点上,以下是 ShardingSphere-JDBC 支持的几种分片规则:
标准分片规则:将数据按照某个键进行分片,具有相同键的数据会被分配到同一个数据节点上。
范围分片规则:将数据按照某个键的范围进行分片,例如按照时间范围进行分片,将某个时间段内的数据分配到同一个数据节点上。
模糊分片规则:将数据按照某个键的模糊匹配进行分片,例如按照某个关键字进行分片,将包含该关键字的数据分配到同一个数据节点上。
组合分片规则:将多个分片规则进行组合,按照多个键的组合进行分片。
本文实战将采取标准取余的方式,这也是大多数公司的实现方式.
详细配置参考数据分片 :: ShardingSphere
- 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中的分布式事务
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。