一嗤瞎、ShardingSphere-Proxy的核心概念
-
ShardingSphere-Proxy概念
ShardingSphere-Proxy就是數(shù)據(jù)庫(kù)的代理嫉晶,如圖:
在這里插入圖片描述
-
ShardingSphere-Proxy主要代理哪些數(shù)據(jù)庫(kù)
默認(rèn)代理:Mysql慨灭、PostSql
-
實(shí)現(xiàn)代理的目的
主要是為了完成分庫(kù)分表
-
實(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
-
配置
-
分表
-
配置
-
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)名稱
-
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é)果如圖:

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;
```
如圖:

- 新建 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)
-
-