Replicacao de Banco de Dados - Alcancando Disponibilidade e Escalabilidade

15 min leitura | 2025.12.15

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
VantagensDesvantagens
Sem perda de dadosAumento da latencia
Consistencia forteEscrita 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)
VantagensDesvantagens
Baixa latenciaLag de replicacao
Sem impacto de falha do slavePossibilidade 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

DesafioContramedida
Split brainFencing (desligamento forcado do antigo master)
Perda de dadosTransacoes nao aplicadas em replicacao assincrona
Troca de conexaoIP 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

ServicoFuncionalidade de Replica
Amazon RDSRead Replica, Multi-AZ
Cloud SQLRead Replica, configuracao de alta disponibilidade
Azure SQLgeo-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