Spring Cloud 微服務(wù)系列之 ShardingSphere-Proxy 數(shù)據(jù)庫(kù)代理
1. 簡(jiǎn)介
ShardingSphere-Proxy是ShardingSphere分布式數(shù)據(jù)庫(kù)中間件的一部分,它提供了「數(shù)據(jù)庫(kù)代理」功能。通過(guò)引入ShardingSphere-Proxy,可以在無(wú)需改動(dòng)應(yīng)用程序代碼的情況下,實(shí)現(xiàn)分庫(kù)分表的數(shù)據(jù)庫(kù)分片、讀寫分離、邏輯表達(dá)式分片等功能。ShardingSphere-Proxy獨(dú)立運(yùn)行于應(yīng)用程序和數(shù)據(jù)庫(kù)之間,充當(dāng)數(shù)據(jù)庫(kù)的代理,自動(dòng)將請(qǐng)求路由至相應(yīng)的數(shù)據(jù)庫(kù)節(jié)點(diǎn)。
官網(wǎng)地址:https://shardingsphere.apache.org
2. 下載代理數(shù)據(jù)庫(kù)
官網(wǎng)下載(5.4.0版本):https://shardingsphere.apache.org/document/current/cn/downloads/
官網(wǎng)下載很慢,網(wǎng)盤下載(推薦):「apache-shardingsphere-5.4.0-shardingsphere-proxy-bin.tar.gz」來(lái)自UC網(wǎng)盤分享https://drive.uc.cn/s/cc1882af6a9a4
3. 配置MySQL驅(qū)動(dòng)
下載 mysql-connector-java-8.0.11.jar,并將其放入 ext-lib 或 lib 目錄下。
mysql-connector-java-8.0.11.jar包下載地址:來(lái)自UC網(wǎng)盤分享https://drive.uc.cn/s/f9b1c5d7c0f64
4. 配置 server.yaml
conf目錄下server.yaml配置文件,主要配置代理數(shù)據(jù)庫(kù)的用戶名、密碼、權(quán)限。
- 用戶名 root
- 密碼 123456
- 權(quán)限 ALL_PERMITTED
authority:
users:
- user: root
password: 123456
privilege:
type: ALL_PERMITTED
props:
max-connections-size-per-query: 1
kernel-executor-size: 16 # Infinite by default.
proxy-frontend-flush-threshold: 128 # The default value is 128.
sql-show: false
check-table-metadata-enabled: false
5. 配置 config-sharding.yaml
conf目錄下sconfig-sharding.yaml配置文件,主要配置具體的分庫(kù)分表規(guī)則:
- 代理數(shù)據(jù)庫(kù)名稱 sharding_db。
- 邏輯數(shù)據(jù)源 ds_0 指向 jdbc:mysql://127.0.0.1:3306/sharding_0。
- 邏輯數(shù)據(jù)源 ds_1 指向 jdbc:mysql://127.0.0.1:3306/sharding_1。
- company表的分片規(guī)則是id_inline,根據(jù)id取模。
- product表沒(méi)有配置分片規(guī)則,用默認(rèn)分配規(guī)則,根據(jù)company_id取模。
- permission表是廣播表,插入(更新)數(shù)據(jù)的時(shí)候每張表都會(huì)插入(更新),讀取的時(shí)候隨機(jī)一張表讀取。
- 取模算法ds_$->{id % 2} 偶數(shù)在ds_0,奇數(shù)在ds_1。
databaseName: sharding_db
dataSources:
ds_0:
url: jdbc:mysql://127.0.0.1:3306/sharding_0?serverTimezone=UTC&useSSL=false
username: root
password: "123456"
ds_1:
url: jdbc:mysql://127.0.0.1:3306/sharding_1?serverTimezone=UTC&useSSL=false
username: root
password: "123456"
rules:
- !SHARDING
tables:
company:
actualDataNodes: ds_$->{0..1}.company
databaseStrategy:
standard:
shardingColumn: id
shardingAlgorithmName: id_inline
product:
actualDataNodes: ds_$->{0..1}.product
defaultDatabaseStrategy:
standard:
shardingColumn: company_id
shardingAlgorithmName: database_inline
shardingAlgorithms:
database_inline:
type: INLINE
props:
algorithm-expression: ds_$->{company_id % 2}
id_inline:
type: INLINE
props:
algorithm-expression: ds_$->{id % 2}
- !BROADCAST
tables: # 廣播表規(guī)則列表
- permission
注意上面是url,而不是jdbcUrl,官方這么說(shuō)的:
圖片
否則啟動(dòng)代理數(shù)據(jù)庫(kù)會(huì)出現(xiàn)如下異常:
Unable to find property 'jdbcUrl' on class: org.apache.shardingsphere.proxy.backend.config.yaml.YamlProxyDataSourceConfiguration
6. 配置 config-readwrite-splitting.yaml
conf目錄下config-readwrite-splitting.yaml配置文件,主要配置數(shù)據(jù)庫(kù)的讀寫分離。
往write_ds數(shù)據(jù)庫(kù)寫數(shù)據(jù)的時(shí)候會(huì)自動(dòng)同步到read_ds_0、read_ds_1兩個(gè)庫(kù)中。讀取數(shù)據(jù)的時(shí)候會(huì)隨機(jī)從read_ds_0、read_ds_1選擇一個(gè)數(shù)據(jù)源進(jìn)行讀取。
databaseName: readwrite-splitting_db
dataSources:
write_ds:
url: jdbc:mysql://127.0.0.1:3306/demo_write_ds?serverTimeznotallow=UTC&useSSL=false
username: root
password: 123456
read_ds_0:
url: jdbc:mysql://127.0.0.1:3306/demo_read_ds_0?serverTimeznotallow=UTC&useSSL=false
username: root
password: 123456
read_ds_1:
url: jdbc:mysql://127.0.0.1:3306/demo_read_ds_1?serverTimeznotallow=UTC&useSSL=false
username: root
password: 123456
rules:
- !READWRITE_SPLITTING
dataSources:
readwrite_ds:
writeDataSourceName: write_ds
readDataSourceNames:
- read_ds_0
- read_ds_1
- 寫數(shù)據(jù)庫(kù):write_ds
- 讀數(shù)據(jù)庫(kù):read_ds_0、read_ds_1
7. 執(zhí)行sql腳本
創(chuàng)建sharding_0和sharding_1兩個(gè)數(shù)據(jù)庫(kù)。兩個(gè)數(shù)據(jù)庫(kù)完全一樣,包含如下數(shù)據(jù)表:
- company 企業(yè)表,根據(jù)id分庫(kù)
- product 商品表,根據(jù)企業(yè)idcompany_id分庫(kù)
- permission 權(quán)限表,廣播表不分庫(kù)
CREATE DATABASE sharding_0 CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE DATABASE sharding_1 CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE TABLE `company` (
`id` bigint(20) NOT NULL COMMENT '主鍵id',
`name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '名稱',
`create_time` datetime(0) NULL DEFAULT NULL COMMENT '創(chuàng)建時(shí)間',
`update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新時(shí)間',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
CREATE TABLE `permission` (
`id` bigint(20) NOT NULL COMMENT '主鍵id',
`name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '名稱',
`create_time` datetime(0) NULL DEFAULT NULL COMMENT '創(chuàng)建時(shí)間',
`update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新時(shí)間',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
CREATE TABLE `product` (
`id` bigint(20) NOT NULL COMMENT '主鍵id',
`company_id` bigint(20) NULL DEFAULT NULL COMMENT '公司id',
`name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '名稱',
`create_time` datetime(0) NULL DEFAULT NULL COMMENT '創(chuàng)建時(shí)間',
`update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新時(shí)間',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
8. 啟動(dòng)代理數(shù)據(jù)庫(kù)
在bin目錄下:
# mac/linux
sh start.sh 3307
# windows
start.bat 3307
- 指定數(shù)據(jù)庫(kù)端口 3307
啟動(dòng)日志位置:logs/skywalking-oap-server.log
9. 連接代理數(shù)據(jù)庫(kù)
代理數(shù)據(jù)庫(kù)對(duì)于開(kāi)發(fā)人員來(lái)說(shuō)與普通數(shù)據(jù)庫(kù)的操作無(wú)異,既可通過(guò)命令行,也可通過(guò)可視化工具來(lái)進(jìn)行連接和操作。
通過(guò)命令連接代理數(shù)據(jù)庫(kù):
mysql -h127.0.0.1 -P3307 -uroot -p123456
通過(guò)可視化工具連接代理數(shù)據(jù)庫(kù):
圖片
10. 分庫(kù)分表結(jié)果
1)company
在代理數(shù)據(jù)庫(kù)company表上添加企業(yè)數(shù)據(jù)記錄。
圖片
偶數(shù)id的企業(yè)在sharding_0數(shù)據(jù)庫(kù),奇數(shù)id企業(yè)在sharding_1數(shù)據(jù)庫(kù)。
圖片
圖片
2)product
在代理數(shù)據(jù)庫(kù)product表上添加商品數(shù)據(jù)記錄。
company_id為偶數(shù)的商品在sharding_0數(shù)據(jù)庫(kù),company_id為奇數(shù)的商品sharding_1數(shù)據(jù)庫(kù)。保證了一個(gè)企業(yè)的商品全部在一個(gè)庫(kù)里面。
圖片
圖片
3)permission
在代理數(shù)據(jù)庫(kù)permission表上添加權(quán)限數(shù)據(jù)記錄。
被代理的兩個(gè)數(shù)據(jù)庫(kù)的數(shù)據(jù)都一樣。
圖片
11. 總結(jié)
ShardingSphere-Proxy是在數(shù)據(jù)庫(kù)和應(yīng)用程序之間起到了一個(gè)橋梁的作用,對(duì)于應(yīng)用程序來(lái)說(shuō),它不需要感知ShardingSphere-Proxy的存在,依然可以使用原來(lái)的方式操作數(shù)據(jù)庫(kù)。也就是說(shuō),ShardingSphere-Proxy對(duì)于應(yīng)用程序來(lái)說(shuō)是透明的,不需要額外的代碼實(shí)現(xiàn)或者調(diào)整。
圖片
Spring Cloud 微服務(wù)系列 完整的代碼在倉(cāng)庫(kù)的sourcecode/spring-cloud-demo目錄下。
gitee(推薦):https://gitee.com/cunzaizhe/xiaohuge-blog
github:https://github.com/tigerleeli/xiaohuge-blog