Diese Anleitung enthält eine umfassende Schritt-für-Schritt-Anleitung zum Bereitstellen eines hochverfügbaren MySQL 8.4 InnoDB-Clusters in drei Verfügbarkeitszonen in einer isolierten Google Distributed Cloud-Umgebung (GDC). Diese Architektur nutzt die Gruppenreplikation für den Paxos-basierten Konsens, MySQL Router für intelligentes Verbindungsrouting und MySQL Shell für die Clusterorchestrierung.
Durch die ausschließliche Verwendung von virtuellen Maschinen (VMs) umgeht diese Implementierung die Einschränkungen von GDC mit Air Gap in Bezug auf zonenübergreifende Kubernetes-Stretch-Cluster und sorgt für vollständige Resilienz in mehreren Zonen, ohne das Risiko eines Datenverlusts.
Dies ist das Architekturdiagramm:

Hinweis
VMs bereitstellen
Folgen Sie der Anleitung unter VM-Instanz erstellen und starten um drei VMs in den drei verfügbaren Zonen zu erstellen.
Konfigurieren Sie Ihre lokale Umgebung, um eine SSH-Verbindung zu den VMs mit einem Schlüsselpaar herzustellen: Verbindung zu einer VM herstellen
Dies ist erforderlich, um die Pakete mit Secure Copy (SCP) zu übertragen: Dateien übertragen
Zur Überprüfung haben wir das Betriebssystem Ubuntu 22.04 und den Maschinentyp n3-standard-2-gdc verwendet.
Verwenden Sie für eine Produktionsumgebung einen Maschinentyp mit mehr Ressourcen.
Rufen Sie die IPs der VMs mit folgendem Befehl ab:
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}"
Umgebungsvariablen konfigurieren
Legen Sie diese Variablen in der Shell-Sitzung Ihrer lokalen Workstation fest:
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"
Netzwerkkonfiguration
Wenn Sie außerhalb des Projekts oder der Organisation auf die Datenbank zugreifen müssen, richten Sie die PNP (Project Network Policy) entsprechend ein.
Folgen Sie den Abschnitten der PNP-Übersicht je nach Anwendungsfall.
Softwarevorbereitung für isolierte Umgebungen
Pakete mit Docker herunterladen
Führen Sie den folgenden Befehl von einer verbundenen Workstation aus, um MySQL 8.4- und Shell-Komponenten abzurufen:
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')
"
Übertragen und installieren
Laden Sie die .deb-Dateien auf allen drei VMs in /tmp/packages/ hoch und installieren Sie sie:
# From workstation: scp ./mysql-packages/*.deb ${VM_IP}:/tmp/packages/
# On each VM:
sudo dpkg -i /tmp/packages/*.deb
Achten Sie darauf, dass dpkg keine Fehler zurückgibt. Wenn dies der Fall ist, prüfen Sie die Logs, um zu sehen, welche DEB-Pakete fehlen, und fügen Sie sie dem Download hinzu.
Wenn Sie aufgefordert werden, das Root-Passwort festzulegen, lassen Sie das Feld leer. Wir legen das Passwort später fest.
MySQL-Knotenkonfiguration
MySQL für die Clusternutzung konfigurieren
Bearbeiten Sie /etc/mysql/mysql.conf.d/mysqld.cnf auf allen Knoten, um GTIDs und die binäre Protokollierung zu aktivieren:
[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
Starten Sie den Dienst neu:
sudo systemctl restart mysql
Stellen Sie dann eine Verbindung zur Datenbank her:
sudo mysql
und legen Sie das Root-Passwort fest:
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-Cluster initialisieren und überprüfen
Cluster mit MySQL Shell erstellen
Initialisieren Sie den Cluster NUR auf VM 1 mit 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 starten
Starten Sie den Router auf allen drei VMs, um den neuen Cluster zu erkennen:
sudo mysqlrouter --bootstrap root@VM1_IP --user=mysqlrouter
sudo systemctl restart mysqlrouter
sudo systemctl enable mysqlrouter
Lastverteilung und Verbindungen überprüfen
Führen Sie diese Befehle von einem beliebigen Knoten aus, um sicherzustellen, dass der Router den Traffic korrekt verteilt.
Schreibrouting überprüfen (aktiver primärer Knoten): Fragen Sie Port 6446 (klassisch RW) ab. Es sollte ausschließlich der Hostname des aktuellen primären Knotens zurückgegeben werden.
mysql -u root -pyour_new_secure_password -h 127.0.0.1 -P 6446 -e "SELECT @@hostname;"Leselastverteilung überprüfen (Round-Robin): Fragen Sie Port 6447 (klassisch RO) mehrmals ab. Es sollte durch die Hostnamen aller verfügbaren Knoten im Cluster gewechselt werden.
for i in {1..4}; do mysql -u root -pyour_new_secure_password -h 127.0.0.1 -P 6447 -e "SELECT @@hostname;"; doneVerbindungstopologie prüfen: Verwenden Sie MySQL Shell, um zu bestätigen, dass alle Mitglieder
ONLINEsind und die Last korrekt verteilt wird.mysqlsh --uri root@localhost --cluster # inside the shell > cluster.status()
Globalen Load-Balancer einrichten
Stellen Sie mit dem globalen L4-Load-Balancer von GDC eine einzelne, stabile virtuelle IP-Adresse (VIP) für Ihre Anwendungen bereit. Folgen Sie der Anleitung unter Interne globale Load-Balancer konfigurieren , um den internen globalen L4-Load-Balancer einzurichten und Ihre VMs als Ziel festzulegen: VMs als Load-Balancer-Ziel einrichten.
Automatische Failover-Überprüfung
Dieser Test bestätigt, dass der Cluster einen neuen Leader wählt und der Router den Traffic ohne manuellen Eingriff umleitet.
Fehler des primären Knotens simulieren
Identifizieren Sie den aktuellen primären Knoten (z.B. Knoten 1) und beenden Sie den MySQL-Dienst:
sudo systemctl stop mysql
Wahl und Routingverschiebung überprüfen
Warten Sie 10 bis 20 Sekunden, bis das Konsensprotokoll einen neuen Leader gewählt hat.
Clusterstatus prüfen: Prüfen Sie von VM 2 oder 3 aus, ob ein neuer primärer Knoten gewählt wurde.
mysqlsh --uri root@localhost --cluster # inside the shell > cluster.status()Bestätigen Sie, dass einer der verbleibenden Knoten als
PRIMARYmarkiert ist und der ausgefallene Knoten alsUNREACHABLEoderMISSING.Schreibrouting überprüfen: Testen Sie den RW-Port (6446) noch einmal. Es sollte jetzt der Hostname des neuen primären Knotens zurückgegeben werden.
mysql -u root -p -h 127.0.0.1 -P 6446 -e "SELECT @@hostname;"Konnektivität der globalen VIP testen: Fragen Sie von einem Anwendungsserver aus die globale VIP ab.
mysql -u root -p -h ${LB_IP} -P 3306 -e "SELECT @@hostname;"
Wiederherstellen und erneuten Beitritt überprüfen
Starten Sie den MySQL-Dienst auf dem ausgefallenen Knoten und prüfen Sie, ob er als sekundäre Replikat wieder beitritt.
sudo systemctl start mysql
mysqlsh --uri root@localhost --cluster -e "cluster.status()"
Bestätigen Sie, dass alle drei Knoten den Status ONLINE zurückgeben.