分库分表-节目服务

阅读此文前,建议小伙伴先阅读分库分表的前置知识,对分库分表 和 shardingsphere 有了大概的理解后,在继续阅读本文

介绍

在开始介绍前,需要先知道大麦网中数据库表的关系是怎么样,关于数据库表设计的详细介绍,小伙伴可跳转到相关文档

配置 引入 ShardingSphere 的相关依赖

<properties>
	<shardingsphere.version>5.3.2</shardingsphere.version>
</properties>
<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>shardingsphere-jdbc-core</artifactId>
    <version>${shardingsphere.version}</version>
    <exclusions>
        <exclusion>
            <artifactId>logback-classic</artifactId>
            <groupId>ch.qos.logback</groupId>
        </exclusion>
    </exclusions>
</dependency>

根据规则进行分库分表的规则配置

节目项目相关配置:

spring:
  datasource:
    driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver
    url: jdbc:shardingsphere:classpath:shardingsphere-program.yaml

shardingsphere-program.yaml配置:

dataSources: 
  # 第一个节目库
  ds_0:
    dataSourceClassName: com.zaxxer.hikari.HikariDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    jdbcUrl: jdbc:mysql://127.0.0.1:3306/damai_program_0?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true&allowMultiQueries=true&serverTimezone=Asia/Shanghai&autoReconnect=true
    username: root
    password: root
  # 第一个节目库
  ds_1:
    dataSourceClassName: com.zaxxer.hikari.HikariDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    jdbcUrl: jdbc:mysql://127.0.0.1:3306/damai_program_1?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true&allowMultiQueries=true&serverTimezone=Asia/Shanghai&autoReconnect=true
    username: root
    password: root
    
rules:
  - !SHARDING
    tables:
      # 对d_program表进行分库分表
      d_program:
        # 库为damai_program_0 damai_program_1 表为d_program_0 至 d_program_1
        actualDataNodes: ds_${0..1}.d_program_${0..1}
        # 分库策略
        databaseStrategy:
          standard:
            # 使用id作为分片键
            shardingColumn: id
            # 使用id分库算法
            shardingAlgorithmName: databaseProgramModModel
        # 分表策略
        tableStrategy:
          standard:
            # 使用id作为分片键
            shardingColumn: id
            # 使用id分表算法
            shardingAlgorithmName: tableProgramModModel
      # 对d_program_group表进行分库分表      
      d_program_group:
        # 库为damai_program_0 damai_program_1 表为d_program_group_0 至 d_program_group_1
        actualDataNodes: ds_${0..1}.d_program_group_${0..1}
        # 分库策略
        databaseStrategy:
          standard:
            # 使用id作为分片键
            shardingColumn: id
            # 使用id分库算法
            shardingAlgorithmName: databaseProgramGroupModModel
        # 分表策略    
        tableStrategy:
          standard:
            # 使用id作为分片键
            shardingColumn: id
            # 使用id分库算法
            shardingAlgorithmName: tableProgramGroupModModel      
      # 对d_program_show_time表进行分库分表
      d_program_show_time:
        # 库为damai_program_0 damai_program_1 表为d_program_show_time_0 至 d_program_show_time_1
        actualDataNodes: ds_${0..1}.d_program_show_time_${0..1}
        # 分库策略
        databaseStrategy:
          standard:
            # 使用id作为分片键
            shardingColumn: program_id
            # 使用id分库算法
            shardingAlgorithmName: databaseProgramShowTimeModModel
        # 分表策略
        tableStrategy:
          standard:
            # 使用id作为分片键
            shardingColumn: program_id
            # 使用id分表算法
            shardingAlgorithmName: tableProgramShowTimeModModel
      # 对d_seat表进行分库分表
      d_seat:
        # 库为damai_program_0 damai_program_1 表为d_seat_0 至 d_seat_1
        actualDataNodes: ds_${0..1}.d_seat_${0..1}
        # 分库策略
        databaseStrategy:
          standard:
            # 使用id作为分片键
            shardingColumn: program_id
            # 使用id分库算法
            shardingAlgorithmName: databaseSeatModModel
        # 分表策略
        tableStrategy:
          standard:
            # 使用id作为分片键
            shardingColumn: program_id
            # 使用id分表算法
            shardingAlgorithmName: tableSeatModModel
      # 对d_ticket_category表进行分库分表
      d_ticket_category:
        # 库为damai_program_0 damai_program_1 表为d_ticket_category_0 至 d_ticket_category_1
        actualDataNodes: ds_${0..1}.d_ticket_category_${0..1}
        # 分库策略
        databaseStrategy:
          standard:
            # 使用id作为分片键
            shardingColumn: program_id
            # 使用id分库算法
            shardingAlgorithmName: databaseTicketCategoryModModel
        # 分表策略
        tableStrategy:
          standard:
            # 使用id作为分片键
            shardingColumn: program_id
            # 使用id分表算法
            shardingAlgorithmName: tableTicketCategoryModModel      
    # 广播表
    broadcastTables:
      - d_program_category
    # 具体的算法
    shardingAlgorithms:
      # d_program表分库算法
      databaseProgramModModel:
        type: MOD
        props:
          # 分库数量
          sharding-count: 2
      # d_program表分表算法
      tableProgramModModel:
        type: MOD
        props:
          # 分表数量
          sharding-count: 2
      # d_program_group表分库算法    
      databaseProgramGroupModModel:
        type: MOD
        props:
          # 分库数量
          sharding-count: 2
      # d_program_group表分表算法      
      tableProgramGroupModModel:
        type: MOD
        props:
          # 分表数量
          sharding-count: 2    
      # d_program_show_time表分库算法
      databaseProgramShowTimeModModel:
        type: MOD
        props:
          # 分库数量
          sharding-count: 2
      # d_program_show_time表分表算法
      tableProgramShowTimeModModel:
        type: MOD
        props:
          # 分表数量
          sharding-count: 2
      # d_seat表分库算法
      databaseSeatModModel:
        type: MOD
        props:
          # 分库数量
          sharding-count: 2
      # d_seat表分表算法
      tableSeatModModel:
        type: MOD
        props:
          # 分表数量
          sharding-count: 2
      # d_ticket_category表分库算法
      databaseTicketCategoryModModel:
        type: MOD
        props:
          # 分库数量
          sharding-count: 2
      # d_ticket_category表分表算法
      tableTicketCategoryModModel:
        type: MOD
        props:
          # 分表数量
          sharding-count: 2    
props:
  # 打印真实sql
  sql-show: true

总结

  • d_program表的分库分表都是用的id作为分片键,算法为MOD,取模
  • d_program_group表的分库分表都是用的id作为分片键,算法为MOD,取模
  • d_program_show_time表的分库分表都是用的program_id作为分片键,算法为MOD,取模
  • d_seat表的分库分表都是用的program_id作为分片键,算法为MOD,取模
  • d_ticket_category表的分库分表都是用的program_id作为分片键,算法为MOD,取模
  • d_program_category为广播表

节目服务的分库分表配置比较常规,基本都是用program_id作为分片键,d_program_category表存储的是节目种类数据,数据量并不是很大,也就几百条,并且每个节目数据都需要此表关联,所以d_program_category比较适合作为广播表


企业级项目导航:⬅️ 02-分库分表-用户服务-购票人表 | 03-分库分表-节目服务 | ➡️ 04-分库分表-订单服务