关于数据库:ShardingSphereProxy-分库分表一

34次阅读

共计 6051 个字符,预计需要花费 16 分钟才能阅读完成。

一、ShardingSphere-Proxy 的外围概念

  • ShardingSphere-Proxy 概念

    官网地址:https://shardingsphere.apache…

    ShardingSphere-Proxy 就是数据库的代理,如图:

  • ShardingSphere-Proxy 次要代理哪些数据库

    默认代理:Mysql、PostSql

  • 实现代理的目标

    1. 次要是为了实现分库分表
    2. 实现读写拆散

      这两个也是 ShardingSphere-Proxy 的两大外围性能。

  • 分库分表

    • 分库的概念和目标

      • 概念

        数据库中的表存储到不同的数据库中;如图:

- 目标

  避免一个库中多个表呈现资源竞争【CPU、内存】,导致性能降落。
  • 分表的概念和目标

    • 概念

      将数据库中一张表分成多张表,如图:

- 目标

  分表是解决表中数据量过大,晋升用户查问和增加数据的性能。比方:以 mysql 数据库为例,当用户增加数据会通过 mysql 的 InnoDB 引擎存储到数据中,InnoDB 引擎要想保证数据的性能在肯定的范畴之内,表中的数据量最大的峰值为 2000w,如果超过 2000W 那么增加数据的性能会降落,所以咱们要将超过 2000W 数据量的表拆分成多个表,这样能力保障用户的体验度。- 缺点

  1. 并发量过大,表会呈现资源竞争 [CPU、内存] 的问题,这样导致性能降落,用户的体验度变差。解决方案:分库
  • 分库分表

    • 目标

      解决表资源竞争和数据量过大的问题。

二、ShardingSphere-Proxy 的利用场景

  • 场景

    单体我的项目和微服务项目都能用到分库分表。

三、ShardingSphere-Proxy 散布分表落地

  • 工具

    ShardingSphere-Proxy

  • 计划

    • 过程内

      如图:

- 缺点
  1. 资源竞争问题。2. 异样影响问题。
  • 过程外【举荐】

    如图:

- 缺点
  1. 保护量大的问题。2. 性能绝对过程内弱一些。- 能够放在内网中进行通信【docker】
  • 实现

    • 条件

      • Mysql 数据库 版本:5.7
      • ShardingSphere-Proxy

        • 网盘下载地址

          链接:https://pan.baidu.com/s/15yUIDQOdDDwUtVLNxNa9Cg 
          提取码:3hp3
      • Java 的 JDK

        • 网盘下载地址

          链接:https://pan.baidu.com/s/1A-ksNN0YicT3hXjFscGGwA 
          提取码:r9e0
      • 下载 Mysql 的连贯驱动 文件放到根目录 lab 文件夹下

        网盘下载地址:

        链接:https://pan.baidu.com/s/1924iUe7wxGpStAzxxv2K3g 
        提取码:jy7z
    • 配置

      1. 分表

        • 配置

          1. config-sharding.yaml 分片的配置文件

            # 3、创立客户端连贯库  hmms:虚构的数据库名称【最好和实在的数据库名称一样】在 server.yaml 命名
            schemaName: hmms
            
            # 1、连贯 mysql
            dataSources:
              hmmsdatasources-0:  #节点名称  自定义
                url: jdbc:mysql://127.0.0.1:3306/ 实在数据库名称?serverTimezone=UTC&useSSL=false
                username: 数据库用户名
                password: 数据库明码 
                connectionTimeoutMilliseconds: 30000
                idleTimeoutMilliseconds: 60000
                maxLifetimeMilliseconds: 1800000
                maxPoolSize: 50
                
            # 2、分片规定
            shardingRule:
              tables: #表
                user: #逻辑表名  要对哪个表进行分表
                  actualDataNodes: hmmsdatasources-0.user-${0..1} #分几张表   这个是两个表   #hmmsdatasources-0:节点名称  
                  tableStrategy: #数据分表策越
                    inline:
                      shardingColumn: useid #分表字段
                      algorithmExpression: user-${useid % 2} #对 useid 取模分表  
                 #创立多个表
                #表名: #逻辑表名  要对哪个表进行分表
                  #actualDataNodes: hmmsdatasources-0. 表名 -${0..1} #分几张表   这个是两个表   #hmmsdatasources-0:节点名称  
          2. server.yaml

            authentication:
              users:
                root: #数据库用户名
                  password: 数据明码
                sharding:
                  password: sharding 
                  authorizedSchemas: hmms
        

     3. ShardingSpere-Proxy

        运行命令

        ```
        #根目录 bin 文件下执行命令
         start.bat
        ```

        运行后果如图:![在这里插入图片形容](https://img-blog.csdnimg.cn/7121143f98ac457685eb143407266079.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQEDnpZ7lhpw=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)


     4. MySql 数据库

        - 新建实在数据库名称

          ```sql
          SET NAMES utf8mb4;
          SET FOREIGN_KEY_CHECKS = 0;
          
          -- ----------------------------
          -- Table structure for user
          -- ----------------------------
          DROP TABLE IF EXISTS `user`;
          CREATE TABLE `user`  (`useid` int(11) NOT NULL,
            `usenam` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '登录名',
            `usepwd` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '登录明码',
            `usestate` int(11) NULL DEFAULT 2 COMMENT '-1:删除 1:登记 2:失常 3:挂失',
            `usekey` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户秘钥',
            `usetel` varchar(11) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户手机',
            `createbyid` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '增加人',
            `createbytime` datetime(0) NULL DEFAULT NULL COMMENT '增加工夫',
            `modifybyid` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '批改人',
            `modifybytime` datetime(0) NULL DEFAULT NULL COMMENT '批改工夫',
            PRIMARY KEY (`useid`) USING BTREE
          ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
          
          SET FOREIGN_KEY_CHECKS = 1;
          ```

          如图:![在这里插入图片形容](https://img-blog.csdnimg.cn/99ed8284c8814b4bb333d5e8ab7e7250.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQEDnpZ7lhpw=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)


        - 新建 3307 虚构数据库连贯

          如图:![在这里插入图片形容](https://img-blog.csdnimg.cn/c1008a094b154af79b0f986068da842b.png#pic_center)


          

        - 删除表

          删除 3306 中 hmms 库的 user 表,并在虚构的数据库中执行新建表的脚本,运行后果如下:虚构数据库:![在这里插入图片形容](https://img-blog.csdnimg.cn/8721d0a8e37b4ddfb4a98edde3739e27.png#pic_center)


          实在数据库

          ![在这里插入图片形容](https://img-blog.csdnimg.cn/f56fd16ea02047948046d7a2685fb3f9.png#pic_center)


        - 增加数据

          虚构数据库中增加两条数据,运行后果如下:![在这里插入图片形容](https://img-blog.csdnimg.cn/f2973fa5d3f94d90a1f33427a7350ca7.png#pic_center)


          实在数据库 表一,运行后果如下:![在这里插入图片形容](https://img-blog.csdnimg.cn/ec475b8323174741adfb18abaf24d99f.png#pic_center)


          实在数据库 表二,运行后果如下:![在这里插入图片形容](https://img-blog.csdnimg.cn/e95432d9f2464909bdf7ae25fb8123ff.png#pic_center)


2. 分库

   - 配置

     ```yaml
     # 3、创立客户端连贯库
     schemaName: hmms
     
     # 1、连贯 mysql
     dataSources:
       hmmsdatasources-0: #实在数据库 0
         url: jdbc:mysql://127.0.0.1:3306/hmms-0?serverTimezone=UTC&useSSL=false
         username: 用户名
         password: 明码 
         connectionTimeoutMilliseconds: 30000
         idleTimeoutMilliseconds: 60000
         maxLifetimeMilliseconds: 1800000
         maxPoolSize: 50
       hmmsdatasources-1: #实在数据库 1
         url: jdbc:mysql://127.0.0.1:3306/hmms-1?serverTimezone=UTC&useSSL=false
         username: 用户名
         password: 明码 
         connectionTimeoutMilliseconds: 30000
         idleTimeoutMilliseconds: 60000
         maxLifetimeMilliseconds: 1800000
         maxPoolSize: 50    
         
     # 2、分片规定
     shardingRule:
       tables: #表
         user: #逻辑表名
           actualDataNodes: hmmsdatasources-${0..1}.user #分表
           tableStrategy: #数据分表策越
             inline:
               shardingColumn: useid #分表字段
               algorithmExpression: user-${useid % 2} #对 useid 取模分表  
       defaultDatabaseStrategy: # 数据分库策略
         inline:
          shardingColumn: useid #分库字段
          algorithmExpression: hmmsdatasources-${useid % 2}  #对 Id 取模分库 productdatasources-0  
     ```

3. 分库分表

   - 配置

     ```
     # 3、创立客户端连贯库
     schemaName: hmms
     
     # 1、连贯 mysql
     dataSources:
       hmmsdatasources-0: #实在数据库 0
         url: jdbc:mysql://127.0.0.1:3306/hmms-0?serverTimezone=UTC&useSSL=false
         username: 用户名
         password: 明码 
         connectionTimeoutMilliseconds: 30000
         idleTimeoutMilliseconds: 60000
         maxLifetimeMilliseconds: 1800000
         maxPoolSize: 50
       hmmsdatasources-1: #实在数据库 1
         url: jdbc:mysql://127.0.0.1:3306/hmms-1?serverTimezone=UTC&useSSL=false
         username: 用户名
         password: 明码 
         connectionTimeoutMilliseconds: 30000
         idleTimeoutMilliseconds: 60000
         maxLifetimeMilliseconds: 1800000
         maxPoolSize: 50    
         
     # 2、分片规定
     shardingRule:
       tables: #表
         user: #逻辑表名
           actualDataNodes: hmmsdatasources-${0..1}.user-${0..1} #分表
           tableStrategy: #数据分表策越
             inline:
               shardingColumn: useid #分表字段
               algorithmExpression: user-${useid % 2} #对 useid 取模分表
       defaultDatabaseStrategy: # 数据分库策略
         inline:
          shardingColumn: useid #分库字段
          algorithmExpression: hmmsdatasources-${useid % 2}  #对 Id 取模分库 productdatasources-0  
     ```

四、ShardingSphere-Proxy 运行原理

  • 整体架构

总共 6 个阶段:

1、Database Adaptors:数据库的抉择

2、SQL Parser:解析 sql

3、SQL Router:sql 路由 去哪一个实在数据库执行

4、SQL Rewriter:sql 优化重写 外围 保障性能

5、SQL Executor Engine:执行 sql 语句 实在数据库获取后果

6、Result Merger:后果合并 从多个表获取后果

五、ShardingSphere_Proxy 分片原理

  • 分片的概念

    就是将数据分片到不同的表中。

  • 分片键

    分片键就是表中的字段。就是依据什么字段分片的。

  • 分片算法

    依据规定【分片算法】按分片键将数据分到不同的表中。

    • 取模算法

      • 缺点

        只能时数字类型

    • hash+ 取模

      • 如果分片键为字符类型,就用 hash+ 取模的形式进行分片。

        Math.abs(分片键.hashCode()%2)

正文完
 0