GDC 网闸隔离配置上的 MySQL 数据库参考实现

本指南提供了一个全面的分步教程,用于在 Google Distributed Cloud (GDC) 网闸隔离环境中跨三个可用区部署高可用性 MySQL 8.4 InnoDB 集群。此架构利用 Group Replication 实现基于 Paxos 的共识,利用 MySQL Router 实现智能连接路由,并利用 MySQL Shell 实现集群编排。

通过严格利用虚拟机 (VM),此实现绕过了 GDC 在跨区域 Kubernetes 弹性集群方面的气隙限制,确保了完整的多区域弹性,而不会有数据丢失的风险。

以下是架构图:

运行同位服务堆栈的三虚拟机架构。

准备工作

部署虚拟机

按照创建并启动虚拟机实例中的步骤在三个可用区中创建三个虚拟机。

配置本地环境,以使用密钥对建立与虚拟机的 SSH 连接:连接到虚拟机

这是使用安全复制 (SCP) 传输软件包所必需的: 传输文件

为了进行验证,我们使用了 Ubuntu 22.04 操作系统和 n3-standard-2-gdc 机器类型。对于生产环境,请使用具有更多资源的机器类型。

使用以下命令获取虚拟机的 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}"

配置环境变量

在本地工作站 shell 会话中设置以下变量:

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 文件上传到所有三个虚拟机上的 /tmp/packages/ 并进行安装:

# From workstation: scp ./mysql-packages/*.deb ${VM_IP}:/tmp/packages/
# On each VM:
sudo dpkg -i /tmp/packages/*.deb

确保 dpkg 不返回任何错误。如果需要,请检查日志,看看您可能缺少哪些 deb 软件包,并将它们包含在下载中。

当系统提示您设置 root 密码时,请将其留空。我们稍后会设置密码。

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

并设置 root 密码:

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 创建集群

仅在虚拟机 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 路由器

在所有三个虚拟机上,引导启动路由器以检测新集群:

sudo mysqlrouter --bootstrap root@VM1_IP --user=mysqlrouter
sudo systemctl restart mysqlrouter
sudo systemctl enable mysqlrouter

验证负载均衡和连接

从任何节点运行这些命令,以确保路由器正确分配流量。

  1. 验证写入路由(主动主节点):查询端口 6446(经典读写)。它应严格返回当前主服务器的主机名。

    mysql -u root -pyour_new_secure_password -h 127.0.0.1 -P 6446 -e "SELECT @@hostname;"
    
  2. 验证读取平衡(轮询):多次查询端口 6447(经典 RO)。它应循环遍历集群中所有可用节点的主机名。

    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 负载均衡器,并将虚拟机设置为该负载均衡器的目标:将虚拟机设置为负载均衡器目标

自动故障切换验证

此测试可确认集群在无需人工干预的情况下选择新领导者,并且路由器会重定向流量。

模拟主故障

确定当前的主节点(例如节点 1),然后停止 MySQL 服务:

sudo systemctl stop mysql

验证迁移和路由转移

等待 10-20 秒,让共识协议选出新的领导者。

  1. 检查集群状态:从虚拟机 2 或 3 中,验证是否已选出新的主节点。

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

    确认剩余节点之一标记为 PRIMARY,而失败的节点标记为 UNREACHABLEMISSING

  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 状态。