Pular para o conteúdo
banco-de-dados

MySQL Alta Disponibilidade com Percona XtraDB Cluster

Como configurar um cluster MySQL de alta disponibilidade com Percona XtraDB Cluster: arquitetura, instalação, replicação síncrona e failover automático.

Douglas M. Pereira3 min de leitura
mysqlperconaalta disponibilidadeclusterbanco de dados

Por que alta disponibilidade em banco de dados é diferente

Replicação tradicional MySQL (master-slave) resolve leitura, mas não resolve failover automático. Se o master cair, você precisa promover um slave manualmente — o que em produção significa minutos de downtime.

O Percona XtraDB Cluster (PXC) usa replicação síncrona multi-master com Galera Replication, garantindo que todos os nós tenham os dados em tempo real e que qualquer nó possa receber escritas.

Arquitetura do Percona XtraDB Cluster

                    ┌─────────────────┐
                    │  HAProxy / ProxySQL │
                    └────────┬────────┘
                             │
           ┌─────────────────┼─────────────────┐
           │                 │                 │
     ┌─────▼─────┐     ┌─────▼─────┐     ┌─────▼─────┐
     │  Node 1   │◄───►│  Node 2   │◄───►│  Node 3   │
     │ PXC 8.0   │     │ PXC 8.0   │     │ PXC 8.0   │
     └───────────┘     └───────────┘     └───────────┘
     
     Replicação síncrona Galera (wsrep)

Mínimo de 3 nós para quorum. Com 2 nós, se um cair, o cluster não sabe se deve continuar operando (split-brain).

Instalação no Ubuntu 22.04

Configurar repositório Percona

wget https://repo.percona.com/apt/percona-release_latest.generic_all.deb
sudo dpkg -i percona-release_latest.generic_all.deb
sudo percona-release enable-only pxc-80 release
sudo apt update
sudo apt install -y percona-xtradb-cluster

Configuração do primeiro nó (bootstrap)

# /etc/mysql/mysql.conf.d/pxc.cnf

[mysqld]
server-id=1
binlog_format=ROW
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2

# Galera Provider
wsrep_on=ON
wsrep_provider=/usr/lib/galera4/libgalera_smm.so
wsrep_provider_options="gcache.size=300M; gcache.page_size=200M"

# Galera Cluster
wsrep_cluster_name=prod_cluster
wsrep_cluster_address="gcomm://10.0.0.1,10.0.0.2,10.0.0.3"

# Node-specific
wsrep_node_name=node1
wsrep_node_address="10.0.0.1"

# SST (State Snapshot Transfer)
wsrep_sst_method=xtrabackup-v2

Bootstrap do primeiro nó

# Apenas no primeiro nó, para inicializar o cluster
sudo systemctl start mysql@bootstrap.service

Verificação do status

SHOW STATUS LIKE 'wsrep%';

-- Verificar:
-- wsrep_cluster_size = 3 (quando todos os nós estiverem up)
-- wsrep_local_state_comment = Synced
-- wsrep_cluster_status = Primary

Monitoramento essencial

Queries que todo DBA deve ter

-- Estado do cluster
SELECT VARIABLE_NAME, VARIABLE_VALUE
FROM performance_schema.global_status
WHERE VARIABLE_NAME IN (
  'wsrep_cluster_size',
  'wsrep_cluster_status',
  'wsrep_local_state_comment',
  'wsrep_connected',
  'wsrep_ready'
);

-- Verificar lag de replicação
SELECT VARIABLE_VALUE as flow_control_paused
FROM performance_schema.global_status
WHERE VARIABLE_NAME = 'wsrep_flow_control_paused';

Alertas recomendados

  • wsrep_cluster_size < 3: cluster degradado
  • wsrep_local_state_comment != 'Synced': nó fora de sincronia
  • wsrep_flow_control_paused > 0.1: throttling de escrita (nó lento)
  • wsrep_cert_deps_distance muito alto: transações conflitantes

ProxySQL para balanceamento e failover

-- Configurar hostgroup de escritas (apenas nós Synced)
INSERT INTO mysql_servers (hostgroup_id, hostname, port) VALUES
  (10, '10.0.0.1', 3306),
  (10, '10.0.0.2', 3306),
  (10, '10.0.0.3', 3306);

-- Writer hostgroup: 10, Reader hostgroup: 20
-- ProxySQL monitora wsrep_local_state_comment automaticamente
-- e remove nós não-Synced do grupo ativo

Considerações de performance

Write amplification

Em PXC, cada escrita precisa ser aplicada em todos os nós. Para workloads de escrita intensiva, isso tem custo. Mitigações:

  • wsrep_slave_threads: paralelizar aplicação de writes nos nós
  • Agrupamento de transações pequenas
  • Evitar transações longas

Conflitos de certificação

Writes simultâneos nas mesmas linhas em nós diferentes geram conflito — um deles é abortado. Aplique lógica de retry nas aplicações:

import time

def execute_with_retry(conn, query, params, max_retries=3):
    for attempt in range(max_retries):
        try:
            conn.execute(query, params)
            conn.commit()
            return
        except Exception as e:
            if 'wsrep' in str(e).lower() and attempt < max_retries - 1:
                time.sleep(0.1 * (attempt + 1))
                continue
            raise

Backup no PXC

Use xtrabackup — não dump SQL em produção:

xtrabackup --backup \
  --host=127.0.0.1 \
  --user=backup_user \
  --password=senha \
  --target-dir=/backup/$(date +%Y%m%d_%H%M%S)

Conclusão

Percona XtraDB Cluster entrega alta disponibilidade real para MySQL: failover automático, replicação síncrona e sem ponto único de falha. A complexidade operacional é maior que o MySQL standalone, mas para aplicações que não podem perder dados e precisam de uptime de 99.9%+, é o caminho correto.