Implémentation de référence de la base de données MySQL sur GDC sous air gap

Ce guide fournit un tutoriel complet et détaillé pour déployer un cluster MySQL 8.4 InnoDB à disponibilité élevée dans trois zones de disponibilité d'un environnement isolé Google Distributed Cloud (GDC). Cette architecture exploite Group Replication pour le consensus basé sur Paxos, MySQL Router pour le routage intelligent des connexions et MySQL Shell pour l'orchestration des clusters.

En utilisant strictement des machines virtuelles (VM), cette implémentation contourne les limites de GDC sous air gap concernant les clusters Kubernetes étendus entre les zones, ce qui garantit une résilience multizone complète sans risque de perte de données.

Voici le diagramme de l'architecture :

Architecture à trois VM qui exécute une pile de services colocalisés.

Avant de commencer

Déployer des VM

Suivez la procédure Créer et démarrer une instance de VM pour créer trois VM dans les trois zones disponibles.

Configurez votre environnement local pour établir une connexion SSH aux VM avec une paire de clés : Se connecter à une VM

Cela est nécessaire pour utiliser la copie sécurisée (SCP) afin de transférer les packages: Transférer des fichiers

Pour la validation, nous avons utilisé le système d'exploitation Ubuntu 22.04 et le type de machine n3-standard-2-gdc. Pour un environnement de production, utilisez un type de machine avec plus de ressources.

Obtenez les adresses IP des VM à l'aide de la commande suivante :

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}"

Configurer les variables d'environnement

Définissez ces variables dans la session shell de votre station de travail locale :

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"

Configuration du réseau

Si vous devez accéder à la base de données en dehors du projet ou de l'organisation, n'oubliez pas de configurer la PNP (Project Network Policy) en conséquence.

Suivez les sections de la présentation de la PNP en fonction du cas d'utilisation.

Préparation des logiciels isolés

Télécharger des packages à l'aide de Docker

Exécutez la commande suivante à partir d'une station de travail connectée pour extraire les composants MySQL 8.4 et 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')
"

Transférer et installer

Importez les fichiers .deb dans /tmp/packages/ sur les trois VM et installez-les :

# From workstation: scp ./mysql-packages/*.deb ${VM_IP}:/tmp/packages/
# On each VM:
sudo dpkg -i /tmp/packages/*.deb

Assurez-vous que dpkg ne renvoie aucune erreur. Si c'est le cas, consultez les journaux pour voir quels packages deb vous manquent et incluez-les dans le téléchargement.

Lorsque vous êtes invité à définir le mot de passe racine, laissez le champ vide. Nous le définirons ultérieurement.

Configuration des nœuds MySQL

Configurer MySQL pour l'utilisation du cluster

Modifiez /etc/mysql/mysql.conf.d/mysqld.cnf sur tous les nœuds pour activer les GTID et la journalisation binaire :

[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

Redémarrez le service.

sudo systemctl restart mysql

Connectez-vous ensuite à la base de données :

sudo mysql

et définissez le mot de passe racine :

CREATE USER 'root'@'%' IDENTIFIED WITH 'caching_sha2_password' BY 'your_new_secure_password';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;

Initialisation et validation du cluster InnoDB

Créer un cluster à l'aide de MySQL Shell

UNIQUEMENT SUR LA VM 1, utilisez MySQL Shell pour initialiser le cluster :

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()

Amorcer MySQL Router

Sur les trois VM, amorcez le routeur pour détecter le nouveau cluster :

sudo mysqlrouter --bootstrap root@VM1_IP --user=mysqlrouter
sudo systemctl restart mysqlrouter
sudo systemctl enable mysqlrouter

Vérifier l'équilibrage et les connexions

Exécutez ces commandes à partir de n'importe quel nœud pour vous assurer que le routeur distribue correctement le trafic.

  1. Vérifier le routage en écriture (primaire actif) : interrogez le port 6446 (RW classique). Il doit renvoyer strictement le nom d'hôte du primaire actuel.

    mysql -u root -pyour_new_secure_password -h 127.0.0.1 -P 6446 -e "SELECT @@hostname;"
    
  2. Vérifier l'équilibrage en lecture (tourniquet) : interrogez le port 6447 (RO classique) plusieurs fois. Il doit parcourir les noms d'hôte de tous les nœuds disponibles dans le cluster.

    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. Vérifier la topologie de connexion : utilisez MySQL Shell pour vérifier que tous les membres sont ONLINE et correctement équilibrés.

    mysqlsh --uri root@localhost --cluster
    
    # inside the shell
    > cluster.status()
    

Configuration de l'équilibreur de charge mondial

Fournissez une adresse IP virtuelle (VIP) unique et stable pour vos applications à l'aide de l'équilibreur de charge mondial L4 de GDC. Suivez la procédure Configurer des équilibreurs de charge mondiaux internes pour configurer l'équilibreur de charge mondial L4 interne et configurer vos VM pour qu'elles en soient la cible : Configurer des VM comme cible d'équilibreur de charge.

Validation du basculement automatique

Ce test confirme que le cluster élit un nouveau leader et que le routeur redirige le trafic sans intervention manuelle.

Simuler une défaillance primaire

Identifiez le primaire actuel (par exemple, le nœud 1) et arrêtez le service MySQL :

sudo systemctl stop mysql

Vérifier l'élection et le changement de routage

Attendez 10 à 20 secondes que le protocole de consensus élise un nouveau leader.

  1. Vérifier l'état du cluster : à partir de la VM 2 ou 3, vérifiez qu'un nouveau primaire a été élu.

    mysqlsh --uri root@localhost --cluster
    
    # inside the shell
    > cluster.status()
    

    Vérifiez que l'un des nœuds restants est marqué comme PRIMARY et que le nœud défaillant est marqué comme UNREACHABLE ou MISSING.

  2. Vérifier le routage en écriture : testez à nouveau le port RW (6446). Il doit maintenant renvoyer le nom d'hôte du nouveau primaire.

    mysql -u root -p -h 127.0.0.1 -P 6446 -e "SELECT @@hostname;"
    
  3. Tester la connectivité VIP mondiale : à partir d'un serveur d'applications, interrogez la VIP mondiale.

    mysql -u root -p -h ${LB_IP} -P 3306 -e "SELECT @@hostname;"
    

Récupérer et vérifier la réintégration

Démarrez le service MySQL sur le nœud défaillant et vérifiez qu'il se réintègre en tant qu'instance dupliquée secondaire.

sudo systemctl start mysql
mysqlsh --uri root@localhost --cluster -e "cluster.status()"

Vérifiez que les trois nœuds renvoient l'état ONLINE.