zoukankan      html  css  js  c++  java
  • 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
    ------------------------------------------------------------------
    -----------------------------------------------------------
    ---------------------------------------------
    朦胧的夜 留笔~~
  • 相关阅读:
    解决document.write问题
    js操作css样式
    最强大的对联广告,所有浏览器支持,ie6无抖动,缩放页面ie6没有横向滚动条
    JavaScript绘制图形Canvas
    DDD关键知识点整理汇总
    聚合(根)、实体、值对象精炼思考总结
    DDD领域驱动设计基本理论知识总结
    GVMStart 正常结果
    Ubuntu20.04安装、配置openvas 9
    VS Code MarkDown即时渲染编写插件
  • 原文地址:https://www.cnblogs.com/liconglong/p/14459827.html
Copyright © 2011-2022 走看看