O que e Replicacao
Replicacao (Replication) e um mecanismo que copia e sincroniza dados do banco de dados em multiplos servidores. E utilizada para melhorar a disponibilidade, aumentar a performance de leitura e protecao contra desastres.
Por que e necessario: Um unico servidor de banco de dados se torna um ponto unico de falha (SPOF). Com replicacao, o servico pode continuar em caso de falhas e as consultas de leitura podem ser distribuidas.
Configuracao Basica de Replicacao
Master-Slave (Primario-Replica)
flowchart TB
M["Master (Primary)<br/>← Escrita"]
M -->|Replicacao| S1["Slave 1 (Replica)<br/>← Leitura"]
M -->|Replicacao| S2["Slave 2 (Replica)<br/>← Leitura"]
M -->|Replicacao| S3["Slave 3 (Replica)<br/>← Leitura"]
- Master (Primary): Servidor principal que recebe as escritas
- Slave (Replica): Copia os dados do master e e responsavel pelas leituras
Multi-Master
flowchart LR
M1["Master 1"] <-->|Replicacao| M2["Master 2"]
M1 --> RW1["Leitura/Escrita"]
M2 --> RW2["Leitura/Escrita"]
Multiplos masters aceitam escritas. A resolucao de conflitos se torna um desafio.
Replicacao Sincrona vs Assincrona
Replicacao Sincrona
sequenceDiagram
participant C as Cliente
participant M as Master
participant S as Slave
C->>M: Escrita
M->>S: Replicacao
S->>M: ACK
M->>C: Resposta
| Vantagens | Desvantagens |
|---|---|
| Sem perda de dados | Aumento da latencia |
| Consistencia forte | Escrita para se o slave falhar |
Replicacao Assincrona
sequenceDiagram
participant C as Cliente
participant M as Master
participant S as Slave
C->>M: Escrita
M->>C: Resposta
M-->>S: Replicacao (aplicada depois)
| Vantagens | Desvantagens |
|---|---|
| Baixa latencia | Lag de replicacao |
| Sem impacto de falha do slave | Possibilidade de perda de dados |
Replicacao Semi-sincrona
Confirma o commit quando pelo menos um slave recebe os dados.
sequenceDiagram
participant C as Cliente
participant M as Master
participant S1 as Slave 1
participant S2 as Slave 2
C->>M: Escrita
M->>S1: Replicacao
S1->>M: ACK
M->>C: Resposta
M-->>S2: Replicacao (aplicada depois)
Metodos de Replicacao
Baseado em Instrucoes
Replica as proprias instrucoes SQL.
-- Executado no master
INSERT INTO users (name, created_at) VALUES ('Alice', NOW());
-- O mesmo SQL e executado no slave
-- Problema: O resultado de NOW() pode ser diferente
Baseado em Linhas
Replica os proprios dados das linhas alteradas.
flowchart LR
Before["{id: 1, name: 'Alice'}"] --> Change["Alteracao"] --> After["{id: 1, name: 'Bob'}"]
After --> Apply["Esta diferenca e aplicada no slave"]
Modo Misto
Normalmente usa baseado em instrucoes, mas usa baseado em linhas quando inclui funcoes nao deterministicas.
Lag de Replicacao
E o atraso ate que o slave alcance o master.
flowchart LR
subgraph Master["Master"]
MT["Transacao 1, 2, 3, 4, 5 ✓"]
end
subgraph Slave["Slave (Lag: 2 transacoes)"]
ST["Transacao 1, 2, 3 ✓"]
end
Master -.-> Slave
Casos em que o Lag se Torna Problema
// Leitura imediatamente apos a escrita
await db.master.query('UPDATE users SET name = ? WHERE id = ?', ['Bob', 1]);
// Leitura do slave → Pode retornar dados antigos
const user = await db.slave.query('SELECT * FROM users WHERE id = ?', [1]);
// user.name ainda pode ser 'Alice'!
Contramedidas
- Read Your Writes: Ler do master imediatamente apos a escrita
- Causal Consistency: Rastrear o timestamp da escrita
- Replicacao Sincrona: Apenas para dados criticos
Failover
Quando ocorre falha no master, promove um slave para master.
Failover Automatico
flowchart TB
A["1. Deteccao de falha no master<br/>Sistema de monitoramento detecta ausencia de resposta do master"]
B["2. Selecao do slave<br/>Seleciona o slave com replicacao mais avancada"]
C["3. Processo de promocao<br/>Promove o slave selecionado para master"]
D["4. Troca<br/>Altera a conexao da aplicacao para o novo master"]
A --> B --> C --> D
Pontos de Atencao no Failover
| Desafio | Contramedida |
|---|---|
| Split brain | Fencing (desligamento forcado do antigo master) |
| Perda de dados | Transacoes nao aplicadas em replicacao assincrona |
| Troca de conexao | IP virtual, atualizacao de DNS, proxy |
Implementacoes Representativas
MySQL
-- Configuracao do master
CHANGE MASTER TO
MASTER_HOST='master.example.com',
MASTER_USER='repl_user',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=4;
START SLAVE;
PostgreSQL
# postgresql.conf (master)
wal_level = replica
max_wal_senders = 3
# recovery.conf (slave)
standby_mode = 'on'
primary_conninfo = 'host=master.example.com port=5432'
Servicos Gerenciados
| Servico | Funcionalidade de Replica |
|---|---|
| Amazon RDS | Read Replica, Multi-AZ |
| Cloud SQL | Read Replica, configuracao de alta disponibilidade |
| Azure SQL | geo-replication |
Padrao de Escalabilidade de Leitura
flowchart LR
App["App"]
App --> M["Master<br/>(Escrita)"]
App --> LB["Load Balancer"]
LB --> R1["Replica 1"]
LB --> R2["Replica 2"]
LB --> R3["Replica 3"]
subgraph Read["Leitura"]
R1
R2
R3
end
O load balancer distribui as consultas de leitura entre as replicas.
Resumo
A replicacao de banco de dados e uma tecnologia fundamental para alcançar alta disponibilidade e escalabilidade de leitura. Ao projetar adequadamente a escolha entre sincrono/assincrono, tratamento do lag de replicacao e estrategia de failover, e possivel construir um sistema de banco de dados robusto.
← Voltar para a lista