架构-数据库层面-分库分表-shardingjdbc技术栈

上一篇文章,已经介绍了,mycat在springboot工程中具体的使用

mycat这个技术栈,提供的机制和知识体系,可以系统的花时间在总结一遍

但是对于写代码而言,我们要掌握的就是配置好,技术栈

然后写用到业务逻辑里面写代码、、

写这篇文章的目的,就是,如果要彻底掌握sharding-jdbc技术栈,我们应该用什么样的思路去掌握。

1.springboot如何引入配置这个sharding-jdbc技术栈。

要配置这个技术栈,需要怎么配置,在哪里配置

2.sharding-jdbc技术栈,提供了哪些机制供使用

垂直分库,水平分表,读写分离

一、Spring Boot 引入与配置 Sharding-JDBC

1.1 引入依赖

在 Spring Boot 项目的 pom.xml 中添加 ShardingSphere-JDBC 的 Spring Boot Starter 依赖:

xml 复制代码
<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
    <version>5.5.0</version>
</dependency>

同时需要添加数据库驱动(如 MySQL)和 ORM 框架依赖(如 MyBatis 或 JPA)。

版本兼容提示:Spring Boot 2.1.x 建议搭配 Sharding-JDBC 4.1.x 版本,避免使用 5.x 版本可能存在的兼容性问题。

1.2 配置方式

ShardingSphere-JDBC 支持四种配置方式:

  • Spring Boot Starter 配置 (推荐):在 application.ymlapplication.properties 中配置
  • YAML 配置 :独立的 sharding.yaml 文件,通过 jdbc:shardingsphere:classpath:sharding.yaml 引用
  • Java API 配置:通过代码构建配置对象
  • Spring 命名空间配置:基于 XML 的配置方式

对于 Spring Boot 项目,最常用的是前两种方式。

1.3 核心配置结构

application.yml 中,ShardingSphere-JDBC 的配置主要包含以下几个层次:

yaml 复制代码
spring:
  shardingsphere:
    # 1. 开启 SQL 日志(便于调试)
    props:
      sql-show: true
    
    # 2. 定义真实数据源
    datasource:
      names: ds0, ds1
      ds0:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://localhost:3306/db0
        username: root
        password: your_password
      ds1:
        # 类似配置...
    
    # 3. 规则配置(分片、读写分离等)
    rules:
      sharding:
        tables:
          # 分片表规则配置...

或者采用独立 YAML 文件的方式:

yaml 复制代码
# sharding.yaml
dataSources:
  ds_0:
    dataSourceClassName: com.zaxxer.hikari.HikariDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    jdbcUrl: jdbc:mysql://localhost:3306/db0
    username: root
    password: root
  ds_1:
    # 类似配置...

rules:
  - !SHARDING
    tables:
      order:
        actualDataNodes: ds_$->{0..1}.order_$->{0..1}
        # 分库策略、分表策略...

二、Sharding-JDBC 提供的核心机制

Sharding-JDBC 的核心价值在于:无需改造业务代码,通过轻量级代理实现分库分表与读写分离,兼容主流 ORM 框架。

2.1 垂直分库(Vertical Partitioning)

概念:将不同业务模块的表分布到独立的数据库实例中。例如,订单表放在一个库,用户表放在另一个库,实现"专库专用",减少单库压力。

配置要点:垂直分库的配置相对简单------不同的逻辑表直接指向不同的物理数据源,不需要复杂的分片算法。

yaml 复制代码
rules:
  - !SHARDING
    tables:
      # 订单表在 ds0
      t_order:
        actualDataNodes: ds0.t_order
      # 用户表在 ds1
      t_user:
        actualDataNodes: ds1.t_user

适用场景:业务模块边界清晰、表之间关联较少的系统。

2.2 水平分表(Horizontal Sharding)

概念 :将一张表的数据按一定规则拆分到多张物理表中。例如 t_order 逻辑表,实际对应 t_order_0t_order_1 等物理表。

核心配置要素

  • 逻辑表(Logical Table) :应用代码中操作的表名,如 t_order
  • 真实表(Actual Table) :物理数据库中实际存在的表,如 t_order_0
  • 分片键(Sharding Key) :用于决定数据路由的字段,如 order_id
  • 分片算法(Sharding Algorithm) :路由逻辑,如取模 order_id % 2

配置示例

yaml 复制代码
rules:
  sharding:
    tables:
      t_order:
        # 实际数据节点:2个库 × 2张表
        actual-data-nodes: ds$->{0..1}.t_order_$->{0..1}
        # 分库策略:基于 user_id
        database-strategy:
          standard:
            sharding-column: user_id
            sharding-algorithm-name: database-inline
        # 分表策略:基于 order_id
        table-strategy:
          standard:
            sharding-column: order_id
            sharding-algorithm-name: table-inline
        # 主键生成策略(雪花算法)
        key-generate-strategy:
          column: order_id
          key-generator-name: snowflake

Sharding-JDBC 内置了多种分片算法,如 INLINE(Groovy 表达式)、HASH_MOD(哈希取模)、MOD(直接取模)等。

关键原则 :分库分表后,查询、更新、删除操作的条件必须带上分片键,否则会扫描所有库和表,严重影响性能。

2.3 读写分离(Read-Write Splitting)

概念:将数据库的读操作和写操作分别指向不同的数据库实例------主库负责写入,从库负责读取。

前置条件:需要先搭建 MySQL 主从复制环境。

配置要点

  • primaryDataSourceName:主库数据源
  • replicaDataSourceNames:从库数据源列表
  • loadBalanceAlgorithm:从库负载均衡算法
yaml 复制代码
rules:
  - !READWRITE_SPLITTING
    dataSources:
      ds_ms:
        primaryDataSourceName: ds_master
        replicaDataSourceNames:
          - ds_slave0
          - ds_slave1
        loadBalancerName: round_robin
    loadBalancers:
      round_robin:
        type: ROUND_ROBIN

三、总结:掌握 Sharding-JDBC 的思路

回顾本文的核心内容,掌握 Sharding-JDBC 技术栈可以从以下三个层次入手:

层次 内容 关键点
引入配置 Maven 依赖 + application.yml / sharding.yaml 数据源定义、规则配置、SQL日志
核心机制 垂直分库、水平分表、读写分离 分片键选择、分片算法、主键生成
业务编码 与普通 JDBC/MyBatis/JPA 完全一致 注意查询条件带分片键

在实际开发中,Sharding-JDBC 的配置确实是最核心的工作------一旦配置完成,业务代码的编写方式和单库单表没有任何区别。这也正是 Sharding-JDBC 的设计理念:让分库分表对业务代码透明

配置本身虽然有一定复杂度,但只要掌握了数据源定义、分片规则配置、分片算法选择这三个核心环节,就能应对大部分场景。更深入的理解(如 SQL 解析、路由、改写、结果归并等原理)可以作为进阶方向,但对于日常开发而言,配置熟练 + 业务代码正确使用分片键 就已经足够了。