本指南提供詳盡的逐步教學課程,說明如何在 Google Distributed Cloud (GDC) 實體隔離環境中,跨三個可用區部署高可用性 MySQL 8.4 InnoDB 叢集。這個架構運用 Group Replication 進行 Paxos 共識、MySQL Router 進行智慧連線轉送,以及 MySQL Shell 進行叢集自動化調度管理。
這項實作嚴格使用虛擬機器 (VM),因此可繞過 GDC 實體隔離方案對跨可用區 Kubernetes 延伸叢集的限制,確保完整的跨可用區韌性,同時避免資料遺失。
架構圖如下:

事前準備
部署 VM
按照「建立並啟動 VM 執行個體」一節的說明,在三個可用區中建立三個 VM。
設定本機環境,使用金鑰組建立與 VM 的 SSH 連線:連線至 VM
您必須具備這項權限,才能使用安全複製 (SCP) 移轉套件: 移轉檔案
我們使用 Ubuntu 22.04 OS 和 n3-standard-2-gdc 機型進行驗證。如果是正式環境,請使用資源較多的機型。
使用下列指令取得 VM 的 IP:
VM_NAME=$1
if [[ -z "$VM_NAME" ]]; then
echo "Error: VM_NAME must be provided."
echo "Usage: $0 <VM_NAME>"
exit 1
fi
# 1. Get External IP from 'instances list'
EXT_IP=$(gdcloud compute instances list | awk -v vm="${VM_NAME}" '$1 == vm {print $5}')
if [[ -z "$EXT_IP" ]]; then
echo "Error: Could not find VM '${VM_NAME}' in the instance list."
exit 1
fi
INTERNAL_IP=$(gdcloud compute instances describe "${VM_NAME}" | awk '/^status:/ {in_status=1} in_status && /- [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/ {print $2; exit}' | cut -d'/' -f1)
if [[ -z "$INTERNAL_IP" ]]; then
INTERNAL_IP="<Not assigned or not found>"
fi
echo "${VM_NAME}"
echo "External IP: ${EXT_IP}"
echo "Internal IP: ${INTERNAL_IP}"
設定環境變數
在本機工作站殼層工作階段中設定下列變數:
export PROJECT_ID="your-project-id"
export VM1_NAME="mysql-node-1"
export VM2_NAME="mysql-node-2"
export VM3_NAME="mysql-node-3"
export VM1_IP="10.0.1.245" # Zone 1
export VM2_IP="10.0.1.241" # Zone 2
export VM3_IP="10.0.1.242" # Zone 3
export CLUSTER_NAME="mysql-ha-cluster"
網路設定
如需存取專案或組織外部的資料庫,請務必設定相應的專案網路政策 (PNP)。
請根據用途,按照「PNP 總覽」中的各節操作。
實體隔離軟體準備
使用 Docker 下載套件
從已連線的工作站執行下列指令,擷取 MySQL 8.4 和 Shell 元件:
mkdir -p ./mysql-packages
docker run --rm -v "$(pwd)/mysql-packages:/packages" ubuntu:22.04 bash -c "
apt-get update && apt-get install -y curl gnupg apt-rdepends wget lsb-release
curl -LsS https://dev.mysql.com/get/mysql-apt-config_0.8.39-1_all.deb -o config.deb
# Configure for MySQL 8.4 LTS
DEBIAN_FRONTEND=noninteractive dpkg -i config.deb
apt-get update
cd /packages
PACKAGES='mysql-server mysql-shell mysql-router'
apt-get download \$(apt-cache depends --recurse --no-recommends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances --no-pre-depends \${PACKAGES} | grep '^\w')
"
轉移及安裝
將 .deb 檔案上傳至所有三個 VM 上的 /tmp/packages/,然後安裝:
# From workstation: scp ./mysql-packages/*.deb ${VM_IP}:/tmp/packages/
# On each VM:
sudo dpkg -i /tmp/packages/*.deb
確認 dpkg 未傳回任何錯誤。如果是,請查看記錄,找出可能缺少的 deb 套件,並將其納入下載。
系統提示設定根密碼時,請留空。我們稍後會設定密碼。
MySQL 節點設定
設定 MySQL 以供叢集使用
編輯所有節點上的 /etc/mysql/mysql.conf.d/mysqld.cnf,啟用 GTID 和二進位記錄:
[mysqld]
bind-address = 0.0.0.0
server-id = 1 # Use 2 and 3 for other VMs
gtid-mode = ON
enforce-gtid-consistency = ON
binlog-format = ROW
log-bin = mysql-bin
report_host = 10.0.1.245 # Use the VM's specific IP
重新啟動服務:
sudo systemctl restart mysql
接著連線至資料庫:
sudo mysql
並設定根密碼:
CREATE USER 'root'@'%' IDENTIFIED WITH 'caching_sha2_password' BY 'your_new_secure_password';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
InnoDB 叢集初始化和驗證
使用 MySQL Shell 建立叢集
僅在 VM 1 使用 MySQL Shell 初始化叢集:
mysqlsh --uri root@localhost
# Inside MySQL Shell:
\js
dba.configureInstance('root@VM1_IP')
var cluster = dba.createCluster('mysql-ha-cluster')
cluster.addInstance('root@VM2_IP')
cluster.addInstance('root@VM3_IP')
cluster.status()
啟動 MySQL Router
在所有三個 VM 上,啟動路由器以偵測新叢集:
sudo mysqlrouter --bootstrap root@VM1_IP --user=mysqlrouter
sudo systemctl restart mysqlrouter
sudo systemctl enable mysqlrouter
確認平衡和連線
從任何節點執行這些指令,確保路由器正確分配流量。
驗證寫入轉送 (主動主要):查詢通訊埠 6446 (傳統 RW)。它應嚴格傳回目前主要節點的主機名稱。
mysql -u root -pyour_new_secure_password -h 127.0.0.1 -P 6446 -e "SELECT @@hostname;"驗證讀取平衡 (輪流):多次查詢通訊埠 6447 (傳統唯讀)。系統應會循環顯示叢集中所有可用節點的主機名稱。
for i in {1..4}; do mysql -u root -pyour_new_secure_password -h 127.0.0.1 -P 6447 -e "SELECT @@hostname;"; done檢查連線拓撲:使用 MySQL Shell 確認所有成員皆為
ONLINE,且負載平衡正確。mysqlsh --uri root@localhost --cluster # inside the shell > cluster.status()
設定全域負載平衡器
使用 GDC 全域 L4 負載平衡器,為應用程式提供單一穩定的虛擬 IP (VIP)。按照「設定內部全域負載平衡器」一文的指示,設定內部全域 L4 負載平衡器,並將 VM 設為負載平衡器的目標:將 VM 設為負載平衡器目標。
自動化容錯移轉驗證
這項測試可確認叢集會選出新的領導者,且路由器會重新導向流量,不需手動介入。
模擬主要故障
找出目前的主要節點 (例如節點 1),並停止 MySQL 服務:
sudo systemctl stop mysql
驗證選舉和路由轉移
等待 10 到 20 秒,讓共識通訊協定選出新的領導者。
檢查叢集狀態:從 VM 2 或 3 確認是否已選出新的主要節點。
mysqlsh --uri root@localhost --cluster # inside the shell > cluster.status()確認其中一個剩餘節點標示為
PRIMARY,且失敗的節點標示為UNREACHABLE或MISSING。驗證寫入轉送:再次測試 RW 通訊埠 (6446)。現在應會傳回新主要執行個體的主機名稱。
mysql -u root -p -h 127.0.0.1 -P 6446 -e "SELECT @@hostname;"測試全域 VIP 連線:從應用程式伺服器查詢全域 VIP。
mysql -u root -p -h ${LB_IP} -P 3306 -e "SELECT @@hostname;"
復原並驗證重新加入
在故障節點上啟動 MySQL 服務,並確認該節點重新加入為次要副本。
sudo systemctl start mysql
mysqlsh --uri root@localhost --cluster -e "cluster.status()"
確認三個節點都傳回 ONLINE 狀態。