Este guia é um tutorial completo para implantar um cluster do InnoDB do MySQL 8.4 altamente disponível em três zonas de disponibilidade em um ambiente com isolamento físico do Google Distributed Cloud (GDC). Essa arquitetura usa a replicação de grupo para consenso baseado em Paxos, o roteador MySQL para roteamento de conexão inteligente e o shell MySQL para orquestração de cluster.
Ao usar estritamente máquinas virtuais (VMs), essa implementação ignora as limitações do GDC com isolamento físico em relação a clusters estendidos do Kubernetes entre zonas, garantindo resiliência total em várias zonas sem risco de perda de dados.
Este é o diagrama de arquitetura:

Antes de começar
Implantar VMs
Siga as instruções em Criar e iniciar uma instância de VM para criar três VMs nas três zonas disponíveis.
Configure o ambiente local para estabelecer uma conexão SSH com as VMs usando um par de chaves: Conectar-se a uma VM
Isso é necessário para usar a cópia segura (SCP) para transferir os pacotes: Transferir arquivos
Para a verificação, usamos o SO Ubuntu 22.04 e o tipo de máquina n3-standard-2-gdc.
Para um ambiente de produção, use um tipo de máquina com mais recursos.
Consiga os IPs das VMs usando:
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}"
Configure as variáveis de ambiente
Defina estas variáveis na sessão de shell da estação de trabalho local:
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"
Configuração de rede
Se você precisar acessar o banco de dados fora do projeto ou da organização, configure a PNP (política de rede do projeto) de acordo.
Siga as seções de Visão geral do PNP, dependendo do caso de uso.
Preparação de software com isolamento físico
Fazer o download de pacotes usando o Docker
Execute o seguinte comando em uma estação de trabalho conectada para buscar os componentes do MySQL 8.4 e do 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')
"
Transferir e instalar
Faça upload dos arquivos .deb para /tmp/packages/ nas três VMs e instale:
# From workstation: scp ./mysql-packages/*.deb ${VM_IP}:/tmp/packages/
# On each VM:
sudo dpkg -i /tmp/packages/*.deb
Verifique se o dpkg não retorna erros. Se isso acontecer, verifique os registros para ver quais
pacotes deb estão faltando e inclua-os no download.
Quando for solicitado que você defina a senha raiz, deixe em branco. Vamos definir a senha mais tarde.
Configuração do nó do MySQL
Configurar o MySQL para uso do cluster
Edite /etc/mysql/mysql.conf.d/mysqld.cnf em todos os nós para ativar GTIDs e
a geração de registros binários:
[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
Reinicie o serviço:
sudo systemctl restart mysql
Em seguida, conecte-se ao banco de dados:
sudo mysql
e defina a senha raiz:
CREATE USER 'root'@'%' IDENTIFIED WITH 'caching_sha2_password' BY 'your_new_secure_password';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
Inicialização e verificação do cluster do InnoDB
Criar cluster usando o shell do MySQL
SOMENTE na VM 1, use o shell do MySQL para inicializar o 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()
Inicializar o roteador MySQL
Nas três VMs, inicialize o roteador para detectar o novo cluster:
sudo mysqlrouter --bootstrap root@VM1_IP --user=mysqlrouter
sudo systemctl restart mysqlrouter
sudo systemctl enable mysqlrouter
Verificar o balanceamento e as conexões
Execute esses comandos em qualquer nó para garantir que o roteador esteja distribuindo o tráfego corretamente.
Verificar o roteamento de gravação (primário ativo): consulte a porta 6446 (RW clássico). Ele precisa retornar estritamente o nome do host da instância principal atual.
mysql -u root -pyour_new_secure_password -h 127.0.0.1 -P 6446 -e "SELECT @@hostname;"Verifique o balanceamento de leitura (Round-Robin): consulte a porta 6447 (RO clássica) várias vezes. Ele deve percorrer os nomes de host de todos os nós disponíveis no cluster.
for i in {1..4}; do mysql -u root -pyour_new_secure_password -h 127.0.0.1 -P 6447 -e "SELECT @@hostname;"; doneVerifique a topologia da conexão: use o shell do MySQL para confirmar se todos os membros estão
ONLINEe balanceados corretamente.mysqlsh --uri root@localhost --cluster # inside the shell > cluster.status()
Configuração do balanceador de carga global
Forneça um único IP virtual (VIP) estável para seus aplicativos usando o balanceador de carga global L4 do GDC. Siga as instruções em Configurar balanceadores de carga globais internos para configurar o balanceador de carga L4 global interno e as VMs para serem o destino dele: Configurar VMs como destino do balanceador de carga.
Verificação de failover automatizada
Esse teste confirma que o cluster elege um novo líder e o roteador redireciona o tráfego sem intervenção manual.
Simular falha primária
Identifique o primário atual (por exemplo, Nó 1) e interrompa o serviço do MySQL:
sudo systemctl stop mysql
Verificar a eleição e a mudança de roteamento
Aguarde de 10 a 20 segundos para que o protocolo de consenso eleja um novo líder.
Verificar o status do cluster: na VM 2 ou 3, verifique se uma nova instância principal foi eleita.
mysqlsh --uri root@localhost --cluster # inside the shell > cluster.status()Confirme se um dos nós restantes está marcado como
PRIMARYe se o nó com falha está marcado comoUNREACHABLEouMISSING.Verificar o roteamento de gravação: teste a porta RW (6446) novamente. Agora, ele deve retornar o nome do host da nova instância principal.
mysql -u root -p -h 127.0.0.1 -P 6446 -e "SELECT @@hostname;"Testar a conectividade do VIP global: em um servidor de aplicativos, consulte o VIP global.
mysql -u root -p -h ${LB_IP} -P 3306 -e "SELECT @@hostname;"
Recuperar e verificar a reintegração
Inicie o serviço do MySQL no nó com falha e verifique se ele se junta novamente como uma réplica secundária.
sudo systemctl start mysql
mysqlsh --uri root@localhost --cluster -e "cluster.status()"
Confirme se os três nós retornam o status ONLINE.