Mysql分庫分表(Sharding JDBC)


一、Sharding JDBC實現分庫分表

  對於Sharding JDBC分庫分表,配置殘燭可以分為幾大塊:

    數據源配置:

      配置參數:spring.shardingsphere.datasource.names

      說明:如果用到分表,則需要配置多個數據源,多數據源之間用逗號分隔

    數據源連接信息配置:

      配置參數:spring.shardingsphere.datasource.dbname.*

      說明:其中dbname就是上面配置的數據源名稱,后面需要配置數據庫類型、數據庫驅動、地址、用戶名密碼等信息

    表的分配策略:

      配置參數:spring.shardingsphere.sharding.tables.tablename.actual-data-nodes

      說明:其中tablename就是我們實際要用來分庫分表的表名;該配置用來配置該表分幾個庫幾張表:

        如果只分庫,配置樣例為:ds1.order_info_$->{1..4},這就表明,對於order_info這張表,都存在ds1的這個數據庫中,而表則分4張表,分別為order_info_1到order_info_4;

        如果只分庫,配置樣例為:ds$->{1..2}.order_info_new,這就表明,對於order_info_new這張表,會根據分庫策略將其存入ds1和ds2兩個數據庫中,但是不分表,都是存在庫中的order_info_new表中;

        既分庫又分表:配置樣例為:ds$->{1..2}.order_info_$->{1..4},這就表明,對於order_info這張表,會根據分庫策略將其存入ds1和ds2兩個數據庫中,同時也會更具分表策略,將數據存入order_info_1到order_info_4中;

    設置主鍵信息:

      配置參數:spring.shardingsphere.sharding.tables.order_info.key-generator.*

    分表策略配置:

      配置參數:spring.shardingsphere.sharding.tables.tablename.table-strategy.inline.sharding-column

      說明:tablename表的分表策略使用哪一列來分

      配置參數:spring.shardingsphere.sharding.tables.tablename.table-strategy.inline.algorithm-expression

      說明:tablename表的分表策略,例如value為order_info_$->{order_id % 4 + 1},說明根據order_id的值與4取余加1的表,例如order_id為5,那么數據就會被存入order_info_2表中。

    分庫配置:

      配置參數:spring.shardingsphere.sharding.tables.tablename.database-strategy.inline.sharding-column

      說明:tablename表的分庫策略使用哪一列來分

      配置參數:spring.shardingsphere.sharding.tables.tablename.database-strategy.inline.algorithm-expression=

      說明:tablename表的分庫策略,例如value為ds$->{vender_id % 2 + 1},說明根據vender_id的值與2取余加1的庫,例如vender_id為5,那么數據就會被存入ds2庫中。

(一)分表

  1、引入依賴

   <!-- Druid連接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.20</version>
        </dependency>

        <!-- Mysql驅動依賴 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <!-- MybatisPlus -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.0.5</version>
        </dependency>

        <!-- Sharding-JDBC -->
        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
            <version>4.0.0-RC2</version>
        </dependency>

  2、創建表

  在不同的兩個庫中(192.168.1.104和192.168.1.106),分別創建訂單表(分4張表)

create table order_info_1(id bigint(11) PRIMARY KEY NOT NULL auto_increment,order_id bigint(11),vender_id bigint(11));
create table order_info_2(id bigint(11) PRIMARY KEY NOT NULL auto_increment,order_id bigint(11),vender_id bigint(11));
create table order_info_3(id bigint(11) PRIMARY KEY NOT NULL auto_increment,order_id bigint(11),vender_id bigint(11));
create table order_info_4(id bigint(11) PRIMARY KEY NOT NULL auto_increment,order_id bigint(11),vender_id bigint(11));

  3、配置分表

  分表主要就是配置數據源信息,分表策略(分幾張表,從幾到幾),分表列(根據那一列進行分表),分片策略(根據什么樣的策略進行分表,hash、取模等)

spring.shardingsphere.datasource.names=lcldata104

# 配置數據源具體內容————————包含  連接池,  驅動,             地址,   用戶名,    密碼
# 由於上面配置數據源只有lcldata104因此下面只配置lcldata104.type,lcldata104.driver-class-name,lcldata104.url,lcldata104.username,lcldata104.password
spring.shardingsphere.datasource.lcldata104.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.lcldata104.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.lcldata104.url=jdbc:mysql://192.168.1.104:3306/lcltest?characterEncoding=utf-8&useUnicode=true&useSSL=false&serverTimezone=UTC
spring.shardingsphere.datasource.lcldata104.username=root
spring.shardingsphere.datasource.lcldata104.password=root


# 配置表的分布,表的策略
spring.shardingsphere.sharding.tables.order_info.actual-data-nodes=lcldata104.order_info_$->{1..4}

# 指定訂單表 根據訂單號生成策略為 SNOWFLAKE
spring.shardingsphere.sharding.tables.order_info.key-generator.column=order_id
spring.shardingsphere.sharding.tables.order_info.key-generator.type=SNOWFLAKE

# 指定分片策略
spring.shardingsphere.sharding.tables.order_info.table-strategy.inline.sharding-column=order_id
spring.shardingsphere.sharding.tables.order_info.table-strategy.inline.algorithm-expression=order_info_$->{order_id % 4 + 1}

# 打開sql輸出日志
spring.shardingsphere.props.sql.show=true

  4、測試

  測試就直接上代碼

@Data
@Builder
public class OrderInfo {
    private long id;
    private long orderId;
    private long venderId;
}
@Repository
public interface OrderMapper extends BaseMapper<OrderInfo> {
}
    @RequestMapping("/save")
    public String save(long orderId, long venderId){
        orderService.save(OrderInfo.builder().orderId(orderId).venderId(venderId).build());
        return "OK";
    }
@SpringBootApplication
@MapperScan("com.lcl.galaxy.lcl.galaxy.mysql.dao")
public class LclGalaxyMysqlApplication {
    public static void main(String[] args) {
        SpringApplication.run(LclGalaxyMysqlApplication.class, args);
    }
}

  測試結果如預期一樣,根據訂單號取余加一,落在了不同的表中。

(二)分庫

  分庫的話就需要配置多個數據源,同時配置分庫分表策略時,只分庫,不分表,同時配置分庫策略

spring.shardingsphere.datasource.names=ds1,ds2

spring.shardingsphere.datasource.ds1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.ds1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds1.url=jdbc:mysql://192.168.1.104:3306/lcltest?characterEncoding=utf-8&useUnicode=true&useSSL=false&serverTimezone=UTC
spring.shardingsphere.datasource.ds1.username=root
spring.shardingsphere.datasource.ds1.password=root

spring.shardingsphere.datasource.ds2.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.ds2.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds2.url=jdbc:mysql://192.168.1.106:3306/lcltest?characterEncoding=utf-8&useUnicode=true&useSSL=false&serverTimezone=UTC
spring.shardingsphere.datasource.ds2.username=root
spring.shardingsphere.datasource.ds2.password=root

# 配置表的分布,表的策略
spring.shardingsphere.sharding.tables.order_info_new.actual-data-nodes=ds$->{1..2}.order_info_new


# 指定分片策略
spring.shardingsphere.sharding.tables.order_info_new.database-strategy.inline.sharding-column=vender_id
spring.shardingsphere.sharding.tables.order_info_new.database-strategy.inline.algorithm-expression=ds$->{vender_id % 2 + 1}

# 打開sql輸出日志
spring.shardingsphere.props.sql.show=true

(三)分庫分表

  分庫分表與分庫的區別就是,配置表的策略時,既分庫又分表,同時既要配置分庫策略又要配置分表策略。

spring.shardingsphere.datasource.names=ds1,ds2

spring.shardingsphere.datasource.ds1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.ds1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds1.url=jdbc:mysql://192.168.1.104:3306/lcltest?characterEncoding=utf-8&useUnicode=true&useSSL=false&serverTimezone=UTC
spring.shardingsphere.datasource.ds1.username=root
spring.shardingsphere.datasource.ds1.password=root

spring.shardingsphere.datasource.ds2.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.ds2.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds2.url=jdbc:mysql://192.168.1.106:3306/lcltest?characterEncoding=utf-8&useUnicode=true&useSSL=false&serverTimezone=UTC
spring.shardingsphere.datasource.ds2.username=root
spring.shardingsphere.datasource.ds2.password=root

# 配置表的分布,表的策略
spring.shardingsphere.sharding.tables.order_info.actual-data-nodes=ds$->{1..2}.order_info_$->{1..4}

# 指定訂單表 根據訂單號生成策略為 SNOWFLAKE
spring.shardingsphere.sharding.tables.order_info.key-generator.column=order_id
spring.shardingsphere.sharding.tables.order_info.key-generator.type=SNOWFLAKE

# 指定分片策略
spring.shardingsphere.sharding.tables.order_info.table-strategy.inline.sharding-column=order_id
spring.shardingsphere.sharding.tables.order_info.table-strategy.inline.algorithm-expression=order_info_$->{order_id % 4 + 1}

spring.shardingsphere.sharding.tables.order_info.database-strategy.inline.sharding-column=vender_id
spring.shardingsphere.sharding.tables.order_info.database-strategy.inline.algorithm-expression=ds$->{vender_id % 2 + 1}

# 打開sql輸出日志
spring.shardingsphere.props.sql.show=true

二、Sharding JDBC實現讀寫分離

  讀寫分離,主要就是需要配置配置主從服務器連接,然后配置讀寫分離的輪詢策略等內容。

spring:
  datasource:
    url: jdbc:mysql://192.168.1.104:3306/lcltest?characterEncoding=utf-8&useUnicode=true&useSSL=false&serverTimezone=UTC
  #用戶名密碼
    username: root
    password: root
  #數據庫驅動
  #此處驅動有兩個
  #com.mysql.jdbc.Driver
  #com.mysql.cj.jdbc.Driver
  #MySQL5用的驅動url是com.mysql.jdbc.Driver,MySQL6以后用的是com.mysql.cj.jdbc.Driver。
  #使用何種驅動,根據安裝MySQL的版本而定
    driver-class-name: com.mysql.cj.jdbc.Driver
  main:
    allow-bean-definition-overriding: true
  shardingsphere:
    datasource:
      names:
        lcl104,lcl106
      # 主數據源
      lcl104:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://192.168.1.104:3306/lcltest?characterEncoding=utf-8&useUnicode=true&useSSL=false&serverTimezone=UTC
        username: root
        password: root
      # 從數據源
      lcl106:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://192.168.1.106:3306/lcltest?characterEncoding=utf-8&useUnicode=true&useSSL=false&serverTimezone=UTC
        username: root
        password: root
    masterslave:
      # 讀寫分離配置
      load-balance-algorithm-type: round_robin
      # 最終的數據源名稱
      name: dataSource
      # 主庫數據源名稱
      master-data-source-name: lcl104
      # 從庫數據源名稱列表,多個逗號分隔
      slave-data-source-names: lcl106
    props:
      # 開啟SQL顯示,默認false
      sql:
        show: true

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM