ShardingSphere-Proxy 4.1 分庫分表
一、ShardingSphere-Proxy的核心概念
-
ShardingSphere-Proxy概念
官方地址:https://shardingsphere.apache.org/index_zh.html
ShardingSphere-Proxy就是資料庫的代理,如圖:
-
ShardingSphere-Proxy主要代理哪些資料庫
預設代理:Mysql、PostSql
-
實現代理的目的
-
主要是為了完成分庫分表
-
實現讀寫分離
這兩個也是ShardingSphere-Proxy的兩大核心功能。
-
-
分庫分表
-
分庫的概念和目的
-
概念
資料庫中的表儲存到不同的資料庫中;如圖:
-
目的
防止一個庫中多個表出現資源競爭【CPU、記憶體】,導致效能下降。
-
-
分表的概念和目的
-
概念
將資料庫中一張表分成多張表,如圖:
-
目的
分表是解決表中資料量過大,提升使用者查詢和新增資料的效能。
比如:以mysql資料庫為例,當用戶新增資料會通過mysql的InnoDB引擎儲存到資料中,InnoDB引擎要想保證資料的效能在一定的範圍之內,表中的資料量最大的峰值為2000w,如果超過2000W那麼新增資料的效能會下降,所以我們要將超過2000W資料量的表拆分成多個表,這樣才能保證使用者的體驗度。
-
缺陷
-
併發量過大,表會出現資源競爭[CPU、記憶體]的問題,這樣導致效能下降,使用者的體驗度變差。
解決方案:分庫
-
-
-
-
分庫分表
-
目的
解決表資源競爭和資料量過大的問題。
-
二、ShardingSphere-Proxy的應用場景
-
場景
單體專案和微服務專案都能用到分庫分表。
三、ShardingSphere-Proxy分佈分表落地
-
工具
ShardingSphere-Proxy
-
方案
-
程序內
如圖:
- 缺陷
- 資源競爭問題。
- 異常影響問題。
- 缺陷
-
程序外 【推薦】
如圖:
- 缺陷
- 維護量大的問題。
- 效能相對程序內弱一些。
- 可以放在內網中進行通訊【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
-
-
配置
-
分表
-
配置
-
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:節點名稱
-
server.yaml
authentication: users: root: #資料庫使用者名稱 password: 資料密碼 sharding: password: sharding authorizedSchemas: hmms
-
ShardingSpere-Proxy
執行命令
#根目錄bin檔案下執行命令 start.bat
執行結果如圖:
-
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表,並在虛擬的資料庫中執行新建表的指令碼,執行結果如下:
虛擬資料庫:
真實資料庫
-
新增資料
虛擬資料庫中新增兩條資料,執行結果如下:
真實資料庫 表一,執行結果如下:
真實資料庫 表二,執行結果如下:
-
-
-
-
分庫
-
配置
# 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、建立客戶端連線庫 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)
-
-