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,故障节点被标记为 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 状态。