ShardingJDBC实现水平分库、水平分表

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: ShardingJDBC实现水平分库、水平分表
  • ShardingJdbc是一个轻量级的java框架,是增强版的JDBC
  • 在完成了分库分表之后,使用shardingJDBC进行数据读取
  • ShardingJDBC作用:简化在分库分表之后对数据库的操作
  • 水平分库/分表与垂直分库分表的区别


image.png

image.png


  • model

public class Course {
    // 课程主键
    private Long cid;
    private String cname;
     // 用户主键
    private long userId;
    private int cstatus;
}


# Target



# 水平分表


  • 表1: course_1
  • 表2: course_2
  • 数据入表规则:
  • cid为偶数则数据入表course_1
  • cid为奇数则数据入表course_2


# 水平分库


  • 库1: es_spark
  • 库2: sharding_sphere_2
  • 数据入库规则:
  • user_id为偶数的入库 es_spark
  • user_id为奇数的入库 sharding_sphere_2


# 依赖



  • springboot
  • mybatis-plus
  • sharding-jdbc

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.3.2</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.shardingsphere/sharding-jdbc-spring-boot-starter -->
        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
            <version>4.1.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>


# 数据源,分库分表规则配置



  • 可使用 ${ expression }$->{ expression }标识行表达式
  • ${begin..end} 表示范围区间
  • ${[unit1, unit2, unit_x]} 表示枚举值
  • ${['online', 'offline']}_table${1..3} 将取笛卡尔积
  • ShardingJDBC内置的主键生成器
  • SNOWFLAKE 雪花算法
  • 能够保证不同进程主键的不重复性,以及相同进程主键的有序性
  • UUID UUID.randomUUID()

# 数据源别名
spring.shardingsphere.datasource.names=m1,m2
# m1 数据源的具体配置
spring.shardingsphere.datasource.m1.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.m1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.m1.jdbc-url=jdbc:mysql://xxx/es_spark
spring.shardingsphere.datasource.m1.username=x
spring.shardingsphere.datasource.m1.password=x
# m2 数据源配置
spring.shardingsphere.datasource.m2.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.m2.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.m2.jdbc-url=jdbc:mysql://xxx:3361/sharding_sphere_2
spring.shardingsphere.datasource.m2.username=x
spring.shardingsphere.datasource.m2.password=x
# 数据库的分布情况和表的分布情况 数据库.表,笛卡尔积
spring.shardingsphere.sharding.tables.course.actual-data-nodes=m$->{1..2}.course_$->{1..2}
# 主键的生成策略
spring.shardingsphere.sharding.tables.course.key-generator.column=cid
spring.shardingsphere.sharding.tables.course.key-generator.type=SNOWFLAKE
# 指定数据库的分片策略  默认的 对所有的数据的规则
spring.shardingsphere.sharding.default-database-strategy.inline.sharding-column=user_id
spring.shardingsphere.sharding.default-database-strategy.inline.algorithm-expression=m$->{user_id % 2+1}
# 对具体某张表的分库规则
spring.shardingsphere.sharding.tables.course.database-strategy.inline.sharding-column=user_id
spring.shardingsphere.sharding.tables.course.database-strategy.inline.algorithm-expression=m$->{user_id % 2+1}
# 指定表的分片策略,如:cid是奇数存储到course_1,cid是偶数存储到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}
# 输出日志
spring.shardingsphere.props.sql.show=true
# 一个实体类对应两张表
#spring.main.allow-bean-definition-overriding=true

# 测试


/**
 * @author futao@mysteel.com
 * @date 2021/8/31
 */
@RestController
@RequestMapping("/course")
public class CourseController {
    @Resource
    private CourseMapper courseMapper;
    @PostMapping("/add")
    public void add() {
        for (int i = 0; i < 100; i++) {
            Course course = new Course();
            course.setCname("语文");
            course.setCstatus(i);
            course.setUserId(i);
            courseMapper.insert(course);
        }
    }
    @GetMapping()
    public Course find(Long cid) {
        return courseMapper.selectOne(Wrappers.<Course>lambdaQuery().eq(Course::getCid, cid));
    }
}


  • user_id为偶数入库es_spark,cid为偶数入course_1


image.png

user_id为偶数入库es_spark,cid为奇数入course_2

image.png


user_id为奇数入库sharding_sphere_2,cid为偶数入course_1

image.png

user_id为奇数入库sharding_sphere_2,cid为奇数入course_2


image.png

# Q:



  • 分库分表之后如何分页查询
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
Java 关系型数据库 中间件
分库分表(3)——ShardingJDBC实践
分库分表(3)——ShardingJDBC实践
860 0
分库分表(3)——ShardingJDBC实践
|
关系型数据库 MySQL Java
Sharding-Proxy的基本功能使用
Sharding-Proxy是一个分布式数据库中间件,定位为透明化的数据库代理端。作为开发人员可以完全把它当成数据库,而它具体的分片规则在Sharding-Proxy中配置。
3119 0
Sharding-Proxy的基本功能使用
|
Ubuntu Linux 数据安全/隐私保护
Win10安装Linux,无需安装虚拟机版
win10,linux,虚拟机,ubuntu
1771 0
Win10安装Linux,无需安装虚拟机版
|
关系型数据库 MySQL Docker
docker 安装 mysql 5.7
docker 安装 mysql 5.7
5235 0
|
消息中间件 Java RocketMQ
消息队列 MQ产品使用合集之当SpringBoot应用因网络不通而启动失败时,该如何解决
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
【bug记录】旋转链表与力扣报错:member access within null pointer of type ‘struct ListNode‘
【bug记录】旋转链表与力扣报错:member access within null pointer of type ‘struct ListNode‘
202 0
|
SQL 负载均衡 算法
使用ShardingJDBC实现分库分表
使用ShardingJDBC实现分库分表
|
11月前
|
人工智能 安全 大数据
CDGA|数据要素与数据安全:携手构建可信数据生态的深远探讨
数据要素与数据安全是数字经济时代不可分割的双生子。只有在保障数据安全的前提下,才能充分发挥数据要素的价值,推动数字经济持续健康发展。构建可信数据生态,需要政府、企业、社会组织及广大公众的共同努力,形成合力,共同应对挑战,共创数字经济的美好未来。
|
关系型数据库 MySQL Linux
Linux下搭建MySQL主从复制之一主一从架构
Linux下搭建MySQL主从复制之一主一从架构
359 0
|
Java 数据库连接 mybatis
项目移植到原先mybasis项目里出现BindingException: Invalid bound statement (not found): **selectPage
项目移植到原先mybasis项目里出现BindingException: Invalid bound statement (not found): **selectPage
189 1