5分钟实现分库分表,SpringBoot+shardingsphere

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中的分布式事务

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值