SpringBoot结合ShardingSphere实现数据分⽚、读写分离ShardingSphere是⼀套开源的分布式数据库中间件解决⽅案组成的⽣态圈,它由ShardingSphere-JDBC、ShardingSphere-Proxy和ShardingSphere-Sidecar(计划中)这3款相互独⽴的产品组成。 他们均提供标准化的数据分⽚、分布式事务和数据库治理功能,可适⽤于如Java同构、异构语⾔、云原⽣等各种多样化的应⽤场景。
ShardingSphere定位为关系型数据库中间件,旨在充分合理地在分布式的场景下利⽤关系型数据库的计算和存储能⼒,⽽并⾮实现⼀个全新的关系型数据库。 它与NoSQL和NewSQL是并存⽽⾮互斥的关系。
ShardingSphere-JDBC采⽤⽆中⼼化架构,适⽤于Java开发的⾼性能的轻量级OLTP应⽤;ShardingSphere-Proxy提供静态⼊⼝以及异构语⾔的⽀持,适⽤于OLAP应⽤以及对分⽚数据库进⾏管理和运维的场景。
repeat
分⽚概念讲解
逻辑表
⽔平拆分的数据库(表)的相同逻辑和数据结构表的总称。例:订单数据根据主键尾数拆分为10张表,分别是t_order_0到t_order_9,他们的逻辑表名为t_order。
真实表
在分⽚的数据库中真实存在的物理表。即上个⽰例中的t_order_0到t_order_9。
数据节点
数据分⽚的最⼩单元。由数据源名称和数据表组成,例:ds_0.t_order_0。
绑定表
指分⽚规则⼀致的主表和⼦表。例如:t_order表和t_order_item表,均按照order_id分⽚,则此两张表互为绑定表关系。绑定表之间的多表关联查询不会出现笛卡尔积关联,关联查询效率将⼤⼤提升。举例说明,如果SQL为:
SELECT i.* FROM t_order o JOIN t_order_item i der_der_id der_id in (10, 11);
在不配置绑定表关系时,假设分⽚键order_id将数值10路由⾄第0⽚,将数值11路由⾄第1⽚,那么路由后的SQL应该为4条,它们呈现为
笛卡尔积:against是什么意思
SELECT i.* FROM t_order_0 o JOIN t_order_item_0 i der_der_id der_id in (10, 11); SELECT i.* FROM t_order_0 o JOIN t_order_item_
在配置绑定表关系后,路由的SQL应该为2条:
SELECT i.* FROM t_order_0 o JOIN t_order_item_0 i der_der_id der_id in (10, 11); SELECT i.* FROM t_order_1 o JOIN t_order_item_
其中t_order在FROM的最左侧,ShardingSphere将会以它作为整个绑定表的主表。 所有路由计算将会只使⽤主表的策略,那
么t_order_item表的分⽚计算将会使⽤t_order的条件。故绑定表之间的分区键要完全相同。
分⽚算法
通过分⽚算法将数据分⽚,⽀持通过=、>=、<=、>、<、BETWEEN和IN分⽚。分⽚算法需要应⽤⽅开发者⾃⾏实现,可实现的灵活度⾮常
⾼。
⽬前提供4种分⽚算法。由于分⽚算法和业务实现紧密相关,因此并未提供内置分⽚算法,⽽是通过分⽚策略将各种场景提炼出来,提供更
⾼层级的抽象,并提供接⼝让应⽤开发者⾃⾏实现分⽚算法。
精确分⽚算法
对应PreciShardingAlgorithm,⽤于处理使⽤单⼀键作为分⽚键的=与IN进⾏分⽚的场景。需要配合StandardShardingStrategy使
⽤。
范围分⽚算法
对应RangeShardingAlgorithm,⽤于处理使⽤单⼀键作为分⽚键的BETWEEN AND、>、<、>=、<=进⾏分⽚的场景。需要配合StandardShardingStrategy使⽤。
复合分⽚算法
对应ComplexKeysShardingAlgorithm,⽤于处理使⽤多键作为分⽚键进⾏分⽚的场景,包含多个分⽚键的逻辑较复杂,需要应⽤开发者
⾃⾏处理其中的复杂度。需要配合ComplexShardingStrategy使⽤。
Hint分⽚算法
对应HintShardingAlgorithm,⽤于处理使⽤Hint⾏分⽚的场景。需要配合HintShardingStrategy使⽤。
分⽚策略
包含分⽚键和分⽚算法,由于分⽚算法的独⽴性,将其独⽴抽离。真正可⽤于分⽚操作的是分⽚键 + 分⽚算法,也就是分⽚策略。⽬前提
供5种分⽚策略。
标准分⽚策略
对应StandardShardingStrategy。提供对SQL语句中的=, >, <, >=, <=, IN和BETWEEN AND的分⽚操
trash
作⽀持。
StandardShardingStrategy只⽀持单分⽚键,提供PreciShardingAlgorithm和RangeShardingAlgorithm两个分⽚算法。PreciShardingAlgorithm是必选的,⽤于处理=和IN的分⽚。RangeShardingAlgorithm是可选的,⽤于处理BETWEEN AND, >, <,
>=, <=分⽚,如果不配置RangeShardingAlgorithm,SQL中的BETWEEN AND将按照全库路由处理。
复合分⽚策略
对应ComplexShardingStrategy。复合分⽚策略。提供对SQL语句中的=, >, <, >=, <=, IN和BETWEEN AND的分⽚操作⽀持。ComplexShardingStrategy⽀持多分⽚键,由于多分⽚键之间的关系复杂,因此并未进⾏过多的封装,⽽是直接将分⽚键值组合以及分⽚
操作符透传⾄分⽚算法,完全由应⽤开发者实现,提供最⼤的灵活度。
⾏表达式分⽚策略
对应InlineShardingStrategy。使⽤Groovy的表达式,提供对SQL语句中的=和IN的分⽚操作⽀持,只⽀持单分⽚键。对于简单的分⽚算法,可以通过简单的配置使⽤,从⽽避免繁琐的Java代码开发,如: t_ur_$->{u_id % 8} 表⽰t_ur表根据u_id模8,⽽分成8张表,表名称为t_ur_0到t_ur_7。
Hint分⽚策略
对应HintShardingStrategy。通过Hint指定分⽚值⽽⾮从SQL中提取分⽚值的⽅式进⾏分⽚的策略。
实战
引⼊依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="maven.apache/POM/4.0.0" xmlns:xsi="www.w3/2001/XMLSchema-instance"
xsi:schemaLocation="maven.apache/POM/4.0.0 maven.apache/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.xin</groupId>
<artifactId>shardingsphere-jdbc-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>shardingsphere-jdbc-demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<shardingsphere.version>4.0.0</shardingsphere.version>
<shardingsphere.spi.impl.version>4.0.0</shardingsphere.spi.impl.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId&batis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
imagine me without you<scope>runtime</scope>
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.apache.shardingsphere</groupId>-->
<!-- <artifactId>sharding-core-api</artifactId>-->
<!-- <version>${shardingsphere.version}</version>-->
<!-- </dependency>-->大学英语四级考试
<!-- <dependency>-->
<!-- <groupId>org.apache.shardingsphere</groupId>-->
<!-- <artifactId>sharding-jdbc-core</artifactId>-->
<!-- <version>${shardingsphere.version}</version>-->
3s lady<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>org.apache.shardingsphere</groupId>-->
<!-- <groupId>org.apache.shardingsphere</groupId>-->
<!-- <artifactId>sharding-jdbc-orchestration</artifactId>-->
<!-- <version>${shardingsphere.version}</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>org.apache.shardingsphere</groupId>-->
<!-- <artifactId>sharding-transaction-core</artifactId>-->
<!-- <version>${shardingsphere.version}</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>org.apache.shardingsphere</groupId>-->
<!-- <artifactId>sharding-transaction-xa-core</artifactId>-->
<!-- <version>${shardingsphere.version}</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>org.apache.shardingsphere</groupId>-->
<!-- <artifactId>sharding-transaction-ba-ata-at</artifactId>-->
<!-- <version>${shardingsphere.version}</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>org.apache.shardingsphere</groupId>-->
fengjie<!-- <artifactId>sharding-jdbc-spring-boot-starter</artifactId>-->
<!-- <version>${shardingsphere.version}</version>-->
<!-- </dependency>-->miry
<!-- <dependency>-->
<!-- <groupId>org.apache.shardingsphere</groupId>-->
<!-- <artifactId>sharding-jdbc-orchestration-spring-boot-starter</artifactId>--> <!-- <version>${shardingsphere.version}</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>org.apache.shardingsphere</groupId>-->
<!-- <artifactId>sharding-jdbc-spring-namespace</artifactId>-->
<!-- <version>${shardingsphere.version}</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>org.apache.shardingsphere</groupId>-->
entrepreneur<!-- <artifactId>sharding-jdbc-orchestration-spring-namespace</artifactId>--> <!-- <version>${shardingsphere.version}</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>org.apache.shardingsphere</groupId>-->
<!-- <artifactId>sharding-orchestration-reg-zookeeper-curator</artifactId>--> <!-- <version>${shardingsphere.version}</version>-->
<!-- </dependency>-->
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>${shardingsphere.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<repositories>
<repository>
<repository>
<id>aliyun-repos</id>
<url>/nexus/content/groups/public/</url> <snapshots>
<enabled>fal</enabled>
</snapshots>
</repository>
</repositories>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
建数据库
建库db0、db1,db0只写,db1只读,作为读写分离
两个库均建下表:
-- ----------------------------
-- Table structure for `ur01`
-- ----------------------------
DROP TABLE IF EXISTS `ur01`;
CREATE TABLE `ur01` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(10) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;
-
- ----------------------------
-- Records of ur01
-- ----------------------------
lucas william tillINSERT INTO `ur01` VALUES ('1', 'wangxin', '99');
配置