ShardingSphere-Proxy5搭建使用

圖圖e發表於2022-10-11

ShardingSphere-Proxy5搭建使用

Apache ShardingSphere下的一個產品,定位為透明化的資料庫代理端,與mycat類似,所有的分片都由其完成。

ShardingSphere-Proxy5下載安裝

官網提供三種安裝方式,這裡主要記錄兩種

二進位制包安裝

  1. 官網下載二進位制包apache-shardingsphere-5.2.0-shardingsphere-proxy-bin.tar.gz
  2. 下載MySQL驅動mysql-connector-java-8.0.22.jar(根據所使用的mysql下載對應版本)
  3. 將MySQl驅動放至shardingsphere-proxy解壓目錄中的ext-lib目錄
  4. 修改配置conf/server.yaml
    server.yaml是與shardingsphere-proxy服務相關的配置,這裡主要配置下許可權
rules:
 - !AUTHORITY
   users: # 配置連線shardingsphere-proxy的使用者
     - root@127.0.0.1:root
     - sharding@:sharding
   provider: # 授權模式
     type: ALL_PERMITTED # 不用授權,獲取所有許可權
  1. 啟動shardingsphere-proxy
# windows
# 指定埠號和配置檔案目錄, 預設埠為3307
bin/start.bat ${proxy_port} ${proxy_conf_directory}

出現以上資訊代表部署成功
6. 連線測試
連線方式與mysql差不多,可以用mysql命令列連線,也可以用navicat連線。

Docker 方式安裝

# 拉取映象
docker pull apache/shardingsphere-proxy

# 啟動臨時容器
docker run -d --name tmp --entrypoint=bash apache/shardingsphere-proxy:5.2.0

# 配置檔案複製
docker cp tmp:/opt/shardingsphere-proxy/conf /mnt/data/shardingsphere-proxy/
#刪除臨時容器
docker rm tmp

# 注意映象的擴張依賴需要放在ext-lib目錄,不能直接覆蓋lib目錄
docker run --name shardingsphere-proxy -d -v /mnt/data/shardingsphere-proxy/conf:/opt/shardingsphere-proxy/conf -v /mnt/data/shardingsphere-proxy/ext-lib:/opt/shardingsphere-proxy/ext-lib -e PORT=3307 -p 33307:3307 apache/shardingsphere-proxy:5.2.0

docker run --name shardingsphere-proxy -d -v /mnt/data/shardingsphere-proxy/conf:/opt/shardingsphere-proxy/conf -e PORT=3307 -p 33307:3307 apache/shardingsphere-proxy:5.2.0

ShardingSphere-Proxy5分庫分表

建立資料來源

修改config-sharding.yaml檔案新增資料來源配置

databaseName: sharding_db ##邏輯庫。配置多個邏輯庫時需要建立其他的配置檔案,並且配置檔案格式需為config-sharding***.yaml

dataSources: ## 資料來源,連線真實物理庫,注意物理庫必須有相應的庫存在,負責proxy無法啟動。
ds_0:
url: jdbc:mysql://127.0.0.1:13307/demo_ds_0?serverTimezone=UTC&useSSL=false
username: root
password: sunday
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
minPoolSize: 1
ds_1:
url: jdbc:mysql://127.0.0.1:3306/demo_ds_1?serverTimezone=UTC&useSSL=false
username: root
password: sunday
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
minPoolSize: 1

配置分片規則

繼續修改config-sharding.yaml檔案新增資料分片規則

databaseName: sharding_db

dataSources: ## 資料來源,連線真實物理庫,注意物理庫必須有相應的庫存在,負責proxy無法啟動。
ds_0:
url: jdbc:mysql://127.0.0.1:13307/demo_ds_0?serverTimezone=UTC&useSSL=false
username: root
password: sunday
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
minPoolSize: 1
ds_1:
url: jdbc:mysql://127.0.0.1:3306/demo_ds_1?serverTimezone=UTC&useSSL=false
username: root
password: sunday
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
minPoolSize: 1
## 分片規則配置
rules:
- !SHARDING
tables:
t_order: # 分片表
actualDataNodes: ds_${0..1}.t_order${0..1}
databaseStrategy: # 分庫規則
standard: # 標準型別分片,目前官方有四種分片型別
shardingColumn: user_id
shardingAlgorithmName: alg_mod # 演算法名稱
tableStrategy: # 分表規則
standard:
shardingColumn: order_no
shardingAlgorithmName: alg_hash_mod # 演算法名稱,具體使用哪一種演算法下面會根據演算法名稱配置
keyGenerateStrategy: # 主鍵生成規則
column: id
keyGeneratorName: snowflake
# bindingTables: # 繫結表。對於相同分片演算法的表,設定繫結,避免相互關聯時產生笛卡爾關聯
# broadcastTables: # 廣播表

keyGenerators: # 主鍵生成規則配置
snowflake:
type: SNOWFLAKE

shardingAlgorithms: # 分片演算法配置,根據上面的演算法名稱配置演算法的型別和演算法接收的引數
alg_mod:
type: MOD
props:
sharding-count: 2
alg_hash_mod:
type: HASH_MOD
props:
sharding-count: 2

配置完成後重啟proxy。

連線proxy建立分片表

配置分片表後,並沒有生成相應的分片表,需要連線上sharding-proxy,在proxy中執行建表語句,在建立邏輯表時分片表會被proxy自動按照配置的規則進行建立。

CREATE TABLE `t_order` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`order_no` varchar(30) DEFAULT NULL,
`user_id` bigint(20) DEFAULT NULL,
`amount` decimal(10,2) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=779468255126355969 DEFAULT CHARSET=utf8mb4;

插入測試資料

INSERT INTO `sharding_db`.`t_order`(`id`, `order_no`, `user_id`, `amount`) VALUES (779468213359476737, '22', 22, 22.00);
INSERT INTO `sharding_db`.`t_order`(`id`, `order_no`, `user_id`, `amount`) VALUES (779468285585391617, '44', 44, 44.00);
INSERT INTO `sharding_db`.`t_order`(`id`, `order_no`, `user_id`, `amount`) VALUES (779468168534949888, '11', 11, 11.00);
INSERT INTO `sharding_db`.`t_order`(`id`, `order_no`, `user_id`, `amount`) VALUES (779468255126355968, '33', 33, 33.00);

插入後,觀察物理庫的表資料儲存情況。

相關文章