ShardingSphere-Proxy分庫(kù)分表(一)

一、ShardingSphere-Proxy的核心概念

  • ShardingSphere-Proxy概念

    ShardingSphere-Proxy就是數(shù)據(jù)庫(kù)的代理,如圖:

    在這里插入圖片描述
  • ShardingSphere-Proxy主要代理哪些數(shù)據(jù)庫(kù)

    默認(rèn)代理:Mysql、PostSql

  • 實(shí)現(xiàn)代理的目的

    1. 主要是為了完成分庫(kù)分表

    2. 實(shí)現(xiàn)讀寫分離

      這兩個(gè)也是ShardingSphere-Proxy的兩大核心功能。

  • 分庫(kù)分表

    • 分庫(kù)的概念和目的

      • 概念

        數(shù)據(jù)庫(kù)中的表存儲(chǔ)到不同的數(shù)據(jù)庫(kù)中;如圖:

        在這里插入圖片描述
- 目的

  防止一個(gè)庫(kù)中多個(gè)表出現(xiàn)資源競(jìng)爭(zhēng)【CPU、內(nèi)存】,導(dǎo)致性能下降。
  • 分表的概念和目的

    • 概念

      將數(shù)據(jù)庫(kù)中一張表分成多張表,如圖:

      在這里插入圖片描述
- 目的

  分表是解決表中數(shù)據(jù)量過(guò)大,提升用戶查詢和添加數(shù)據(jù)的性能。

  比如:以mysql數(shù)據(jù)庫(kù)為例,當(dāng)用戶添加數(shù)據(jù)會(huì)通過(guò)mysql的InnoDB引擎存儲(chǔ)到數(shù)據(jù)中,InnoDB引擎要想保證數(shù)據(jù)的性能在一定的范圍之內(nèi),表中的數(shù)據(jù)量最大的峰值為2000w,如果超過(guò)2000W那么添加數(shù)據(jù)的性能會(huì)下降,所以我們要將超過(guò)2000W數(shù)據(jù)量的表拆分成多個(gè)表,這樣才能保證用戶的體驗(yàn)度。

- 缺陷

  1. 并發(fā)量過(guò)大,表會(huì)出現(xiàn)資源競(jìng)爭(zhēng)[CPU、內(nèi)存]的問(wèn)題,這樣導(dǎo)致性能下降,用戶的體驗(yàn)度變差。

     解決方案:分庫(kù)
  • 分庫(kù)分表

    • 目的

      解決表資源競(jìng)爭(zhēng)和數(shù)據(jù)量過(guò)大的問(wèn)題。

二、ShardingSphere-Proxy的應(yīng)用場(chǎng)景

  • 場(chǎng)景

    單體項(xiàng)目和微服務(wù)項(xiàng)目都能用到分庫(kù)分表。

三、ShardingSphere-Proxy分布分表落地

  • 工具

    ShardingSphere-Proxy

  • 方案

    • 進(jìn)程內(nèi)

      如圖:

      在這里插入圖片描述
- 缺陷
  1. 資源競(jìng)爭(zhēng)問(wèn)題。
  2. 異常影響問(wèn)題。
  • 進(jìn)程外 【推薦】

    如圖:

    在這里插入圖片描述
- 缺陷
  1. 維護(hù)量大的問(wèn)題。
  2. 性能相對(duì)進(jìn)程內(nèi)弱一些。
     - 可以放在內(nèi)網(wǎng)中進(jìn)行通信【docker】
  • 實(shí)現(xiàn)

    • 條件

      • Mysql數(shù)據(jù)庫(kù) 版本:5.7

      • ShardingSphere-Proxy

        • 網(wǎng)盤下載地址

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

        • 網(wǎng)盤下載地址

          鏈接:https://pan.baidu.com/s/1A-ksNN0YicT3hXjFscGGwA 
          提取碼:r9e0
          
      • 下載Mysql的連接驅(qū)動(dòng) 文件放到根目錄 lab文件夾下

        網(wǎng)盤下載地址:

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

      1. 分表

        • 配置

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

            # 3、創(chuàng)建客戶端連接庫(kù)  hmms:虛擬的數(shù)據(jù)庫(kù)名稱【最好和真實(shí)的數(shù)據(jù)庫(kù)名稱一樣】 在server.yaml命名
            schemaName: hmms
            
            # 1、連接mysql
            dataSources:
              hmmsdatasources-0:  #節(jié)點(diǎn)名稱  自定義
                url: jdbc:mysql://127.0.0.1:3306/真實(shí)數(shù)據(jù)庫(kù)名稱?serverTimezone=UTC&useSSL=false
                username: 數(shù)據(jù)庫(kù)用戶名
                password: 數(shù)據(jù)庫(kù)密碼 
                connectionTimeoutMilliseconds: 30000
                idleTimeoutMilliseconds: 60000
                maxLifetimeMilliseconds: 1800000
                maxPoolSize: 50
                
            # 2、分片規(guī)則
            shardingRule:
              tables: #表
                user: #邏輯表名  要對(duì)哪個(gè)表進(jìn)行分表
                  actualDataNodes: hmmsdatasources-0.user-${0..1} #分幾張表   這個(gè)是兩個(gè)表   #hmmsdatasources-0:節(jié)點(diǎn)名稱  
                  tableStrategy: #數(shù)據(jù)分表策越
                    inline:
                      shardingColumn: useid #分表字段
                      algorithmExpression: user-${useid % 2} #對(duì)useid取模分表  
                 #創(chuàng)建多個(gè)表
                #表名: #邏輯表名  要對(duì)哪個(gè)表進(jìn)行分表
                  #actualDataNodes: hmmsdatasources-0.表名-${0..1} #分幾張表   這個(gè)是兩個(gè)表   #hmmsdatasources-0:節(jié)點(diǎn)名稱  
            
          2. server.yaml

            authentication:
              users:
                root: #數(shù)據(jù)庫(kù)用戶名
                  password: 數(shù)據(jù)密碼
                sharding:
                  password: sharding 
                  authorizedSchemas: hmms
            
     3. ShardingSpere-Proxy

        運(yùn)行命令

        ```
        #根目錄bin文件下執(zhí)行命令
         start.bat
        ```

        運(yùn)行結(jié)果如圖:

        ![在這里插入圖片描述](https://upload-images.jianshu.io/upload_images/26842682-020b211682ded1ef?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


     4. MySql 數(shù)據(jù)庫(kù)

        - 新建真實(shí)數(shù)據(jù)庫(kù)名稱

          ```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 '用戶手機(jī)',
            `createbyid` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '添加人',
            `createbytime` datetime(0) NULL DEFAULT NULL COMMENT '添加時(shí)間',
            `modifybyid` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '修改人',
            `modifybytime` datetime(0) NULL DEFAULT NULL COMMENT '修改時(shí)間',
            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 虛擬數(shù)據(jù)庫(kù)連接

          如圖:

          [圖片上傳失敗...(image-da02d8-1647478387906)]


          

        - 刪除表

          刪除3306中hmms庫(kù)的user表,并在虛擬的數(shù)據(jù)庫(kù)中執(zhí)行新建表的腳本,運(yùn)行結(jié)果如下:

          虛擬數(shù)據(jù)庫(kù):

          [圖片上傳失敗...(image-4d052f-1647478387906)]


          真實(shí)數(shù)據(jù)庫(kù)

          [圖片上傳失敗...(image-acb906-1647478387907)]


        - 添加數(shù)據(jù)

          虛擬數(shù)據(jù)庫(kù)中添加兩條數(shù)據(jù),運(yùn)行結(jié)果如下:

          [圖片上傳失敗...(image-ad7f24-1647478387907)]


          真實(shí)數(shù)據(jù)庫(kù) 表一,運(yùn)行結(jié)果如下:

          [圖片上傳失敗...(image-72c088-1647478387907)]


          真實(shí)數(shù)據(jù)庫(kù) 表二,運(yùn)行結(jié)果如下:

          [圖片上傳失敗...(image-8e4e6a-1647478387907)]


2. 分庫(kù)

   - 配置

     ```yaml
     # 3、創(chuàng)建客戶端連接庫(kù)
     schemaName: hmms
     
     # 1、連接mysql
     dataSources:
       hmmsdatasources-0: #真實(shí)數(shù)據(jù)庫(kù)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: #真實(shí)數(shù)據(jù)庫(kù)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、分片規(guī)則
     shardingRule:
       tables: #表
         user: #邏輯表名
           actualDataNodes: hmmsdatasources-${0..1}.user #分表
           tableStrategy: #數(shù)據(jù)分表策越
             inline:
               shardingColumn: useid #分表字段
               algorithmExpression: user-${useid % 2} #對(duì)useid取模分表  
       defaultDatabaseStrategy: # 數(shù)據(jù)分庫(kù)策略
         inline:
          shardingColumn: useid #分庫(kù)字段
          algorithmExpression: hmmsdatasources-${useid % 2}  #對(duì)Id取模分庫(kù)productdatasources-0  
     ```

3. 分庫(kù)分表

   - 配置

     ```
     # 3、創(chuàng)建客戶端連接庫(kù)
     schemaName: hmms
     
     # 1、連接mysql
     dataSources:
       hmmsdatasources-0: #真實(shí)數(shù)據(jù)庫(kù)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: #真實(shí)數(shù)據(jù)庫(kù)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、分片規(guī)則
     shardingRule:
       tables: #表
         user: #邏輯表名
           actualDataNodes: hmmsdatasources-${0..1}.user-${0..1} #分表
           tableStrategy: #數(shù)據(jù)分表策越
             inline:
               shardingColumn: useid #分表字段
               algorithmExpression: user-${useid % 2} #對(duì)useid取模分表
       defaultDatabaseStrategy: # 數(shù)據(jù)分庫(kù)策略
         inline:
          shardingColumn: useid #分庫(kù)字段
          algorithmExpression: hmmsdatasources-${useid % 2}  #對(duì)Id取模分庫(kù)productdatasources-0  
     ```

四、ShardingSphere-Proxy運(yùn)行原理

  • 整體架構(gòu)

    在這里插入圖片描述

總共6個(gè)階段:

1、Database Adaptors:數(shù)據(jù)庫(kù)的選擇

2、SQL Parser:解析sql

3、SQL Router:sql路由 去哪一個(gè)真實(shí)數(shù)據(jù)庫(kù)執(zhí)行

4、SQL Rewriter:sql優(yōu)化重寫 核心 保證性能

5、SQL Executor Engine:執(zhí)行sql語(yǔ)句 真實(shí)數(shù)據(jù)庫(kù)獲取結(jié)果

6、Result Merger:結(jié)果合并 從多個(gè)表獲取結(jié)果

五、ShardingSphere_Proxy 分片原理

  • 分片的概念

    就是將數(shù)據(jù)分片到不同的表中。

  • 分片鍵

    分片鍵就是表中的字段。就是根據(jù)什么字段分片的。

  • 分片算法

    根據(jù)規(guī)則【分片算法】按分片鍵將數(shù)據(jù)分到不同的表中。

    • 取模算法

      • 缺陷

        只能時(shí)數(shù)字類型

    • hash+取模

      • 如果分片鍵為字符類型,就用hash+取模的方式進(jìn)行分片。

        Math.abs(分片鍵.hashCode()%2)
        
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容