【MySQL集群架構與實踐3】使用Dcoker實現讀寫分離

目錄

一. 在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作為整個系統的性能瓶頸就越來越明顯,大量的數據庫訪問可能會把某個數據節點打爆(尤其是在單臺數據庫服務器的情況下),通過部署讀寫分離可以有效的解決單點故障問題并提升系統性能。

有以下需求時可以使用讀寫分離架構部署數據庫服務:

  1. 讀多寫少的場景:很多的應用程序都是讀多寫少的場景,讀寫分離可以將讀請求分散到多個從服務器上,從而減輕主服務器的負擔,顯著提高讀操作的性能。
  2. 水平擴展:通過增加從服務器的數量,可以進一步擴展數據庫的讀能力,以應對不斷增長的負載。
  3. 故障轉移:在主服務器發生故障時,可以快速將讀和寫操作切換到從服務器,保證服務的可用性。
  4. 實時備份:從服務器也可以作為主服務器的實時備份節點,當主服務器發生故障時,可以快速恢復數據。

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')

補充一下:

  1. Logic SQL是客戶端發來的語句
  2. 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
?

我們發現事務中的查詢可是在寫服務器里執行的。?

注意:如果開啟事務,則所有的操作都會被路由到寫服務器

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/91284.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/91284.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/91284.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

maven的阿里云鏡像地址

在 Maven 中配置阿里云鏡像可以加速依賴包的下載&#xff0c;尤其是國內環境下效果明顯。以下是阿里云 Maven 鏡像的配置方式&#xff1a; 配置步驟&#xff1a;找到 Maven 的配置文件 settings.xml 全局配置&#xff1a;位于 Maven 安裝目錄的 conf/settings.xml用戶級配置&am…

大語言模型信息抽取系統解析

這段代碼實現了一個基于大語言模型的信息抽取系統&#xff0c;能夠從金融和新聞類文本中提取結構化信息。下面我將詳細解析整個代碼的結構和功能。1. 代碼整體結構代碼主要分為以下幾個部分&#xff1a;模式定義&#xff1a;定義不同領域(金融、新聞)需要抽取的實體類型示例數據…

Next實習項目總結串聯講解(一)

下面是一些 Next.js 前端面試中常見且具深度的問題&#xff0c;按照邏輯模塊整理&#xff0c;同時提供示范回答建議&#xff0c;便于你條理清晰地展示理解與實踐經驗。 ? 面試講述結構建議 先講 Next.js 是什么&#xff0c;它為什么比 React 更高級。(支持 SSR/SSG/ISR,提升S…

React開發依賴分析

1. React小案例&#xff1a; 在界面顯示一個文本&#xff1a;Hello World點擊按鈕后&#xff0c;文本改為為&#xff1a;Hello React 2. React開發依賴 2.1. 開發React必須依賴三個庫&#xff1a; 2.1.1. react: 包含react所必須的核心代碼2.1.2. react-dom: react渲染在不同平…

工具(一)Cursor

目錄 一、介紹 二、如何打開文件 1、從idea跳轉文件 2、單獨打開項目 三、常見使用 1、Chat 窗口 Ask 對話模式 1.1、使用技巧 1.2 發送和使用 codebase 發送區別 1.3、問題快速修復 2、Chat 窗口 Agent 對話模式 2.1、agent模式功能 2.2、Chat 窗口回滾&撤銷 2.3…

Prompt編寫規范指引

1、&#x1f4d6; 引言 隨著人工智能生成內容&#xff08;AIGC&#xff09;技術的快速發展&#xff0c;越來越多的開發者開始利用AIGC工具來輔助代碼編寫。然而&#xff0c;如何編寫有效的提示詞&#xff08;Prompt&#xff09;以引導AIGC生成高質量的代碼&#xff0c;成為了許…

自我學習----繪制Mark點

在PCB的Layout過程中我們需在光板上放置Mark點以方便生產時的光學定位&#xff08;三點定位&#xff09;&#xff1b;我個人Mark點繪制步驟如下&#xff1a; layer層&#xff1a;1.放置直徑1mm的焊盤&#xff08;無網絡連接&#xff09; 2.放置一個圓直徑2mm&#xff0c;圓心與…

2025年財稅行業拓客破局:小藍本財稅版AI拓客系統助力高效拓客

2025年&#xff0c;在"金稅四期"全面實施的背景下&#xff0c;中國財稅服務市場迎來爆發式增長&#xff0c;根據最新的市場研究報告&#xff0c;2025年中國財稅服務行業產值將達2725.7億元。然而&#xff0c;行業高速發展的背后&#xff0c;80%的財稅公司卻陷入獲客成…

雙向鏈表,對其實現頭插入,尾插入以及遍歷倒序輸出

1.創建一個節點&#xff0c;并將鏈表的首節點返回創建一個獨立節點&#xff0c;沒有和原鏈表產生任何關系#include "head.h"typedef struct Node { int num; struct Node*pNext; struct Node*pPer; }NODE;后續代碼&#xff1a;NODE*createNode(int value) {NODE*new …

2025年自動化工程與計算機網絡國際會議(ICAECN 2025)

2025年自動化工程與計算機網絡國際會議&#xff08;ICAECN 2025&#xff09; 2025 International Conference on Automation Engineering and Computer Networks一、大會信息會議簡稱&#xff1a;ICAECN 2025 大會地點&#xff1a;中國柳州 審稿通知&#xff1a;投稿后2-3日內通…

12.Origin2021如何繪制誤差帶圖?

12.Origin2021如何繪制誤差帶圖?選中Y3列→點擊統計→選擇描述統計→選擇行統計→選擇打開對話框輸入范圍選擇B列到D列點擊輸出量→勾選均值和標準差Control選擇下面三列點擊繪圖→選擇基礎2D圖→選擇誤差帶圖雙擊圖像→選擇符號和顏色點擊第二個Sheet1→點擊誤差棒→連接選擇…

如何使用API接口獲取淘寶店鋪訂單信息

要獲取淘寶店鋪的訂單信息&#xff0c;您需要通過淘寶開放平臺(Taobao Open Platform, TOP)提供的API接口來實現。以下是詳細步驟&#xff1a;1. 注冊淘寶開放平臺賬號訪問淘寶開放平臺注冊開發者賬號并完成實名認證創建應用獲取App Key和App Secret2. 申請API權限在"我的…

【Kiro Code 從入門到精通】重要的功能

一、Kiro 是什么&#xff1f; Kiro 是一款智能型集成開發環境&#xff08;IDE&#xff09;&#xff0c;借助規格說明&#xff08;specs&#xff09;、向導&#xff08;steer&#xff09;、鉤子&#xff08;hooks&#xff09;幫助你高效完成工作。 二、Specs 規格說明 規范&…

直播間里的酒旅新故事:內容正在重構消費鏈路

文/李樂編輯/子夜今年暑期&#xff0c;旅游的熱浪席卷全國。機場、火車站人潮涌動&#xff0c;電子屏上滾動的航班信息與檢票口前的長隊交織成繁忙的出行圖景&#xff0c;酒店預訂量也在這股熱潮中節節攀升。連線 Insight關注到&#xff0c;今年的暑期游有了一些新變化&#xf…

50天50個小項目 (Vue3 + Tailwindcss V4) ? | VerifyAccountUi(驗證碼組件)

&#x1f4c5; 我們繼續 50 個小項目挑戰&#xff01;—— VerifyAccountUi組件 倉庫地址&#xff1a;https://github.com/SunACong/50-vue-projects 項目預覽地址&#xff1a;https://50-vue-projects.vercel.app/ 使用 Vue 3 的 <script setup> 語法結合 Tailwind CS…

AbstractAuthenticationToken 認證流程中??認證令牌的核心抽象類詳解

AbstractAuthenticationToken 認證流程中??認證令牌的核心抽象類詳解在 Spring Security 中&#xff0c;AbstractAuthenticationToken 是 Authentication 接口的??抽象實現類??&#xff0c;其核心作用是為具體的認證令牌&#xff08;如用戶名密碼令牌、JWT 令牌等&#x…

小程序視頻播放,與父視圖一致等樣式設置

初始設置的代碼&#xff1a;WXML的代碼<view class"card-wrapper"> <!-- 視頻播放容器&#xff08;默認隱藏&#xff09; --> <view class"video-container" wx:if"{{isPlaying}}"> <video id"cardVideo" class&…

Kafka——關于主題管理

引言在Kafka的世界中&#xff0c;主題&#xff08;Topic&#xff09;是消息的基本組織單位&#xff0c;類似于文件系統中的"文件夾"——所有消息都按照主題分類存儲&#xff0c;生產者向主題寫入消息&#xff0c;消費者從主題讀取消息。主題的管理是Kafka運維的基礎&…

【VLLM】VLLM使用

一 、安裝 二、啟動入口 VLLM 提供了多種入口方式啟動模型&#xff0c;以適應不同的使用場景&#xff08;如命令行交互、API 服務、自定義集成等&#xff09;。除了最常用的 openai.api_server&#xff08;OpenAI 兼容 API 服務&#xff09;&#xff0c;還有以下主要入口&#…

為Github Copilot創建自定義指令/說明/注意事項

GitHub Copilot 是一個強大的 AI 編程助手&#xff0c;通過合理配置自定義指令&#xff0c;可以讓它更好地理解和遵循項目特定的編碼規范&#xff0c;省的每次提問時輸入重復提示語。 目錄 方法一&#xff1a;項目級別指令文件&#xff08;推薦&#xff09;方法二&#xff1a…