工信部网站备案方法,红豆网桂林论坛,微网站需要什么技术,wordpress小蜜蜂插件目录 前言sharding-jdbc配置配置解析table-strategy分片策略1、standard2、none3、inline4、complex 前言
Spring Boot学习专栏: 传送门
sharding-jdbc配置
下面是Spring Boot项目下的ShardingSphere-JDBC数据分片配置
#数据源名称#xff0c;多数据源以逗号分隔
spring.s… 目录 前言sharding-jdbc配置配置解析table-strategy分片策略1、standard2、none3、inline4、complex 前言
Spring Boot学习专栏: 传送门
sharding-jdbc配置
下面是Spring Boot项目下的ShardingSphere-JDBC数据分片配置
#数据源名称多数据源以逗号分隔
spring.shardingsphere.datasource.namesds0,ds1#数据源相关连接信息
spring.shardingsphere.datasource.ds0.typeorg.apache.commons.dbcp.BasicDataSource
spring.shardingsphere.datasource.ds0.driver-class-namecom.mysql.jdbc.Driver
spring.shardingsphere.datasource.ds0.urljdbc:mysql://localhost:3306/ds0
spring.shardingsphere.datasource.ds0.usernameroot
spring.shardingsphere.datasource.ds0.passwordspring.shardingsphere.datasource.ds1.typeorg.apache.commons.dbcp.BasicDataSource
spring.shardingsphere.datasource.ds1.driver-class-namecom.mysql.jdbc.Driver
spring.shardingsphere.datasource.ds1.urljdbc:mysql://localhost:3306/ds1
spring.shardingsphere.datasource.ds1.usernameroot
spring.shardingsphere.datasource.ds1.passwordspring.shardingsphere.sharding.tables.t_order.actual-data-nodesds$-{0..1}.t_order$-{0..1}
spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.sharding-columnorder_id
spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.algorithm-expressiont_order$-{order_id % 2}
spring.shardingsphere.sharding.tables.t_order.key-generator.columnorder_id
spring.shardingsphere.sharding.tables.t_order.key-generator.typeSNOWFLAKE#默认分片策略当表没有设置单独的分片规则时就会使用默认的分片策略。
spring.shardingsphere.sharding.default-database-strategy.inline.sharding-columnuser_id
spring.shardingsphere.sharding.default-database-strategy.inline.algorithm-expressionds$-{user_id % 2}配置解析
下面我们就来分析下上面的配置
1、数据源配置 首先需要配置数据源指定数据库连接信息spring.shardingsphere.datasource就是数据源的相关配置首先在names指定数据源名称然后再配置相应数据源的连接配置格式如下
spring.shardingsphere.datasource.data-source-name.type #数据库连接池类名称
spring.shardingsphere.datasource.data-source-name.driver-class-name #数据库驱动类名
spring.shardingsphere.datasource.data-source-name.url #数据库url连接
spring.shardingsphere.datasource.data-source-name.username #数据库用户名
spring.shardingsphere.datasource.data-source-name.password #数据库密码
spring.shardingsphere.datasource.data-source-name.xxx #数据库连接池的其它属性注每个data-source-name都需要配置
2、分片规则配置 针对每个需要进行分片的表需要配置相应的分片规则。这一部分是在spring.shardingsphere.sharding.tables进行配置下面我就上述例子进行解析
spring.shardingsphere.sharding.tables.t_order.actual-data-nodesds$-{0..1}.t_order$-{0..1}这个配置是 Sharding-JDBC 中指定实际数据节点的配置用于表示分片规则中具体的数据节点。它定义了表名为 t_order 的分片规则中的实际数据节点。在该属性值中使用了占位符和表达式来表示不同的数据节点。
1、t_order表示哪个表需要分片多个表需要相应进行配置actual-data-nodes表示配置数据节点固定值
2、ds$-{0…1} 表示数据源的名称其中 $-{0…1} 表示占位符可以被替换为 0 或 1这里表示有两个数据源分别为 ds0 和 ds1。
3、t_order$-{0…1} 表示表名的后缀其中 $-{0…1} 同样表示占位符可以被替换为 0 或 1这里表示有两个表名后缀分别为 t_order0 和 t_order1。
在上述配置中有两个数据源 ds0 和 ds1并且有两个表名后缀 t_order0 和 t_order1那么实际的数据节点将包括 ds0.t_order0、ds0.t_order1、ds1.t_order0、ds1.t_order1 四个。
spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.sharding-columnorder_idtable-strategy指定表的分片策略table-strategy有以下几种策略 none 表示不分片所有数据都存储在同一个表中。 standard 表示使用标准分片策略根据分片键的值进行范围匹配将数据路由到对应的分片表中。 inline 表示使用行表达式分片策略根据分片键的值通过表达式计算得到分片结果将数据路由到对应的分片表中。 complex 表示使用复合分片策略可以同时使用多个分片键对数据进行分片计算将数据路由到对应的分片表中。
具体的table-strategy使用我会在下面详细解释
spring.shardingsphere.sharding.tables.t_order.key-generator.columnorder_id用于指定生成主键的列名在上述配置中t_order 表的主键生成列配置为 order_id。这意味着在向 t_order 表插入数据时ShardingSphere 会自动生成主键并将生成的主键值赋给 order_id 列
shardingSphere 提供了多种主键生成策略如雪花算法、UUID 等可以根据业务需求选择合适的主键生成器。通过配置spring.shardingsphere.sharding.tables.t_order.key-generator.type可以指定生成策略。
spring.shardingsphere.sharding.default-database-strategyspring.shardingsphere.sharding.default-database-strategy为默认分片策略当表没有设置单独的分片规则时就会使用默认的分片策略
我们还可以使用spring.shardingsphere.sharding.default-data-source-name指定默认数据源名称。当未明确指定数据源名称时ShardingSphere 将使用该属性配置的数据源作为默认数据源。
spring.shardingsphere.sharding.default-data-source-nameds-0table-strategy分片策略
table-strategy指定表的分片策略下面详细介绍下table-strategy的几种策略
1、standard
对应StandardShardingStrategy标准分片策略根据分片键的值进行范围匹配将数据路由到对应的分片表中提供对SQL语句中的, , , , , IN和BETWEEN AND的分片操作支持。StandardShardingStrategy只支持单分片键提供PreciseShardingAlgorithm和RangeShardingAlgorithm两个分片算法。PreciseShardingAlgorithm是必选的用于处理和IN的分片。RangeShardingAlgorithm是可选的用于处理BETWEEN AND, , , , 分片如果不配置RangeShardingAlgorithmSQL中的BETWEEN AND将按照全库路由处理。
配置standard策略我们需要实现PreciseShardingAlgorithm和RangeShardingAlgorithm接口来自定义自己的分片算法如下所示
PreciseShardingAlgorithm实现类
Component
public class MyTablePreciseShardingAlgorithm implements PreciseShardingAlgorithmInteger {/*** param tableNames 对应分片库中所有分片表的集合* param shardingValue 为分片属性logicTableName 为逻辑表columnName 分片键value 为从 SQL 中解析出来的分片键的值* return*/Overridepublic String doSharding(CollectionString tableNames, PreciseShardingValueInteger shardingValue) {for (String tableName : tableNames) {// 取模算法分片键 % 表数量String value String.valueOf(shardingValue.getValue() % tableNames.size() );if (tableName.endsWith(value)) {return tableName;}}throw new IllegalArgumentException(分片失败tableNames tableNames);}}配置文件进行进行配置
#配置分片键
spring.shardingsphere.sharding.tables.t_order.table-strategy.standard.sharding-columnorder_id
#分片键策略
spring.shardingsphere.sharding.tables.t_order.table-strategy.standard.precise-algorithm-class-namecom.example.demo.shardingsphere.MyTablePreciseShardingAlgorithm2、none
对应NoneShardingStragey不分片策略SQL会被发给所有节点去执行
3、inline
对应InlineShardingStrategy使用Groovy的表达式提供对SQL语句中的和IN的分片操作支持只支持单分片键。对于简单的分片算法可以通过简单的配置使用
如我们例子的配置
spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.sharding-columnorder_id
spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.algorithm-expressiont_order$-{order_id % 2}shardingColumn指定用于分片计算的列名这里使用 order_id 字段。 algorithmExpression指定分片算法表达式这里使用了内联表达式 t_order$-{order_id % 2}。该表达式表示根据 order_id 的值进行取模运算结果为0时路由到 t_order0 表结果为1时路由到 t_order1 表。
4、complex
对应ComplexShardingStrategy。复合分片策略。提供对SQL语句中的, , , , , IN和BETWEEN AND的分片操作支持ComplexShardingStrategy支持多分片键如果表是多分片键的那么需要使用该策略
使用complex 策略需要我们自定义一个ComplexShardingAlgorithm实现类在该实现类定义相关分片算法如下所示
Slf4j
public class MyComplexShardingAlgorithm implements ComplexKeysShardingAlgorithm {/**** param availableTargetNames 进行分片的表* param shardingValue * return*/Overridepublic CollectionString doSharding(Collection availableTargetNames, ComplexKeysShardingValue shardingValue) {ListString result new ArrayList();// 获取分片键列和对应的分片键值MapString, CollectionLong columnNameAndShardingValuesMap shardingValue.getColumnNameAndShardingValuesMap();// 遍历分片键列和分片键值for (Map.EntryString, CollectionLong entry : columnNameAndShardingValuesMap.entrySet()) {String columnName entry.getKey();CollectionLong shardingValues entry.getValue();log.info(分片键columnName);// 根据分片键列和分片键值进行分片逻辑的实现for (Long shardingVal : shardingValues) {for (Object availableTargetName : availableTargetNames) {String tableName availableTargetName.toString();String value String.valueOf(shardingVal % availableTargetNames.size() );if (tableName.endsWith(value)) {result.add(tableName) ;}}}}return result;}
}注ComplexKeysShardingValue 的 getColumnNameAndShardingValuesMap() 方法返回一个 MapString, Collection 对象用于获取分片键列和对应的分片键值集合。
这个方法的作用是获取所有的分片键列及其对应的分片键值其中键是分片键列的名称值是对应的分片键值的集合。通过遍历这个 Map你可以获得每个分片键列的分片键值集合并根据自己的业务逻辑进行相应的分片操作。
ComplexKeysShardingValue 的getColumnNameAndRangeValuesMap() 方法返回一个 MapString, Range 对象用于获取分片键列和对应的范围值。
这个方法的作用是获取所有的分片键列及其对应的范围值其中键是分片键列的名称值是对应的范围值。通过遍历这个 Map你可以获得每个分片键列的范围值并根据自己的业务逻辑进行相应的分片操作。
进行配置
#配置分片键
spring.shardingsphere.sharding.tables.t_order.table-strategy.complex.sharding-columnsorder_id,user_id
#分片键策略
spring.shardingsphere.sharding.tables.t_order.table-strategy.complex.algorithm-class-namecom.example.demo.shardingsphere.MyComplexShardingAlgorithm