Sharding操作
什么是Sharding
Sharding是一种数据库架构技术,它将一个大的数据库或表水平拆分成多个较小的、更易于管理的片段,这些片段被称为shards。每个shard可以存储数据库的一部分数据,并且通常被部署在独立的数据库服务器上。Sharding的主要目的是通过横向扩展来提高数据库的性能、可靠性和可扩展性。
Sharding-JDBC
Sharding-JDBC早期是由当当网开源的分布式数据库中间件,后期该项目被放入到ShardingSphere项目下,Sharding-JDBC是一个轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务, 它使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,可理解为增强版的 JDBC 驱动,完全兼容 JDBC 和各种 ORM 框架
在使用Sharding-JDBC首先要清楚以下几点
1.它是一个轻量级的Java框架,可以理解是增强的JDBC驱动
2.Sharding-JDBC是不做分库分表的,库与表是由数据库工程师分好的,通过引入Sharding-JDBC.jar配置好配置,解决多数据源切换与多数据源的操作
一、引入maven依赖 (sharding-jdbc-spring-boot-starter)
参考文章:
【1】Sharding-JDBC实战(水平分表、水平分库、垂直分表、公共表、读写分离)
【2】sharding-jdbc教程 看这一篇就够了
所需环境:SpringBoot+MybatisPlus+Sharding-JDBC+Druid
sharding-jdbc-spring-boot-starter:
早期ShardingSphere项目(最初名为Sharding-JDBC)中的一个组件,用于简化在Spring Boot项目中使用Sharding-JDBC的过程。
Sharding-JDBC最初是一个轻量级的Java框架,在Java的JDBC层提供额外的服务,主要用于分库分表、读写分离和分布式主键等功能。
它的主要特点是基于JDBC的扩展,以jar包的形式提供轻量级服务。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.20</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.0.0-RC1</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
二、水平分表操作(一个库多个相同结构表)
数据库准备
水平分表的方式在同一个库中创建多个相同结构的个表
创建数据库course_db
在数据库创建2个相同的表course_1和course_2
数据操作规则:如果操作的数据id是偶数着操作course_1表,如果是奇数操作course_2表
CREATE TABLE course_1(
cid BIGINT(20) PRIMARY KEY,
cname VARCHAR(50) NOT NULL,
user_id BIGINT(20) NOT NULL,
cstatus VARCHAR(50) NOT NULL
);
CREATE TABLE course_2(
cid BIGINT(20) PRIMARY KEY,
cname VARCHAR(50) NOT NULL,
user_id BIGINT(20) NOT NULL,
cstatus VARCHAR(50) NOT NULL
);
properties配置
修改application.properties增加shardingsphere配置在ShardingSphere官网用户手册=>ShardingSphere-JDBC=>配置手册中都有详细的说明
以下是两个表的操作配置
# 配置shardingjdbc分片策略
# 配置数据源,给数据源起别名
spring.shardingsphere.datasource.names=myds1
# 由于表数据库有2个相同的表,我们只有一个实体类,需开启允许bean覆盖
spring.main.allow-bean-definition-overriding=true
# 配置数据源具体内容:连接池、驱动、地址、用户名、密码
# spring.shardingsphere.datasource.{你的数据源别名}.type
spring.shardingsphere.datasource.myds1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.myds1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.myds1.url=jdbc:mysql://localhost:3306/course_db?serverTimezone=GMT+8
spring.shardingsphere.datasource.myds1.username=root
spring.shardingsphere.datasoaurce.myds1.password=123456
#连接池初始化时创建的连接数
spring.shardingsphere.datasource.myds1.initial-size=1
#连接池中最少空闲连接数
spring.shardingsphere.datasource.myds1.min-idle=1
#连接池中最大活动连接数
spring.shardingsphere.datasource.myds1.max-active=50
#获取连接时最大等待时间,单位通常是毫秒
spring.shardingsphere.datasource.myds1.max-wait=60000
#查询超时时间,单位通常是毫秒
spring.shardingsphere.datasource.myds1.query-timeout=6000
#事务查询超时时间,单位通常是毫秒
spring.shardingsphere.datasource.myds1.transaction-query-timeout=6000
#移除废弃连接的超时时间,单位通常是毫秒
spring.shardingsphere.datasource.myds1.remove-abandoned-timeout=1800
# Druid连接池支持的过滤器,用来监控、日志记录等 设置stat,表示为只统计信息
spring.shardingsphere.datasource.myds1.filters=stat
#从连接池中取出连接时是否进行测试,以判断连接是否有效,值为false,表示不进行测试。
spring.shardingsphere.datasource.myds1.testOnBorrow=false
# 指定course_db表的分布情况,配置表在那个数据库中,表名称分别是什么
# spring.shardingsphere.rules.sharding.tables.{表规则}.actual-data-nodes={表达式规则}
# myds1.course_$->{1..2} => myds1数据中的course_开头的,course_1和course_2表
spring.shardingsphere.sharding.tables.course.actual-data-nodes=myds1.course_$->{1..2}
# 设置主键生成策略 可选内置的 SNOWFLAKE(雪花算法)/UUID
#也可以自定义(实现ShardingKeyGenerator,并配置META-INF/services/org.apache.shardingsphere.spi.keygen.ShardingKeyGenerator)
# spring.shardingsphere.rules.sharding.tables.{表规则}.database-strategy.standard.sharding-column
spring.shardingsphere.sharding.tables.course.key-generator.column=cid
spring.shardingsphere.sharding.tables.course.key-generator.type=SNOWFLAKE
# 指定分片策略,约定cid值偶数操作course_1,cid值奇数操作course_2(以下这种操作对于只有两张表的情况下)
#当 cid 的值为偶数时,cid % 2 的结果是0,0 + 1 的结果是1,所以表名会是 course_1。
#当 cid 的值为奇数时,cid % 2 的结果是1,1 + 1 的结果也是2,所以表名会是 course_2。
spring.shardingsphere.sharding.tables.course.table-strategy.inline.sharding-column=cid
spring.shardingsphere.sharding.tables.course.table-strategy.inline.algorithm-expression=course_$->{cid % 2 + 1}
# 打印sql输出日志
spring.shardingsphere.props.sql.show=true
当表大于2个,为16个时的时候
# 指定course_db表的分布情况,配置表在那个数据库中,表名称分别是什么
# spring.shardingsphere.rules.sharding.tables.{表规则}.actual-data-nodes={表达式规则}
# myds1.course_$->{0..15} => myds1数据中的course_开头的,course_0到course_15表,共16张表
spring.shardingsphere.sharding.tables.course.actual-data-nodes=myds1.course_$->{0..15}
#以下这个配置
#如果cid是0,那么数据将被存储到course_0表中。
#如果cid是1,那么数据将被存储到course_1表中。
#...
#如果cid是15,那么数据将被存储到course_15表中。
spring.shardingsphere.sharding.tables.course.table-strategy.inline.sharding-column=cid
spring.shardingsphere.sharding.tables.course.table-strategy.inline.algorithm-expression=course_$->{cid % 16}
代码测试
编写测试程序测试插入效果,与查询效果
可以看到Sharding-JDBC会按照配置的规则向不同的表插入数据
其他的maven依赖版本 (shardingsphere-jdbc-core-spring-boot-starter)
shardingsphere-jdbc-core-spring-boot-starter
随着ShardingSphere的发展,项目从单一的Sharding-JDBC组件扩展为一个更完整的套件,包含了多个组件,如Sharding-JDBC、Sharding-Proxy等。
shardingsphere-jdbc-core-spring-boot-starter是ShardingSphere套件中用于JDBC集成的Spring Boot Starter。
与早期的sharding-jdbc-spring-boot-starter相比,它可能包含了更多的功能和优化,因为ShardingSphere本身也在不断发展和完善。
参考文章:
【1】SpringBoot整合Sharding-JDBC水平分表
数据迁移(sharding-scaling 和 sharding-proxy)
参考文章
【1】使用sharding-scaling和sharding-proxy做分库分表数据迁移
https://blog.csdn.net/qq_37207854/article/details/130567728
【2】ShardingSphere——水平分表与数据迁移
https://blog.csdn.net/qq_20545159/article/details/121760472
直接使用客户端操作(非代码Sharding-Proxy)
参考文章
【1】Sharding-Proxy 实现分库分表
https://blog.csdn.net/qq_38826019/article/details/119861073