In dieser Anleitung wird Schritt für Schritt beschrieben, wie Sie einen hochverfügbaren MySQL 8.4-InnoDB-Cluster in drei Verfügbarkeitszonen in einer GDC-Umgebung (Google Distributed Cloud) mit Air Gap bereitstellen. 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 strikte Verwendung von virtuellen Maschinen (VMs) werden bei dieser Implementierung die Einschränkungen von GDC mit Air Gap in Bezug auf zonenübergreifende Kubernetes-Stretch-Cluster umgangen. So wird eine vollständige Ausfallsicherheit über mehrere Zonen hinweg gewährleistet, ohne dass ein Datenverlust riskiert wird.
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
Für die Ü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 IP-Adressen der VMs 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 die Datenbank außerhalb des Projekts oder der Organisation erreichen müssen, müssen Sie die projektbezogene Netzwerkrichtlinie entsprechend einrichten.
Folgen Sie den Abschnitten der Übersicht über projektbezogene Netzwerkrichtlinien, je nach Anwendungsfall.
Vorbereitung der Software mit Air Gap
Pakete mit Docker herunterladen
Führen Sie den folgenden Befehl auf 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 ja, prüfen Sie in den Logs, welche deb-Pakete möglicherweise fehlen, und fügen Sie sie dem Download hinzu.
Wenn Sie aufgefordert werden, das Root-Passwort festzulegen, lassen Sie das Feld leer. Das Passwort legen wir 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 das binäre Logging 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;
Initialisierung und Überprüfung des InnoDB-Clusters
Cluster mit MySQL Shell erstellen
Initialisieren Sie den Cluster NUR auf VM 1 mit der 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 per Bootstrap einrichten
Führen Sie auf allen drei VMs ein Bootstrapping des Routers durch, um den neuen Cluster zu erkennen:
sudo mysqlrouter --bootstrap root@VM1_IP --user=mysqlrouter
sudo systemctl restart mysqlrouter
sudo systemctl enable mysqlrouter
Balancing und Verbindungen prüfen
Führen Sie diese Befehle auf einem beliebigen Knoten aus, um zu prüfen, ob der Router den Traffic korrekt verteilt.
Schreibrouting prüfen (aktiver primärer Knoten): Fragen Sie Port 6446 (Classic RW) ab. Es sollte ausschließlich der Hostname des aktuellen Primärservers zurückgegeben werden.
mysql -u root -pyour_new_secure_password -h 127.0.0.1 -P 6446 -e "SELECT @@hostname;"Lesebalancing (Round-Robin) prüfen: Fragen Sie Port 6447 (Classic RO) mehrmals ab. Es sollte die Hostnamen aller verfügbaren Knoten im Cluster durchlaufen.
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: Prüfen Sie mit der MySQL-Shell, ob alle Mitglieder
ONLINEund korrekt ausbalanciert sind.mysqlsh --uri root@localhost --cluster # inside the shell > cluster.status()
Globalen Load Balancer einrichten
Stellen Sie eine einzelne, stabile virtuelle IP-Adresse (VIP) für Ihre Anwendungen bereit, indem Sie den GDC Global L4 Load Balancer verwenden. 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.
Automatisierte Failover-Überprüfung
Mit diesem Test wird bestätigt, dass der Cluster einen neuen Leader auswählt und der Router den Traffic ohne manuelles Eingreifen umleitet.
Primären Fehler simulieren
Ermitteln Sie die aktuelle primäre Instanz (z.B. Knoten 1) und beenden Sie den MySQL-Dienst:
sudo systemctl stop mysql
Wahl und Routingumstellung überprüfen
Warten Sie 10–20 Sekunden, bis das Konsensprotokoll einen neuen Leader ausgewählt hat.
Clusterstatus prüfen: Prüfen Sie auf VM 2 oder 3, ob ein neuer primärer Knoten ausgewählt wurde.
mysqlsh --uri root@localhost --cluster # inside the shell > cluster.status()Prüfen Sie, ob einer der verbleibenden Knoten als
PRIMARYund der fehlerhafte Knoten alsUNREACHABLEoderMISSINGmarkiert ist.Schreibrouting prüfen: Testen Sie den RW-Port (6446) noch einmal. Es sollte jetzt der Hostname der neuen primären Instanz zurückgegeben werden.
mysql -u root -p -h 127.0.0.1 -P 6446 -e "SELECT @@hostname;"Globale VIP-Verbindung testen: Fragen Sie die globale VIP von einem Anwendungsserver ab.
mysql -u root -p -h ${LB_IP} -P 3306 -e "SELECT @@hostname;"
Wiederherstellen und erneuten Beitritt bestätigen
Starten Sie den MySQL-Dienst auf dem ausgefallenen Knoten und prüfen Sie, ob er als sekundäres Replikat wieder hinzugefügt wird.
sudo systemctl start mysql
mysqlsh --uri root@localhost --cluster -e "cluster.status()"
Prüfen Sie, ob alle drei Knoten den Status ONLINE zurückgeben.