目錄
一. 在Docker中安裝ShardingSphere
二 實踐:讀寫分離
2.1 應用場景
2.2 架構圖
2.3 服務器規劃
2.4 啟動數據庫服務器
2.5. 配置讀寫分離
2.6 日志配置
2.7 重啟ShardingSphere
2.8 測試
2.9. 負載均衡
2.9.1.?隨機負載均衡算法示例
2.9.2.?輪詢負載均衡算法示例
2.9.3. 權重負載均衡算法示例
2.10 手動事務
一. 在Docker中安裝ShardingSphere
?接下來我將講解ShardingSphere在Docker里面的安裝
創建Docker容器所需的映射目錄
我們必須提前進行創建
mkdir -p /bit/shardingsphere/proxy/conf
mkdir -p /bit/shardingsphere/proxy/ext-lib
mkdir -p /bit/shardingsphere/proxy/logs
?
創建Docker容器
這個 docker run
命令是用來安裝并啟動一個 ShardingSphere-Proxy 容器的。ShardingSphere-Proxy 是一個透明的數據庫代理,它允許你像連接普通 MySQL 服務器一樣連接它,但它背后可以管理多個數據庫實例,實現分庫分表、讀寫分離等高級功能。?
docker run -d \-p 3307:3307 \-v /bit/shardingsphere/proxy/conf:/opt/shardingsphere-proxy/conf \-v /bit/shardingsphere/proxy/ext-lib:/opt/shardingsphere-proxy/ext-lib \-v /bit/shardingsphere/proxy/logs:/opt/shardingsphere-proxy/logs \-e JVM_OPTS="-Xms256m -Xmx256m -Xmn128m" \--name ss-proxy \apache/shardingsphere-proxy:5.3.2
這些參數啥意思呢? 我們看看
docker run -d \
docker run
:Docker 命令,用于創建并啟動一個新的容器。-d
:表示以后臺(detached)模式運行容器。容器啟動后,命令行會立即返回,不會阻塞。
-p 3307:3307 \
-p
:用于映射端口。3307:3307
:將宿主機(Host)的?3307
?端口映射到容器(Container)內部的?3307
?端口。這意味著,外部應用程序(如你的應用代碼、MySQL 客戶端工具)需要連接宿主機的?3307
?端口來訪問 ShardingSphere-Proxy 服務。
-v /bit/shardingsphere/proxy/conf:/opt/shardingsphere-proxy/conf \
-v
:用于創建數據卷(Volume),實現宿主機目錄與容器目錄的綁定(掛載)。/bit/shardingsphere/proxy/conf:/opt/shardingsphere-proxy/conf
:將宿主機上的?/bit/shardingsphere/proxy/conf
?目錄掛載到容器內的?/opt/shardingsphere-proxy/conf
?目錄。這個目錄通常存放 ShardingSphere-Proxy 的核心配置文件,如?server.yaml
(服務配置)和?config-xxx.yaml
(數據分片/讀寫分離規則配置)。通過掛載,你可以在宿主機上直接修改配置文件,而無需進入容器內部,修改后重啟容器即可生效。
-v /bit/shardingsphere/proxy/ext-lib:/opt/shardingsphere-proxy/ext-lib \
/bit/shardingsphere/proxy/ext-lib:/opt/shardingsphere-proxy/ext-lib
:將宿主機上的?/bit/shardingsphere/proxy/ext-lib
?目錄掛載到容器內的?/opt/shardingsphere-proxy/ext-lib
?目錄。這個目錄用于存放用戶自定義的 JAR 包,例如:- 數據庫驅動(如果官方鏡像里沒有你需要的數據庫驅動,如 Oracle)。
- 自定義的分片算法類。
- 自定義的加密算法類。
- 自定義的分布式序列生成器。
-v /bit/shardingsphere/proxy/logs:/opt/shardingsphere-proxy/logs \
/bit/shardingsphere/proxy/logs:/opt/shardingsphere-proxy/logs
:將宿主機上的?/bit/shardingsphere/proxy/logs
?目錄掛載到容器內的?/opt/shardingsphere-proxy/logs
?目錄。ShardingSphere-Proxy 的運行日志(如?shardingsphere.log
)會輸出到這個目錄。掛載后,你可以在宿主機上方便地查看和管理日志文件,即使容器被刪除,日志也保留在宿主機上。
-e JVM_OPTS="-Xms256m -Xmx256m -Xmn128m" \
-e
:用于設置環境變量(Environment Variable)。JVM_OPTS="-Xms256m -Xmx256m -Xmn128m"
:將環境變量?JVM_OPTS
?的值設置為指定的 JVM 內存參數。當 ShardingSphere-Proxy 啟動時,會讀取這個環境變量,并將其作為 JVM 的啟動參數,從而控制其內存使用。
--name ss-proxy \
--name
:為啟動的容器指定一個名稱。ss-proxy
:這個容器的名稱被設置為?ss-proxy
。之后你可以使用?docker stop ss-proxy
,?docker start ss-proxy
,?docker logs ss-proxy
?等命令來管理這個容器,比使用容器的 ID 更方便。
apache/shardingsphere-proxy:5.3.2
apache/shardingsphere-proxy:5.3.2
:這是要運行的 Docker 鏡像的名稱和標簽。apache/shardingsphere-proxy
?是鏡像的名稱。5.3.2
?是鏡像的版本標簽(Tag)。Docker 會首先檢查本地是否有這個鏡像,如果沒有,會自動從 Docker Hub(或其他配置的鏡像倉庫)拉取這個版本的鏡像,然后使用它來創建并啟動容器。
廢話不多說,我們直接執行就OK。
然后我們來看看有沒有啟動成功啊?
# 查看是否啟動成功
docker ps -a
?我們發現沒有啟動成功,這個是因為docker容器沒有進行配置
修改配置文件
首先我們需要來到這個配置文件對應的?宿主機映射目錄里面,也就是/bit/shardingsphere/proxy/conf
cd ?/bit/shardingsphere/proxy/conf
我們就在這個目錄里面創建一個配置文件server.yaml
vim server.yaml
然后把下面這個粘貼進去即可?
# 運行模式配置
mode:type: Standalone # 單機模式(非集群部署)# 用戶權限配置
authority:users:- user: root@% # 用戶名格式:用戶名@訪問主機(%表示允許任意主機訪問)password: 123456 # 用戶密碼privilege:type: ALL_PERMITTED # 權限類型:授予該用戶所有操作權限# 系統屬性配置
props:sql-show: true # 是否在日志中顯示執行的SQL語句(true=顯示,false=隱藏)proxy-mysql-default-version: 8.0.42 # 代理對外暴露的MySQL默認版本號
?
我們保存退出。
上傳MySQL驅動
連接MySQL數據庫時,需要把MySQL驅動包放入宿主機映射擴展目錄/bit/shardingsphere/proxy/ext-lib中
cd /bit/shardingsphere/proxy/ext-lib
現在我們可以上一小節下載的?MySQL驅動驅動直接復制到這里即可。
當然,大家執行下面這個命令也是可以的
wget https://repo1.maven.org/maven2/com/mysql/mysql-connector-j/8.0.33/mysql-connector-j-8.0.33.jar
啟動
啟動Docker容器,運行ShardingSphere
# 重新啟動容器
docker start ss-proxy
# 查看狀態,啟動成功
docker ps
?
沒有一點問題
測試連接
通過客戶端工具連接
# 指定主機和端口號進行連接,成功
mysql -uroot -p -h127.0.0.1 -P3307
進入Docker容器
# 進入容器
docker exec -it ss-proxy env LANG=C.UTF-8 /bin/bash
?如果我們想要遠程登陸這個服務器的話,需要去云服務器里面的防火墻和安全組里面開放這個3307端口。
二 實踐:讀寫分離
2.1 應用場景
????????當系統負載越來越大時,I/O作為整個系統的性能瓶頸就越來越明顯,大量的數據庫訪問可能會把某個數據節點打爆(尤其是在單臺數據庫服務器的情況下),通過部署讀寫分離可以有效的解決單點故障問題并提升系統性能。
有以下需求時可以使用讀寫分離架構部署數據庫服務:
- 讀多寫少的場景:很多的應用程序都是讀多寫少的場景,讀寫分離可以將讀請求分散到多個從服務器上,從而減輕主服務器的負擔,顯著提高讀操作的性能。
- 水平擴展:通過增加從服務器的數量,可以進一步擴展數據庫的讀能力,以應對不斷增長的負載。
- 故障轉移:在主服務器發生故障時,可以快速將讀和寫操作切換到從服務器,保證服務的可用性。
- 實時備份:從服務器也可以作為主服務器的實時備份節點,當主服務器發生故障時,可以快速恢復數據。
2.2 架構圖
采用一主兩從的數據庫集群架構
2.3 服務器規劃
在單臺服務器上使用 Docker 模擬多臺服務器的場景 ?
主從服務器IP一致,端口號不同 ?
- 主服務器:容器名 bit-mysql-master 端口號 53306
- 從服務器1:容器名 bit-mysql-slavel,端口號 53307
- 從服務器2:容器名 bit-mysql-slave2,端口號 53308
我們已經在先前的文章里面實現了兩個從節點對主節點的數據的實時復制,也就是所謂的主從復制,但是我們還沒有實現讀寫分離,那么我們今天的讀寫分離主要是針對中間件——ShardingSphere-Proxy,我們通過配置ShardingSphere-Proxy即可在原來主從復制的基礎之上完成讀寫分離。
注意:啟動docker前先關閉防火墻
sudo systemctl status ufw
2.4 啟動數據庫服務器
注意:這里的主從復制配置我們已經完成,我們這里只檢驗一下主從復制機制是否正常運行而已,主從復制具體配置步驟請看:【 MySQL集群架構與實踐2】高性能架構模式,ShardingSphere的安裝-CSDN博客
首先啟動主從節點的數據庫服務器,保證主從節點正常工作.
具體怎么做呢?
先看看這些節點有沒有在運行
docker ps
?很好,都在運行,那么我們直接使用mysql去進行登陸即可
#登陸主節點
mysql -h127.0.0.1 -P53306 -uroot -p#登陸從節點1
mysql -h127.0.0.1 -P53307 -uroot -p#登陸從節點2
mysql -h127.0.0.1 -P53308 -uroot -p
?
?
這個時候我們需要檢測一下主從復制機制還有沒有在生效?
首先我們需要查看兩個從節點的信息
?
我們在主節點執行一下DML語句
我們接著回去兩個從節點看看有沒有在進行同步復制
答案很明顯了啊!!!我們的主從復制是沒有問題的啊,下面我們就來進行配置讀寫分離
2.5. 配置讀寫分離
首先我們需要來到這個配置文件對應的?宿主機映射目錄里面,也就是/bit/shardingsphere/proxy/conf
cd /bit/shardingsphere/proxy/conf
接下來我們將創建一個文件?config-readwrite-splitting.yaml
vim config-readwrite-splitting.yaml
?config-readwrite-splitting.yaml 在 ShardingSphere Proxy 中的作用是:定義讀寫分離規則,將數據庫操作智能路由到主庫(寫操作)和從庫(讀操作),實現數據庫負載均衡和高可用。?
那這里面具體要填放什么東西呢??
我們去看看我們使用二進制發布包安裝的 ShardingSphere Proxy里面的conf目錄看看,那里也有一個config-readwrite-splitting.yaml,這個文件是系統提供給我們的模板,這個文件默認里面全是注釋,我們只需要在它的基礎之上進行修改即可。
在config-readwrite-splitting.yaml里面官方其實已經就幫我們寫了一些模板,只不過默認是被注釋掉了,我們只需要進去修改database-readwrite-splitting.yaml
?配置文件即可
大家找到上面這個啊,那就是我們的模板啊。我們只需在這個模板上面做些修改即可。?
databaseName: bit_proxy_dbdataSources:write_ds:url: jdbc:mysql://150.158.139.86:53306/bit_db?characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&useSSL=falseusername: rootpassword: 123456connectionTimeoutMilliseconds: 30000idleTimeoutMilliseconds: 60000maxLifetimeMilliseconds: 1800000maxPoolSize: 50minPoolSize: 1read_ds_0:url: jdbc:mysql://150.158.139.86:53307/bit_db?characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&useSSL=falseusername: rootpassword: 123456connectionTimeoutMilliseconds: 30000idleTimeoutMilliseconds: 60000maxLifetimeMilliseconds: 1800000maxPoolSize: 50minPoolSize: 1read_ds_1:url: jdbc:mysql://150.158.139.86:53308/bit_db?characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&useSSL=falseusername: rootpassword: 123456connectionTimeoutMilliseconds: 30000rules:
- !READWRITE_SPLITTINGdataSources:readwrite_ds:staticStrategy:writeDataSourceName: write_dsreadDataSourceNames:- read_ds_0- read_ds_1# loadBalancerName: weight # 負載均衡策略名 以下分別是:權重,輪詢,隨機# loadBalancerName: round_robinloadBalancerName: randomloadBalancers:random:type: RANDOMround_robin:type: ROUND_ROBINweight:type: WEIGHTprops:read_ds_0: 2.0read_ds_1: 1.0
注意:這里特別容易出問題,所以我推薦大家去官網使用官方的配置:shardingsphere/examples/shardingsphere-proxy-example/shardingsphere-proxy-boot-mybatis-example/src/main/resources/conf/config-readwrite-splitting.yaml at 5.3.2 · apache/shardingsphere · GitHub?
url中最重要的是IP地址,端口號,數據庫名?
?我們保存退出。
我們這里就是配置數據源的問題,讓ShardingSphere知道哪個是主節點,哪個是從節點。
2.6 日志配置
首先我們需要來到這個配置文件對應的?宿主機映射目錄里面,也就是/bit/shardingsphere/proxy/conf
cd /bit/shardingsphere/proxy/conf
接下來我們將創建一個文件
vim logback.xml
并編寫以下內容
<?xml version="1.0"?>
<configuration><!-- 日志輸入到文件 --><appender name="SHARDING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 日志路徑 --><file>./logs/shardingsphere.log</file><encoder><!-- 日志輸入的樣式 --><pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>shardingsphere.%d{yyyy-MM-dd}.%i.log</fileNamePattern><timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><maxFileSize>100MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy></rollingPolicy></appender><root level="INFO"><appender-ref ref="SHARDING_FILE" /></root></configuration>
?
我們保存退出一下 。
2.7 重啟ShardingSphere
# 重新啟動ShardingSphere的Docker容器
docker restart ss-proxy# 查看容器是否啟動成功
docker ps
# 使用客戶端連接ShardingSphere
mysql -h150.158.139.86 -P3307 -uroot -p
我們可以進去看看
我們看看里面的內容
2.8 測試
我們可以去宿主機映射的目錄/bit/shardingsphere/proxy/logs打開實時日志
# 進入容器
cd /bit/shardingsphere/proxy/logs# 查看ShardingSphere的實時日志
tail -f shardingsphere.log
?
刪除數據?
日志里面就多了下面
[INFO ] 2025-07-31 02:54:23.319 [ShardingSphere-Command-1] INFO ?ShardingSphere-SQL - Logic SQL: delete from t_user where id=4
[INFO ] 2025-07-31 02:54:23.321 [ShardingSphere-Command-1] INFO ?ShardingSphere-SQL - Actual SQL: write_ds ::: delete from t_user where id=4
這就說明刪除操作是在主節點進行操作的
寫入數據
執行INSERT語句寫入一條數據
-- 客戶端執行INSERT語句,寫入一和數據
insert into t_user (name) values ('test');
日志中顯示如下信息:
[INFO ] 2025-07-31 02:56:17.640 [ShardingSphere-Command-2] INFO ?ShardingSphere-SQL - Logic SQL: insert into t_user (name) values ('test')
[INFO ] 2025-07-31 02:56:17.640 [ShardingSphere-Command-2] INFO ?ShardingSphere-SQL - Actual SQL: write_ds ::: insert into t_user (name) values ('test')
補充一下:
- Logic SQL是客戶端發來的語句
- Actual SQL是ShardingSphere根據配置的規則發送到某一個具體的節點上執行的語句
這就說明insert是在主節點進行操作的
查詢數據
多次執行SELECT語句進行查詢
-- 執行兩次
select * from t_user;select * from t_user;
在日志中顯示如下信息:
# 第一次查詢
[INFO ] 2025-07-31 02:59:23.958 [ShardingSphere-Command-3] INFO ?ShardingSphere-SQL - Logic SQL: select * from t_user
[INFO ] 2025-07-31 02:59:23.958 [ShardingSphere-Command-3] INFO ?ShardingSphere-SQL - Actual SQL: read_ds_0 ::: select * from t_user
# 第二次查詢
[INFO ] 2025-07-31 02:59:26.853 [ShardingSphere-Command-3] INFO ?ShardingSphere-SQL - Logic SQL: select * from t_user
[INFO ] 2025-07-31 02:59:26.854 [ShardingSphere-Command-3] INFO ?ShardingSphere-SQL - Actual SQL: read_ds_1 ::: select * from t_user
這就說明select是在兩個從節點進行操作的
現在就說明,我們的讀寫分離已經完成了。
2.9. 負載均衡
ShardingSphere 內置提供了多種負載均衡算法,具體包括輪詢算法、隨機訪問算法和權重訪問算法,能夠滿足用戶絕大多數業務場景的需要.
輪詢負載均衡算法類型:ROUND_ROBIN
根據請求次數和服務器數量進行負載均衡。
隨機負載均衡算法類型:RANDOM
請求具體發送到哪個真實的服務器不確定,完全隨機,負載不易控制。
這個其實是不會使用的。?
權重負載均衡算法類型:WEIGHT
不同的服務器配置不同的權重,權重大的負載高,可以根據服務器的硬件指定合適的權重。
權重負載均衡算法可配置屬性:
屬性名稱 | 數據類型 | 說明 |
---|---|---|
${replica-name} | double | 屬性名使用讀庫名稱,參數填寫讀庫對應的權重值。權重≥0,合計≤Double.MAX_VALUE |
config-readwrite-splitting.yaml的部分配置示例:
rules:
- !READWRITE_SPLITTING # 聲明讀寫分離規則dataSources:readwrite_ds: # 讀寫分離數據源名稱staticStrategy: # 靜態策略(非動態發現)writeDataSourceName: write_ds # 寫操作專用數據源readDataSourceNames: # 讀操作數據源列表- read_ds_0 # 讀庫實例1- read_ds_1 # 讀庫實例2loadBalancerName: weight # 指定讀庫使用的負載均衡器(指向下方定義的weight配置)# ==================== 負載均衡器配置 ====================loadBalancers:# 可選算法1:隨機選擇random:type: RANDOM # 隨機算法,每次從讀庫中隨機選擇一個# 可選算法2:輪詢選擇round_robin: type: ROUND_ROBIN # 輪詢算法,按順序依次選擇讀庫# 實際使用的算法:加權負載均衡weight:type: WEIGHT # 加權算法,根據權重分配讀請求props: # 權重配置(必須與readDataSourceNames中的名稱匹配)read_ds_0: 2.0 # 讀庫1的權重值(數值越大被選中的概率越高)read_ds_1: 1.0 # 讀庫2的權重值# 權重計算邏輯:# read_ds_0概率 = 2.0/(2.0+1.0) ≈ 66.7%# read_ds_1概率 = 1.0/(2.0+1.0) ≈ 33.3%
上面這個例子里現在就是使用了加權負載均衡算法。(因為loadBalancerName: weight)
在上面這個例子里如果說loadBalancerName: random,則是使用隨機負載均衡算法
上面這個例子里loadBalancerName:round_robin,則是使用輪詢負載均衡算法
2.9.1.?隨機負載均衡算法示例
我們回到上面我們配置的?/bit/shardingsphere/proxy/conf/config-readwrite-splitting.yaml文件里面看看
loadBalancerName: randomloadBalancers:random:type: RANDOMround_robin:type: ROUND_ROBINweight:type: WEIGHTprops:read_ds_0: 2.0read_ds_1: 1.0
我們之前使用的是隨機負載均衡算法啊!!
2.9.2.?輪詢負載均衡算法示例
我們還是來到配置文件的目錄下面
我們進去config-readwrite-splitting.yaml,修改成輪詢負載均衡算法?
接下來我們重啟一下我們的容器
docker restart ss-proxy
docker ps
接下來我們還是去看看日志
tail -f /bit/shardingsphere/proxy/logs
接著我們換一個終端來登錄我們的mysql服務器
mysql -h127.0.0.1 -P3307 -uroot -p
接著我們看看
寫入?
insert into t_user(name) values ('test05');
?日志里多了這兩句
[INFO ] 2025-07-31 03:55:27.393 [ShardingSphere-Command-2] INFO ?ShardingSphere-SQL - Logic SQL: insert into t_user(name) values ('test05')
[INFO ] 2025-07-31 03:55:27.393 [ShardingSphere-Command-2] INFO ?ShardingSphere-SQL - Actual SQL: write_ds ::: insert into t_user(name) values ('test05')
寫入都在讀節點。
查詢
select * from t_user;
第一次查詢
[INFO ] 2025-07-31 04:03:52.520 [ShardingSphere-Command-3] INFO ?ShardingSphere-SQL - Logic SQL: select * from t_user
[INFO ] 2025-07-31 04:03:52.520 [ShardingSphere-Command-3] INFO ?ShardingSphere-SQL - Actual SQL: read_ds_1 ::: select * from t_user
第二次查詢
[INFO ] 2025-07-31 04:05:05.362 [ShardingSphere-Command-3] INFO ?ShardingSphere-SQL - Logic SQL: select * from t_user
[INFO ] 2025-07-31 04:05:05.362 [ShardingSphere-Command-3] INFO ?ShardingSphere-SQL - Actual SQL: read_ds_0 ::: select * from t_user
第三次查詢
[INFO ] 2025-07-31 04:05:39.234 [ShardingSphere-Command-3] INFO ?ShardingSphere-SQL - Logic SQL: select * from t_user
[INFO ] 2025-07-31 04:05:39.234 [ShardingSphere-Command-3] INFO ?ShardingSphere-SQL - Actual SQL: read_ds_1 ::: select * from t_user
第四次查詢
[INFO ] 2025-07-31 04:05:41.564 [ShardingSphere-Command-3] INFO ?ShardingSphere-SQL - Logic SQL: select * from t_user
[INFO ] 2025-07-31 04:05:41.564 [ShardingSphere-Command-3] INFO ?ShardingSphere-SQL - Actual SQL: read_ds_0 ::: select * from t_user
很標準的輪詢啊
2.9.3. 權重負載均衡算法示例
我們還是來到配置文件的目錄下面
?我們進去config-readwrite-splitting.yaml,修改成權重負載均衡算法示例
接下來我們重啟一下我們的容器
docker restart ss-proxy
docker ps
接下來我們還是去看看日志
tail -f /bit/shardingsphere/proxy/logs
接著我們換一個終端來登錄我們的mysql服務器
mysql -h127.0.0.1 -P3307 -uroot -p
接著我們看看
寫入?
insert into t_user(name) values ('test06');
?日志里多了這兩句
[INFO ] 2025-07-31 07:25:23.859 [ShardingSphere-Command-1] INFO ?ShardingSphere-SQL - Logic SQL: insert into t_user(name) values ('test06')
[INFO ] 2025-07-31 07:25:23.860 [ShardingSphere-Command-1] INFO ?ShardingSphere-SQL - Actual SQL: write_ds ::: insert into t_user(name) values ('test06')
寫入都在讀節點。
查詢
select * from t_user;
第一次查詢
[INFO ] 2025-07-31 07:25:51.789 [ShardingSphere-Command-1] INFO ?ShardingSphere-SQL - Logic SQL: select * from t_user
[INFO ] 2025-07-31 07:25:51.789 [ShardingSphere-Command-1] INFO ?ShardingSphere-SQL - Actual SQL: read_ds_0 ::: select * from t_user
第二次查詢
[INFO ] 2025-07-31 07:25:54.740 [ShardingSphere-Command-1] INFO ?ShardingSphere-SQL - Logic SQL: select * from t_user
[INFO ] 2025-07-31 07:25:54.741 [ShardingSphere-Command-1] INFO ?ShardingSphere-SQL - Actual SQL: read_ds_0 ::: select * from t_user
第三次查詢
[INFO ] 2025-07-31 07:25:55.594 [ShardingSphere-Command-1] INFO ?ShardingSphere-SQL - Logic SQL: select * from t_user
[INFO ] 2025-07-31 07:25:55.595 [ShardingSphere-Command-1] INFO ?ShardingSphere-SQL - Actual SQL: read_ds_0 ::: select * from t_user
第四次查詢
[INFO ] 2025-07-31 07:25:56.125 [ShardingSphere-Command-1] INFO ?ShardingSphere-SQL - Logic SQL: select * from t_user
[INFO ] 2025-07-31 07:25:56.125 [ShardingSphere-Command-1] INFO ?ShardingSphere-SQL - Actual SQL: read_ds_0 ::: select * from t_user
第五次查詢
[INFO ] 2025-07-31 07:25:57.048 [ShardingSphere-Command-1] INFO ?ShardingSphere-SQL - Logic SQL: select * from t_user
[INFO ] 2025-07-31 07:25:57.048 [ShardingSphere-Command-1] INFO ?ShardingSphere-SQL - Actual SQL: read_ds_0 ::: select * from t_user
第六次查詢
[INFO ] 2025-07-31 07:25:57.566 [ShardingSphere-Command-1] INFO ?ShardingSphere-SQL - Logic SQL: select * from t_user
[INFO ] 2025-07-31 07:25:57.567 [ShardingSphere-Command-1] INFO ?ShardingSphere-SQL - Actual SQL: read_ds_1 ::: select * from t_user
第七次查詢
[INFO ] 2025-07-31 07:25:59.127 [ShardingSphere-Command-1] INFO ?ShardingSphere-SQL - Logic SQL: select * from t_user
[INFO ] 2025-07-31 07:25:59.130 [ShardingSphere-Command-1] INFO ?ShardingSphere-SQL - Actual SQL: read_ds_0 ::: select * from t_user
我們看到大部分情況都是從節點1在執行這個查詢業務,只有少部分情況才會是從節點2在執行
2.10 手動事務
-- 開始事務
start transaction;-- 插入一條數據
insert into t_user (name) values ('transaction');-- 查詢
select * from t_user;-- 回滾,結束事務
rollback;-- 再次查詢
select * from t_user;
日志中顯示如下信息:
#寫入操作
[INFO ] 2025-07-31 07:30:20.112 [ShardingSphere-Command-2] INFO ?ShardingSphere-SQL - Logic SQL: insert into t_user (name) values ('transaction')
[INFO ] 2025-07-31 07:30:20.112 [ShardingSphere-Command-2] INFO ?ShardingSphere-SQL - Actual SQL: write_ds ::: insert into t_user (name) values ('transaction')
#事務中查詢
[INFO ] 2025-07-31 07:30:27.936 [ShardingSphere-Command-2] INFO ?ShardingSphere-SQL - Logic SQL: select * from t_user
[INFO ] 2025-07-31 07:30:27.937 [ShardingSphere-Command-2] INFO ?ShardingSphere-SQL - Actual SQL: write_ds ::: select * from t_user
#事務后查詢
[INFO ] 2025-07-31 07:30:40.634 [ShardingSphere-Command-2] INFO ?ShardingSphere-SQL - Logic SQL: select * from t_user
[INFO ] 2025-07-31 07:30:40.634 [ShardingSphere-Command-2] INFO ?ShardingSphere-SQL - Actual SQL: read_ds_1 ::: select * from t_user
?
我們發現事務中的查詢可是在寫服務器里執行的。?
注意:如果開啟事務,則所有的操作都會被路由到寫服務器