当前位置:   article > 正文

springboot shardingSphere 自定义分库分表策略_springboot 配置 分库分表

springboot 配置 分库分表

首先,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<Long> {

    @Override
    public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Long> shardingValue) {
        for (String targetName : availableTargetNames) {
            if (targetName.endsWith(shardingValue.getValue() % 2 + "")) {
                return targetName;
            }
        }
        throw new IllegalArgumentException();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

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

public class MyTableShardingAlgorithm implements PreciseShardingAlgorithm<Long> {

    @Override
    public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Long> shardingValue) {
        for (String targetName : availableTargetNames) {
            if (targetName.endsWith(shardingValue.getValue() % 2 + "")) {
                return targetName;
            }
        }
        throw new IllegalArgumentException();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

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}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

在以上配置中,我们设置了两个数据源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自定义分库分表策略的配置。对于其他分布式数据库中间件的分库分表策略类的实现也是类似的,只需要根据具体的分片逻辑实现自己的分库分表策略类即可。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/756808
推荐阅读
相关标签
  

闽ICP备14008679号