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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 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:



  • 分库分表之后如何分页查询
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6月前
|
存储 大数据 数据库
分库分表知识总结(三)之水平分表
分库分表知识总结(三)之水平分表
99 0
|
6月前
|
存储 监控 数据库
分库分表知识总结(二)之垂直分表
分库分表知识总结(二)之垂直分表
87 1
|
存储 缓存 数据库
什么是垂直分表、垂直分库、水平分表、水平分库?
什么是垂直分表、垂直分库、水平分表、水平分库?
275 0
|
SQL 算法 Java
水平分库和水平分表
水平分库和水平分表
|
算法 Java 数据库连接
垂直分表和垂直分库
垂直分表和垂直分库
|
算法 Java 程序员
水平分库分表的策略
水平分库分表的策略
|
存储 数据处理 数据库
分表方案有哪些
分表方案有哪些
123 0
|
存储 数据库连接 数据库
分库方案有哪些
分库方案有哪些
109 0
|
存储 大数据 数据库
水平分库
水平分库
115 0
水平分库
|
缓存 数据库 索引
水平分表
水平分表
130 0
水平分表