1. 程式人生 > 其它 >ShardingSphere-Proxy 4.1 分庫分表

ShardingSphere-Proxy 4.1 分庫分表

一、ShardingSphere-Proxy的核心概念

  • ShardingSphere-Proxy概念

    官方地址:https://shardingsphere.apache.org/index_zh.html

    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
            

            執行結果如圖:

          4. MySql 資料庫

            • 新建真實資料庫名稱

              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;
              

              如圖:

            • 新建 3307 虛擬資料庫連線

              如圖:

            • 刪除表

              刪除3306中hmms庫的user表,並在虛擬的資料庫中執行新建表的指令碼,執行結果如下:

              虛擬資料庫:

              真實資料庫

            • 新增資料

              虛擬資料庫中新增兩條資料,執行結果如下:

              真實資料庫 表一,執行結果如下:

              真實資料庫 表二,執行結果如下:

      2. 分庫

        • 配置

          # 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)