分库分表一:ShardingSphere介绍和入门实战

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

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实战

4.1.1官网文档

环境搭建和踩坑

基础环境
数据库创建逻辑表 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:
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值