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.
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 degradadowsrep_local_state_comment != 'Synced': nó fora de sincroniawsrep_flow_control_paused > 0.1: throttling de escrita (nó lento)wsrep_cert_deps_distancemuito 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.
