ShardingSphere-Proxy分库分表(一)

一、ShardingSphere-Proxy的核心概念

  • ShardingSphere-Proxy概念

    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://upload-images.jianshu.io/upload_images/26842682-020b211682ded1ef?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


     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://upload-images.jianshu.io/upload_images/26842682-ef5e0f2b745cdf0a?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


        - 新建 3307 虚拟数据库连接

          如图:

          [图片上传失败...(image-da02d8-1647478387906)]


          

        - 删除表

          删除3306中hmms库的user表,并在虚拟的数据库中执行新建表的脚本,运行结果如下:

          虚拟数据库:

          [图片上传失败...(image-4d052f-1647478387906)]


          真实数据库

          [图片上传失败...(image-acb906-1647478387907)]


        - 添加数据

          虚拟数据库中添加两条数据,运行结果如下:

          [图片上传失败...(image-ad7f24-1647478387907)]


          真实数据库 表一,运行结果如下:

          [图片上传失败...(image-72c088-1647478387907)]


          真实数据库 表二,运行结果如下:

          [图片上传失败...(image-8e4e6a-1647478387907)]


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)
        
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,658评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,482评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,213评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,395评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,487评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,523评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,525评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,300评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,753评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,048评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,223评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,905评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,541评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,168评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,417评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,094评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,088评论 2 352

推荐阅读更多精彩内容