文章目录
ShardingSphere介绍和实战
ShardingSphere介绍
ShardingSphere是一款起源于当当网内部的应用框架。在2017年开始开源。并逐渐由原本只关注于关系型数据库增强工具的ShardingJDBC升级成为一整套以数据分片为基础的数据生态圈,更名为ShardingSphere。到2020年4月,已经成为了Apache软件基金会的顶级项目。
ShardingSphere包含三个重要的产品,ShardingJDBC、ShardingProxy和ShardingSidecar。其中sidecar是针对service mesh定位的一个分库分表插件,目前在规划中。其中,ShardingJDBC是用来做客户端分库分表的产品,而ShardingProxy是用来做服务端分库分表的产品。这两者定位有什么区别呢?我们看下官方资料中给出的两个重要的图:

shardingJDBC定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务。它使⽤客户端直连数据库,以 jar 包形式提供服务,⽆需额外部署和依赖,可理解为增强版的 JDBC 驱动,完全兼容 JDBC 和各种 ORM 框架。

ShardingProxy定位为透明化的数据库代理端,提供封装了数据库⼆进制协议的服务端版本,⽤于完成对异构语⾔的⽀持。⽬前提供 MySQL 和 PostgreSQL 版本,它可以使⽤任何兼容 MySQL/PostgreSQL 协议的访问客⼾端。
很显然,ShardingJDBC只是客户端的一个工具包,可以理解为一个特殊的JDBC驱动包,所有分库分表逻辑均由业务方自己控制,所以他的功能相对灵活,支持的数据库也非常多,但是对业务侵入大,需要业务方自己定制所有的分库分表逻辑。而ShardingProxy是一个独立部署的服务,对业务方无侵入,业务方可以像用一个普通的MySQL服务一样进行数据交互,基本上感觉不到后端分库分表逻辑的存在,但是这也意味着功能会比较固定,能够支持的数据库也比较少。这两者各有优劣。
ShardingJDBC介绍
核心概念
逻辑表:水平拆分的数据库的相同逻辑和数据结构表的总称
真实表:在分片的数据库中真实存在的物理表。
数据节点:数据分片的最小单元。由数据源名称和数据表组成
绑定表:分片规则一致的主表和子表。
广播表:也叫公共表,指所有的分片数据源中都存在的表,表结构和表中的数据在每个数据库中都完全一致。例如字典表。
分片键:用于分片的数据库字段,是将数据库(表)进行水平拆分的关键字段。SQL中若没有分片字段,将会执行全路由,性能会很差。
分片算法:通过分片算法将数据进行分片,支持通过=、BETWEEN和IN分片。分片算法需要由应用开发者自行实现,可实现的灵活度非常高。
分片策略:真正用于进行分片操作的是分片键+分片算法,也就是分片策略。在ShardingJDBC中一般采用基于Groovy表达式的inline分片策略,通过一个包含分片键的算法表达式来制定分片策略,如t_user_$->{u_id%8}标识根据u_id模8,分成8张表,表名称为t_user_0到t_user_7。
ShardingJDBC实战
环境搭建和踩坑
基础环境
数据库创建逻辑表 user和对应的真实表 user1、user2
# 真实表sql和逻辑表一致
CREATE TABLE `sharding_user` (
`id` bigint(11) NOT NULL AUTO_INCREMENT,
`user_name` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`source` varchar(255) DEFAULT 'test',
`create_time` datetime DEFAULT NULL,
`update_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;

实体类和controller
@Data
@TableName("sharding_user")
public class ShardingUser implements Serializable {
@TableId(type = IdType.NONE)
private Long id;
private String userName;
private Integer age;
private String source;
private Date createTime;
private Date updateTime;
}
@GetMapping("/shardingTest")
public R shardingTest(String name,Integer age){
ShardingUser user = new ShardingUser();
user.setUserName(name);
user.setAge(age);
shardingUserService.save(user);
return R.success("成功");
}
其他的service mapper impl 按照mybatis-plus模式来创建。保证能够实现基础的增删改查
sharding-jdbc环境
依赖
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.1.1</version>
</dependency>
springboot2.x整合ShardingJDBC 4.1.1 坑很多,配置好依赖后启动看有没有问题。
启动报错:Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required 启动类添加exclude={DruidDataSourceAutoConfigure.class}
我这里用的是Druid的数据源 所以要排除掉。如果是其他数据源,同理排除掉对应数据源的自动配置类
application.yml添加sharding-jdbc配置
# 顶层是 spring: 开头 因为spring:下面还有其他不相关的配置 ,所以后续一律以shardingsphere:开头展示
shardingsphere:

本文详细介绍了Apache ShardingSphere的组件、分片策略以及实战案例。ShardingSphere包括ShardingJDBC和ShardingProxy,分别提供客户端和服务端分库分表解决方案。文章通过实例展示了如何配置分片规则,解决范围查询问题,并自定义分片算法,以实现更灵活的分片策略。最后,通过案例分析了如何进行分库分表的范围查询及其实现方式。
最低0.47元/天 解锁文章
3558

被折叠的 条评论
为什么被折叠?



