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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值