Declaração do Problema
Precisa de garantir que a sua base de dados consegue lidar com falhas, disponibilizar escalabilidade de leitura e manter a durabilidade dos dados em vários servidores ou regiões.
Quando Utilizar Cada Padrão
| Padrão | Caso de Utilização | Compromissos |
|---|
| Primary-Replica | Escalabilidade de leitura, failover simples | Atraso de replicação, failover manual |
| Multi-Primary | Escalabilidade de escrita, distribuição geográfica | Complexidade na resolução de conflitos |
| Synchronous | Zero perda de dados | Escritas mais lentas, requer baixa latência |
| Asynchronous | Maior desempenho | Potencial perda de dados em caso de falha |
Replicação MySQL/Percona
Passo 1: Configurar o Servidor Primary
Edite /etc/my.cnf:
[mysqld]
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog_format = ROW
binlog_do_db = myapp_production
sync_binlog = 1
innodb_flush_log_at_trx_commit = 1
# Replicação baseada em GTID (recomendada)
gtid_mode = ON
enforce_gtid_consistency = ON
Crie o utilizador de replicação:
CREATE USER 'replicator'@'replica-host' IDENTIFIED BY 'secure_password';
GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'replica-host';
FLUSH PRIVILEGES;
Passo 2: Configurar o Servidor Replica
Edite /etc/my.cnf:
[mysqld]
server-id = 2
relay_log = /var/log/mysql/mysql-relay-bin.log
log_bin = /var/log/mysql/mysql-bin.log
binlog_format = ROW
read_only = ON
# Replicação baseada em GTID
gtid_mode = ON
enforce_gtid_consistency = ON
Passo 3: Inicializar a Replicação
Na réplica:
CHANGE MASTER TO
MASTER_HOST = 'primary-host',
MASTER_USER = 'replicator',
MASTER_PASSWORD = 'secure_password',
MASTER_AUTO_POSITION = 1;
START SLAVE;
Passo 4: Verificar o Estado da Replicação
SHOW SLAVE STATUS\G
Verifique:
SlaveIORunning: YesSlaveSQLRunning: YesSecondsBehindMaster: 0 (ou próximo de 0)
Replicação Semi-Synchronous
Para garantias de durabilidade mais fortes:
No primary:
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
SET GLOBAL rpl_semi_sync_master_enabled = 1;
SET GLOBAL rpl_semi_sync_master_timeout = 1000; -- 1 segundo
Na réplica:
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
STOP SLAVE IO_THREAD;
START SLAVE IO_THREAD;
Replicação Streaming do PostgreSQL
Passo 1: Configurar o Servidor Primary
Edite postgresql.conf:
wal_level = replica
max_wal_senders = 5
wal_keep_size = 1GB
synchronous_commit = on
synchronous_standby_names = 'standby1' # Para replicação síncrona
Edite pg_hba.conf:
host replication replicator replica-ip/32 scram-sha-256
Crie o utilizador de replicação:
CREATE ROLE replicator WITH REPLICATION LOGIN PASSWORD 'secure_password';
Passo 2: Criar Base Backup
Na réplica:
pg_basebackup -h primary-host -U replicator -D /var/lib/pgsql/data -Fp -Xs -P -R
A flag -R cria standby.signal e configura postgresql.auto.conf.
Passo 3: Configurar a Replica
Edite postgresql.conf (se necessário):
hot_standby = on
primary_conninfo = 'host=primary-host user=replicator password=secure_password'
Passo 4: Iniciar a Replica e Verificar
systemctl start postgresql
# No primary, verificar réplicas ligadas
SELECT * FROM pg_stat_replication;
# Na réplica, verificar o estado de recovery
SELECT pg_is_in_recovery();
Failover Automático com Patroni
Para produção, utilize o Patroni para failover automático:
# patroni.yml
scope: postgres-cluster
namespace: /service/
name: node1
restapi:
listen: 0.0.0.0:8008
connect_address: node1:8008
etcd:
hosts: etcd1:2379,etcd2:2379,etcd3:2379
bootstrap:
dcs:
ttl: 30
loop_wait: 10
retry_timeout: 10
maximum_lag_on_failover: 1048576
postgresql:
use_pg_rewind: true
parameters:
wal_level: replica
hot_standby: "on"
max_wal_senders: 5
max_replication_slots: 5
postgresql:
listen: 0.0.0.0:5432
connect_address: node1:5432
data_dir: /var/lib/postgresql/data
authentication:
replication:
username: replicator
password: secure_password
superuser:
username: postgres
password: admin_password
Replicação MySQL em Kubernetes
Utilizar o Percona Operator
apiVersion: pxc.percona.com/v1
kind: PerconaXtraDBCluster
metadata:
name: mysql-cluster
spec:
crVersion: 1.13.0
secretsName: mysql-secrets
pxc:
size: 3
image: percona/percona-xtradb-cluster:8.0
resources:
requests:
memory: 1G
cpu: 600m
volumeSpec:
persistentVolumeClaim:
resources:
requests:
storage: 100Gi
haproxy:
enabled: true
size: 2
image: percona/percona-xtradb-cluster-operator:1.13.0-haproxy
proxysql:
enabled: false
String de Ligação
mysql://user:password@mysql-cluster-haproxy:3306/database
Replicação PostgreSQL em Kubernetes
Utilizar o CloudNativePG Operator
apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
name: postgres-cluster
spec:
instances: 3
postgresql:
parameters:
max_connections: "300"
shared_buffers: "256MB"
storage:
size: 100Gi
storageClass: fast-ssd
backup:
barmanObjectStore:
destinationPath: s3://backups/postgres
s3Credentials:
accessKeyId:
name: s3-creds
key: ACCESS_KEY_ID
secretAccessKey:
name: s3-creds
key: SECRET_ACCESS_KEY
Monitorização da Replicação
Métricas-Chave a Monitorizar
- Atraso de Replicação
``` sql -- MySQL SHOW SLAVE STATUS\G -- Verificar SecondsBehindMaster
-- PostgreSQL SELECT clientaddr, state, sentlsn, writelsn, flushlsn, replaylsn, pgwallsndiff(sentlsn, replaylsn) AS lagbytes FROM pgstat_replication; ```
- Estado da Ligação
`` sql -- MySQL: Verificar SlaveIORunning e SlaveSQLRunning -- PostgreSQL: Verificar o estado em pgstatreplication ``
- Posição do Binary Log/WAL
Regras de Alerting
# Regras de alerting do Prometheus
groups:
- name: database-replication
rules:
- alert: ReplicationLagHigh
expr: mysql_slave_seconds_behind_master > 60
for: 5m
labels:
severity: warning
annotations:
summary: "MySQL replication lag is {{ $value }} seconds"
- alert: ReplicationStopped
expr: mysql_slave_sql_running == 0 OR mysql_slave_io_running == 0
for: 1m
labels:
severity: critical
annotations:
summary: "MySQL replication has stopped"
Procedimentos de Failover
Failover Manual (MySQL)
- Parar as escritas no primary
`` sql SET GLOBAL read_only = ON; FLUSH TABLES WITH READ LOCK; ``
- Garantir que a réplica está sincronizada
`` sql -- Na réplica SHOW SLAVE STATUS\G -- Aguardar por SecondsBehindMaster = 0 ``
- Promover a réplica
`` sql STOP SLAVE; RESET SLAVE ALL; SET GLOBAL read_only = OFF; ``
- Atualizar as strings de ligação da aplicação
Failover Manual (PostgreSQL)
- Promover o standby
`` bash pgctl promote -D /var/lib/pgsql/data # Ou SELECT pgpromote(); ``
- Reconfigurar o antigo primary como standby (se recuperado)
Checklist de Boas Práticas
- [ ] Utilizar replicação baseada em GTID (MySQL) para facilitar o failover
- [ ] Configurar monitorização do atraso de replicação
- [ ] Testar regularmente os procedimentos de failover
- [ ] Utilizar replicação semi-synchronous para dados críticos
- [ ] Manter binlogs/WAL retidos tempo suficiente para recuperação
- [ ] Documentar e automatizar os procedimentos de failover
- [ ] Utilizar connection pooling (PgBouncer, ProxySQL)
- [ ] Configurar read replicas na aplicação para escalabilidade de leitura
- [ ] Fazer backup tanto do primary como das réplicas
- [ ] Monitorizar o espaço em disco para logs e dados
Artigos Wiki Relacionados