赞
踩
首先,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();
}
}
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();
}
}
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自定义分库分表策略的配置。对于其他分布式数据库中间件的分库分表策略类的实现也是类似的,只需要根据具体的分片逻辑实现自己的分库分表策略类即可。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。