Sobre nós Guias Projetos Contactos
Админка
please wait

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ãoCaso de UtilizaçãoCompromissos
Primary-ReplicaEscalabilidade de leitura, failover simplesAtraso de replicação, failover manual
Multi-PrimaryEscalabilidade de escrita, distribuição geográficaComplexidade na resolução de conflitos
SynchronousZero perda de dadosEscritas mais lentas, requer baixa latência
AsynchronousMaior desempenhoPotencial 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: Yes
  • SlaveSQLRunning: Yes
  • SecondsBehindMaster: 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

  1. 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; ```

  1. Estado da Ligação

`` sql -- MySQL: Verificar SlaveIORunning e SlaveSQLRunning -- PostgreSQL: Verificar o estado em pgstatreplication ``

  1. 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)

  1. Parar as escritas no primary

`` sql SET GLOBAL read_only = ON; FLUSH TABLES WITH READ LOCK; ``

  1. Garantir que a réplica está sincronizada

`` sql -- Na réplica SHOW SLAVE STATUS\G -- Aguardar por SecondsBehindMaster = 0 ``

  1. Promover a réplica

`` sql STOP SLAVE; RESET SLAVE ALL; SET GLOBAL read_only = OFF; ``

  1. Atualizar as strings de ligação da aplicação

Failover Manual (PostgreSQL)

  1. Promover o standby

`` bash pgctl promote -D /var/lib/pgsql/data # Ou SELECT pgpromote(); ``

  1. 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

 
 
 
Языки
Темы
Copyright © 1999 — 2026
ZK Interactive