shardingsphere实现分表

实验环境

springboot版本:2.2.2.RELEASE

shardingsphere版本:4.0.0-RC3

实验说明:

数据库:demo_ds_master

4张表,表结构一摸一样:user_0,user_1,user_2,user_3

以下为user表的表结构,修改表名,为user_0,user_1,user_2,user_3然后在数据库中执行即可。

CREATE TABLE `user` (
  `id` bigint(255) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `uid` varchar(255) DEFAULT NULL,
  `school` varchar(255) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
)

第一步:引入shardingsphere依赖

 <dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
    <version>4.0.0-RC3</version>
</dependency>
 
        <!-- for spring namespace -->
<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-jdbc-spring-namespace</artifactId>
    <version>4.0.0-RC3</version>
</dependency>

第二步:application.properties配置


#读写分离配置,即一主多从方式配置
debug=false
server.port=8081
server.servlet.context-path=
spring.jackson.serialization.INDENT_OUTPUT=true
spring.profiles.active=

spring.shardingsphere.props.sql.show=true

spring.shardingsphere.datasource.names=ds

spring.shardingsphere.datasource.ds.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.ds.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.ds.jdbc-url=jdbc:mysql://youraddress:3306/demo_ds_master?characterEncoding=utf-8
spring.shardingsphere.datasource.ds.username=
spring.shardingsphere.datasource.ds.password=

spring.shardingsphere.sharding.tables.user.actual-data-nodes=ds.user_${0..3}
spring.shardingsphere.sharding.tables.user.table-strategy.inline.sharding-column=age
spring.shardingsphere.sharding.tables.user.table-strategy.inline.algorithm-expression=user_${age % 4}
spring.shardingsphere.sharding.tables.user.key-generator.column=id
spring.shardingsphere.sharding.tables.user.key-generator.type=SNOWFLAKE
spring.shardingsphere.sharding.tables.user.key-generator.props.worker.id=123

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTA3NzIyMzA=,size_16,color_FFFFFF,t_70

第三步:验证

1.通过代码,插入一条数据,age=1,发现数据保存在user_1表中

2.通过代码,插入一条数据,age=2,发现数据保存在user_2表中

3.通过代码,插入一条数据,age=3,发现数据保存在user_3表中

4.通过代码,插入一条数据,age=4,发现数据保存在user_0表中

5.通过代码,插入一条数据,age=5,发现数据保存在user_1表中

4通过代码查询,发现查询出5条记录,到此验证完毕。

 

### ShardingSphere 自定义分表策略实现方式 #### 1. 背景介绍 ShardingSphere 是一个分布式数据库解决方案,支持通过分片算法实现动态分库分表。默认情况下,它提供了 `Inline` 分片算法等简单的内置方案,但对于复杂业务需求(如多分片键、范围分片),需要借助自定义分片策略来满足特定场景的需求。 #### 2. 核心概念 在 ShardingSphere 中,`ShardingAlgorithm` 接口是实现分片逻辑的核心组件。该接口定义了如何根据分片键的值计算目标数据节点的位置。为了实现更复杂的分片规则,可以扩展以下两种主要类型的分片算法: - **PreciseShardingAlgorithm**: 基于精确匹配的分片算法,适用于单值查询场景。 - **RangeShardingAlgorithm**: 基于范围匹配的分片算法,适用于区间查询场景。 此外,还可以通过 YAML 或者 Java 配置文件完成自定义分片策略的注册和绑定[^2]。 --- #### 3. 实现步骤详解 以下是基于 Standard 模式的自定义分表逻辑实现方法[^3]: ##### (1) 定义分片算法类 创建一个实现了 `StandardShardingStrategy` 的分片算法类。例如,假设我们需要按照订单号 (`order_id`) 对表进行哈希取模分片,则代码如下所示: ```java import org.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm; import org.apache.shardingsphere.api.sharding.standard.PreciseShardingValue; import java.util.Collection; public class OrderIdModuloShardingAlgorithm implements PreciseShardingAlgorithm<Long> { @Override public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Long> shardingValue) { long orderId = shardingValue.getValue(); int targetIndex = Math.abs((int)(orderId % availableTargetNames.size())); return availableTargetNames.stream().skip(targetIndex).findFirst().orElseThrow(() -> new IllegalArgumentException("No table found")); } } ``` 上述代码中,`doSharding` 方法接收两个参数: - `availableTargetNames`: 可选的目标表名集合。 - `shardingValue`: 当前分片操作涉及的具体列值以及对应的分片键名称。 最终返回的是经过计算得出的实际物理表名。 ##### (2) 注册并配置分片策略 可以通过 YAML 文件或者编程方式进行分片策略的注册。下面展示了一个典型的 YAML 配置示例: ```yaml rules: - tables: t_order: actualDataNodes: ds${0..1}.t_order_${0..1} # 数据源及实际表分布情况 tableStrategy: standard: shardingColumn: order_id # 分片键字段名为 order_id preciseShardingAlgorithmClassName: com.example.OrderIdModuloShardingAlgorithm # 自定义分片算法全限定类名 ``` 此部分指定了逻辑表 `t_order` 的具体映射关系,并绑定了之前开发好的 `OrderIdModuloShardingAlgorithm` 类作为其分片依据。 ##### (3) 测试验证效果 启动应用后执行 SQL 查询语句时,可通过日志观察到实际生成的物理 SQL 是否符合预期。例如,在插入一条记录之后可能会看到类似这样的打印信息: ``` Actual SQL: ds0 ::: INSERT INTO t_order_0 (...) VALUES (...); Actual SQL: ds1 ::: INSERT INTO t_order_1 (...) VALUES (...); ``` 这表明系统已经成功地将不同数据分配到了指定的数据节点上。 --- #### 4. 注意事项 - 如果项目中有多个不同的分片规则共存,则需分别编写各自的分片算法类,并确保它们互不影响。 - 在设计分片键选取原则时应充分考虑查询性能优化因素,比如尽量减少跨库 JOIN 操作次数等。 - 使用过程中要密切关注底层存储引擎容量限制条件,防止因过度碎片化而导致管理成本上升等问题发生。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值