MySQL-Datenbank-Referenzimplementierung in GDC mit Air Gap

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:

Architektur mit drei VMs, auf denen ein gemeinsam genutzter Stapel von Diensten 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

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.

  1. 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;"
    
  2. 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;"; done
    
  3. Verbindungstopologie prüfen: Verwenden Sie MySQL Shell, um zu bestätigen, dass alle Mitglieder ONLINE sind 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.

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

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