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ù)量過大吗伤,提升用戶查詢和添加數(shù)據(jù)的性能。

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

- 缺陷

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

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

    • 目的

      解決表資源競(jìng)爭(zhēng)和數(shù)據(jù)量過大的問題南片。

二掺涛、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)問題薪缆。
  2. 異常影響問題。
  • 進(jìn)程外 【推薦】

    如圖:

    在這里插入圖片描述
- 缺陷
  1. 維護(hù)量大的問題伞广。
  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語句 真實(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)系作者
  • 序言:七十年代末透绩,一起剝皮案震驚了整個(gè)濱河市翘骂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌帚豪,老刑警劉巖碳竟,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異狸臣,居然都是意外死亡莹桅,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門烛亦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诈泼,“玉大人,你說我怎么就攤上這事此洲〕Ш梗” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵呜师,是天一觀的道長(zhǎng)娶桦。 經(jīng)常有香客問我,道長(zhǎng)汁汗,這世上最難降的妖魔是什么衷畦? 我笑而不...
    開封第一講書人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮知牌,結(jié)果婚禮上祈争,老公的妹妹穿的比我還像新娘。我一直安慰自己角寸,他們只是感情好菩混,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開白布忿墅。 她就那樣靜靜地躺著,像睡著了一般沮峡。 火紅的嫁衣襯著肌膚如雪疚脐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評(píng)論 1 312
  • 那天邢疙,我揣著相機(jī)與錄音棍弄,去河邊找鬼。 笑死疟游,一個(gè)胖子當(dāng)著我的面吹牛呼畸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播颁虐,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼蛮原,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了聪廉?” 一聲冷哼從身側(cè)響起瞬痘,我...
    開封第一講書人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎板熊,沒想到半個(gè)月后框全,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡干签,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年津辩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片容劳。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡喘沿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出竭贩,到底是詐尸還是另有隱情蚜印,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布留量,位于F島的核電站窄赋,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏楼熄。R本人自食惡果不足惜忆绰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望可岂。 院中可真熱鬧错敢,春花似錦、人聲如沸缕粹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至峰锁,卻和暖如春萎馅,著一層夾襖步出監(jiān)牢的瞬間双戳,已是汗流浹背虹蒋。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留飒货,地道東北人魄衅。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像塘辅,于是被迫代替她去往敵國(guó)和親晃虫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容