GDC 氣隙隔離環境中的 MySQL 資料庫參考實作

本指南提供詳盡的逐步教學課程,說明如何在 Google Distributed Cloud (GDC) 實體隔離環境中,跨三個可用區部署高可用性 MySQL 8.4 InnoDB 叢集。這個架構運用 Group Replication 進行 Paxos 共識、MySQL Router 進行智慧連線轉送,以及 MySQL Shell 進行叢集自動化調度管理。

這項實作嚴格使用虛擬機器 (VM),因此可繞過 GDC 實體隔離方案對跨可用區 Kubernetes 延伸叢集的限制,確保完整的跨可用區韌性,同時避免資料遺失。

架構圖如下:

執行共置服務堆疊的三 VM 架構。

事前準備

部署 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

確認平衡和連線

從任何節點執行這些指令,確保路由器正確分配流量。

  1. 驗證寫入轉送 (主動主要):查詢通訊埠 6446 (傳統 RW)。它應嚴格傳回目前主要節點的主機名稱。

    mysql -u root -pyour_new_secure_password -h 127.0.0.1 -P 6446 -e "SELECT @@hostname;"
    
  2. 驗證讀取平衡 (輪流):多次查詢通訊埠 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
    
  3. 檢查連線拓撲:使用 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 秒,讓共識通訊協定選出新的領導者。

  1. 檢查叢集狀態:從 VM 2 或 3 確認是否已選出新的主要節點。

    mysqlsh --uri root@localhost --cluster
    
    # inside the shell
    > cluster.status()
    

    確認其中一個剩餘節點標示為 PRIMARY,且失敗的節點標示為 UNREACHABLE 或 MISSING。

  2. 驗證寫入轉送:再次測試 RW 通訊埠 (6446)。現在應會傳回新主要執行個體的主機名稱。

    mysql -u root -p -h 127.0.0.1 -P 6446 -e "SELECT @@hostname;"
    
  3. 測試全域 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 狀態。