聊聊 Sharding-JDBC 分库分表(三)

love374
发布于 2022-7-12 17:07
浏览
0收藏

 

Sharding-JDBC 实战
上述内容基本介绍了Sharding-JDBC的基本知识点,下面通过 Spring Boot + Sharding-JDBC 的方式实战演示一下。

1. Sharding-JDBC 的 pom 依赖
想要使用Sharding-JDBC只需要添加一个maven依赖即可,如下:

<dependency>
 <groupId>org.apache.shardingsphere</groupId>
 <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
 <version>${sharding-sphere.version}</version>
</dependency>

“笔者这里使用的版本为:4.1.1”
“源码已经上传GitHub,关注公众号:码猿技术专栏,回复关键词:9532 获取!”
2. 垂直分表、分库
垂直切分一般针对数据行数不大,但是单行的某些字段数据很大,表占用空间很大,检索的时候需要执行大量的IO,严重降低性能,此时需要将拆分到另外一张表,且与原表是一对一的关系,这就是垂直分表。

比如商品表中的商品描述数据很大,严重影响查询性能,可以将商品描述这个字段单独抽离出来存储,这样就拆分成了两张表(垂直分表),如下图:

聊聊 Sharding-JDBC 分库分表(三)-鸿蒙开发者社区

 垂直分表

通过垂直分表性能得到了一定程度的提升,但是还没有达到要求,并且磁盘空间也快不够了,因为数据还是始终限 制在一台服务器,库内垂直分表只解决了单一表数据量过大的问题,但没有将表分布到不同的服务器上,因此每个 表还是竞争同一个物理机的CPU、内存、网络IO、磁盘。

此时就需要进行垂直分库,如下之前是在单独的卖家库存储的,现在需要将商品的信息给垂直切分出去,分成了两个库:商品库product_db、店铺库shop_db:

聊聊 Sharding-JDBC 分库分表(三)-鸿蒙开发者社区

 垂直分库

方案已经有了,那么现在就需要用Sharding-JDBC去实现。

“product_db和shop_db的SQL会放在源码中,这里就不再贴了”
Sharding-JDBC 使用非常简单,只需要在配置文件中指定数据源信息和切片规则即可实现分库分表。

这里支持三种配置,如下:

  • yml配置文件
  • properties配置文件
  • Java Config 编码配置
    这里笔者使用的是第一种yml配置方式,详细配置如下:
spring:
  # Sharding-JDBC的配置
  shardingsphere:
    datasource:
      # 数据源,这里配置两个,分别是ds1,ds2
      names: ds1,ds2
      # ds1的配置信息,product_db1
      ds1:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3306/product_db?useUnicode=true&characterEncoding=utf-8
        username: root
        password: Nov2014
      # ds2的配置信息,shop_db
      ds2:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3306/shop_db?useUnicode=true&characterEncoding=utf-8
        username: root
        password: Nov2014
    # 分片的配置
    sharding:
      # 表的分片策略
      tables:
       ## product_base是逻辑表的名称
        product_base:
          # 数据节点配置,采用Groovy表达式,切分之后的真实表所在的节点
          actual-data-nodes: ds$->{1}.product_base
          # 主键生成策略
          key-generator:
            # 主键
            column: product_id
            # 生成算法
            type: SNOWFLAKE
        product_description:
          # 数据节点配置,采用Groovy表达式
          actual-data-nodes: ds$->{1}.product_description
        shop:
          # 数据节点配置,采用Groovy表达式
          actual-data-nodes: ds$->{2}.shop
          # 主键生成策略
          key-generator:
            # 主键
            column: shop_id
            # 生成算法
            type: SNOWFLAKE
    props:
      sql:
        # 日志显示具体的SQL
        show: true

 

上述配置非常简单,分为如下几个步骤:

1、数据源配置

由于垂直分库涉及到shop_db,product_db,肯定是要配置两个数据源,如下:

spring:
  # Sharding-JDBC的配置
  shardingsphere:
    datasource:
      # 数据源,这里配置两个,分别是ds1,ds2
      names: ds1,ds2
      # ds1的配置信息,product_db1
      ds1:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3306/product_db?useUnicode=true&characterEncoding=utf-8
        username: root
        password: Nov2014
      # ds2的配置信息,shop_db
      ds2:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3306/shop_db?useUnicode=true&characterEncoding=utf-8
        username: root
        password: Nov2014

这个很好理解,两个数据源名称分别为ds1,ds2,自己任意取名,然后配置相关信息。

 

2、数据节点配置

这里数据节点很重要,你要告诉Sharding-JDBC 你要操作的那张表在哪个库中,对应表的名称。

上述涉及到三张表,分别是shop、product_base、product_description,因此需要配置三个数据节点,如下:

spring:
  # Sharding-JDBC的配置
  shardingsphere:
    # 分片的配置
    sharding:
      # 表的分片策略
      tables:
       ## product_base是逻辑表的名称
        product_base:
          # 数据节点配置,采用Groovy表达式,切分之后的真实表所在的节点
          actual-data-nodes: ds$->{1}.product_base
        product_description:
          # 数据节点配置,采用Groovy表达式
          actual-data-nodes: ds$->{1}.product_description
        shop:
          # 数据节点配置,采用Groovy表达式
          actual-data-nodes: ds$->{2}.shop

 

ds$->{1} 采用的是Groovy表达式,表示ds1

数据节点要具体到指定的数据库、表名。

“spring.shardingsphere.sharding.default-data-source-name=ds1可以指定默认的数据源”

 

文章转自公众号:码猿技术专栏

标签
已于2022-7-12 17:07:18修改
收藏
回复
举报
回复
    相关推荐