MySQL-Datenbank-Referenzimplementierung in GDC mit Air Gap

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:

Architektur mit drei VMs, auf denen ein Stack von Diensten am selben Standort ausgeführt wird.

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.

  1. 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;"
    
  2. 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;"; done
    
  3. Verbindungstopologie prüfen: Prüfen Sie mit der MySQL-Shell, ob alle Mitglieder ONLINE und 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.

  1. 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 PRIMARY und der fehlerhafte Knoten als UNREACHABLE oder MISSING markiert ist.

  2. 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;"
    
  3. 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.