關鍵任務應用程式需要高可用性。高可用性的目標是為用戶提供持續的服務或資源存取,最大限度地減少中斷的可能性。自動故障轉移是一種用於實現高可用性的特定機制。它涉及自動檢測系統組件(如伺服器、網絡或資料庫)的故障,並立即將操作切換到備用組件,無需人工干預。這提高了系統的韌性。
MariaDB MaxScale是一個資料庫代理,包含高可用性的功能。在本文中,我將展示如何使用基於Java和Svelte實現的線上商店模擬器應用程式來試用它。
架構
下圖展示了演示應用程式的架構:
A web application developed with JavaScript and the Svelte framework makes HTTP requests to a Java backend. The backend answers with server-sent events that the frontend uses to update the user interface on the browser.
後端使用Spring Boot實現,並通過MariaDB資料庫集群使用R2DBC(反應式)進行連接。後端邏輯簡而言之,是對線上商店資料庫的讀寫進行模擬。該模擬是可參數化的,用戶可以調整:
- 每分鐘產品訪問次數:每分鐘對資料庫的讀取次數。
- 每分鐘訂單數量:每分鐘對資料庫的寫入次數。
- 每筆訂單的產品數量:寫入放大。
- 逾時毫秒數:請求到資料庫被視為失敗前經過的秒數。
資料庫叢集前端由一個名為MaxScale的資料庫代理管理。此代理使叢集對Java後端看起來像單一邏輯資料庫。MaxScale還執行讀寫分離(將寫入發送到主要MariaDB伺服器,讀取發送到副本),以及使用可配置算法在副本伺服器之間進行讀取負載平衡。數據自動從主伺服器複製到副本資料庫伺服器。
從原始碼構建Docker映像
I have prepared custom Docker images for every component in the simulator. You can either build the images from the source (optional) or use the already built and published images from Docker Hub. If you decide to build the images yourself, you can find the source code on GitHub:
- MariaDB部署: 提供定制镜像,便于部署带有MaxScale的MariaDB复制拓扑结构。请勿在生产环境中使用这些镜像! 这些镜像仅适用于演示应用。生产环境部署请使用官方MariaDB Docker镜像。
- 后端应用: 连接到数据库集群的后端应用。
- 前端应用: 向后台发送模拟配置请求并接收事件以展示模拟结果的前端应用。
每个仓库均包含Dockerfile,供您据此构建自己的Docker镜像。例如,构建后端应用镜像的命令如下:
docker build --tag alejandrodu/online-store-simulator-java-backend .
运行模拟
所有服务均可通过以下Docker Compose文件(docker-compose.yml
)启动:
version: "3.9"
services:
server-1:
container_name: server-1
image: alejandrodu/mariadb
ports:
- "3306:3306"
environment:
- MARIADB_CREATE_DATABASE=demo
- MARIADB_CREATE_USER=user:Password123!
- MARIADB_CREATE_REPLICATION_USER=replication_user:ReplicationPassword123!
- MARIADB_CREATE_MAXSCALE_USER=maxscale_user:MaxScalePassword123!
server-2:
container_name: server-2
image: alejandrodu/mariadb
ports:
- "3307:3306"
environment:
- MARIADB_REPLICATE_FROM=replication_user:ReplicationPassword123!@server-1:3306
server-3:
container_name: server-3
image: alejandrodu/mariadb
ports:
- "3308:3306"
environment:
- MARIADB_REPLICATE_FROM=replication_user:ReplicationPassword123!@server-1:3306
maxscale:
container_name: maxscale
image: alejandrodu/mariadb-maxscale
command: --admin_host 0.0.0.0 --admin_secure_gui false
ports:
- "4000:4000"
- "8989:8989"
- "27017:27017"
environment:
- MAXSCALE_USER=maxscale_user:MaxScalePassword123!
- MARIADB_HOST_1=server-1 3306
- MARIADB_HOST_2=server-2 3306
- MARIADB_HOST_3=server-3 3306
healthcheck:
test: ["CMD", "maxctrl", "list", "servers"]
interval: 5s
timeout: 10s
retries: 5
java-backend:
container_name: java-backend
image: alejandrodu/online-store-simulator-java-backend
ports:
- "8080:8080"
environment:
- spring.r2dbc.url=r2dbc:mariadb://maxscale:4000/demo
- spring.r2dbc.username=user
- spring.r2dbc.password=Password123!
- spring.liquibase.url=jdbc:mariadb://maxscale:4000/demo
- spring.liquibase.user=user
- spring.liquibase.password=Password123!
depends_on:
maxscale:
condition: service_healthy
svelte-frontend:
container_name: svelte-fronted
image: alejandrodu/online-store-simulator-svelte-frontend
ports:
- "5173:80"
environment:
- BACKEND_URL=http://java-backend:8080
请进入包含Docker Compose文件的目录,并以下述方式在分离模式下启动服务:
docker compose up -d
配置MaxScale
在开始模拟前,需为事务重放配置MaxScale,并调整超时设置以增加模拟的趣味性。
前往 http://localhost:8989/ 並使用以下憑證登入介面:
- 用戶名:
admin
- 密碼:
mariadb
登入後,您將看到一個顯示MariaDB叢集狀態的儀表板。

該叢集包含一個主伺服器(server-1)和兩個副本(server-2 和 server-3)。從 server-1(主)到 server-2 和 server-3(副本)的複製已配置完成。所有伺服器應該都在運行中。
點擊 mdb_monitor,然後點擊 鉛筆 圖標以啟用參數編輯。設置以下參數:
auto_failover
(true
):此設置啟用自動故障轉移。當MariaDB伺服器下線時,MaxScale會選擇一個副本伺服器並將其重新配置為新的主伺服器,以便持續進行寫入操作。auto_rejoin
(true
):此設置啟用已恢復伺服器的自動重新加入。當故障伺服器再次上線時,MaxScale會檢測到並將其配置為可用副本伺服器。failcount
(1
):設置監控器(MaxScale中檢查伺服器狀態的組件)迭代次數,以確定伺服器下線以激活故障轉移過程。我們設置值為1
以確保故障後立即啟動故障轉移。backend_connect_timeout
(1000
):監控連接的連接超時。我們設置一個低值(一秒)以便在此次演示中快速激活故障轉移。backend_read_timeout
(1000
): 監控連接的讀取逾時時間。backend_write_timeout
(1000
): 監控連接的寫入逾時時間。master_failure_timeout
(1000
): 主節點故障逾時時間。monitor_interval
(1000
): 伺服器監控頻率。
警告: 這些設定適用於此示範,但對於生產環境可能並非最佳選擇!
設定好參數後,點擊完成編輯並確認。
您還需要啟用交易重播功能,該功能會自動在伺服器故障後重新執行失敗的飛行中交易,這對軟體開發者來說是一個有用的功能,因為它避免了編寫故障情況和交易重試的需求。
在主選單中,點擊儀表板,然後在伺服器列表中任選一個查詢路由服務連結。按以下方式編輯參數:
transaction_replay
(true
): 啟用失敗交易的自动重試。transaction_replay_retry_on_deadlock
(true
): 與前述相同,當發生死結時。transaction_replay_retry_on_mismatch
(true
): 與前述相同,當發生校驗和不符時。
設定好參數後,點擊完成編輯並確認。
開始模擬
一切配置就緒後,您可以開始模擬。前往 http://localhost:5173/ 並配置以下參數(希望名稱本身已足夠說明):
- 每分鐘產品訪問量:
6000
- 每分鐘訂單數:
60
- 超時時間(毫秒):
8000
但在啟動模擬之前,您需要為線上商店創建產品。點擊 數據 | 創建產品…。保留默認值並點擊 創建。您應該會看到UI隨著數據庫中產品的創建而更新。
現在您終於可以點擊 開始 並觀看模擬運行了。

模擬伺服器故障
此時,主伺服器正在處理寫入(訂單)。如果您停止該伺服器會發生什麼?在命令行中運行:
docker stop server-1
根據多種因素,您可能在模擬器中遇到一些“失望的訪客”或甚至幾個“錯失的機會”。或者可能完全沒有任何問題!產品訪問(讀取)和訂單(寫入)仍然會發生,這要感謝MaxScale。如果沒有自動故障轉移,您必須手動重新配置所有內容,這將導致更多的離線時間以及許多失望的訪客和錯失的機會!
啟動故障伺服器:
docker start server-1
前往MaxScale 儀表板(http://localhost:8989/)並確認 server-1 現在是一個正常運作的副本。
您可以執行手動切換以再次將伺服器-1設為主伺服器。點擊mdb_monitor,然後將滑鼠懸停在MASTER部分上。點擊鉛筆圖示並選擇伺服器-1。點擊交換,並在儀表板中再次檢查新的主伺服器是否為伺服器-1。
結論
自動故障轉移僅是高可用性系統中的一個組件。您可以使用如MaxScale這樣的資料庫代理來設置自動故障轉移,還包括其他組件如負載均衡、查詢路由、事務重試、拓撲隔離等。查看文檔這裡。
Source:
https://dzone.com/articles/high-availability-and-resiliency-in-databases