springboot shardingSphere 自定义分库分表策略

首先,ShardingSphere是一款分布式数据库中间件,它支持分库分表、读写分离、全局表等多种数据分片和路由策略。Springboot ShardingSphere则是基于Springboot框架的ShardingSphere的扩展,可以更加方便地集成和使用。

假设我们根据用户id进行分库分表,具体思路如下:

将用户分为两个库,db0和db1;
将每个库中的用户再分为两个表,user0和user1;
对于用户id为n的用户,根据n%2的值进行路由,如果为0则路由到user0表,否则路由到user1表;
同理,对于用户id为n的用户,根据n%2的值进行路由,如果为0则路由到db0库,否则路由到db1库。
根据这个分库分表策略,我们需要实现自定义分库分表策略类MyDatabaseShardingAlgorithm和MyTableShardingAlgorithm。

1.MyDatabaseShardingAlgorithm实现了PreciseShardingAlgorithm接口,重写了doSharding()方法。该方法用于根据分片键的值将数据分配到对应的数据库中,其中availableTargetNames为可用的目标数据源的名称,shardingValue为分片键的值。

public class MyDatabaseShardingAlgorithm implements PreciseShardingAlgorithm {

    @Override
    public String doSharding(Collection availableTargetNames, PreciseShardingValue shardingValue) {
        for (String targetName : availableTargetNames) {
            if (targetName.endsWith(shardingValue.getValue() % 2 + "")) {
                return targetName;
            }
        }
        throw new IllegalArgumentException();
    }
}

2.MyTableShardingAlgorithm也实现了PreciseShardingAlgorithm接口,重写了doSharding()方法。该方法用于根据分片键的值将数据分配到对应的表中。

public class MyTableShardingAlgorithm implements PreciseShardingAlgorithm {

    @Override
    public String doSharding(Collection availableTargetNames, PreciseShardingValue shardingValue) {
        for (String targetName : availableTargetNames) {
            if (targetName.endsWith(shardingValue.getValue() % 2 + "")) {
                return targetName;
            }
        }
        throw new IllegalArgumentException();
    }
}

3.接下来,在application.yml或application.properties中配置分库分表策略。

spring:
  shardingsphere:
    datasource:
      names: ds0, ds1
      ds0:
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3306/ds0?useUnicode=true&characterEncoding=utf-8
        username: root
        password: 123456
      ds1:
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3306/ds1?useUnicode=true&characterEncoding=utf-8
        username: root
        password: 123456
    sharding:
      tables:
        user:
          actual-data-nodes: ds${0..1}.user_${0..1}
          table-strategy:
            inline:
              sharding-column: id
              algorithm-expression: user_${id % 2}
          database-strategy:
            inline:
              sharding-column: id
              algorithm-expression: ds${id % 2}
            sharding-algorithms:
              my-database-algorithm:
                type: INLINE
                props:
                  algorithm-expression: ds${id % 2}
          table-mappers:
            user_0: user_0
            user_1: user_1
          strategy-ref: my-table-algorithm
      sharding-algorithms:
        my-database-algorithm:
          type: INLINE
          props:
            algorithm-expression: ds${id % 2}
        my-table-algorithm:
          type: INLINE
          props:
            algorithm-expression: user_${id % 2}

在以上配置中,我们设置了两个数据源ds0、ds1,分别对应db0和db1库。actual-data-nodes用于设置数据节点,其中ds{0…1}.user_{0…1}表示db0.user_0、db0.user_1、db1.user_0、db1.user_1四张表。table-strategy和database-strategy用于设置分表和分库策略,其中algorithm-expression表示按照id模2的值路由表和库,即id为偶数时路由到0表/库,id为奇数时路由到1表/库。table-mappers用于设置逻辑表到实际表的映射关系。最后,我们设置了my-table-algorithm和my-database-algorithm,对应了MyTableShardingAlgorithm和MyDatabaseShardingAlgorithm。

至此,我们已经完成了Springboot ShardingSphere自定义分库分表策略的配置。对于其他分布式数据库中间件的分库分表策略类的实现也是类似的,只需要根据具体的分片逻辑实现自己的分库分表策略类即可。

你可能感兴趣的:(spring,boot)