Pular para o conteúdo principal

Conceitointermediário

Replicação para Escala

Visão Geral

Replicar é manter cópias dos dados em mais nós. Para escala, ela resolve um problema específico e não resolve outro:

escala de leitura sim — cada réplica atende leituras
escala de escrita não — toda escrita vai para todas as réplicas

Os fundamentos estão em replicação e replicação de dados. Aqui interessa o cálculo de escala e o que ele revela sobre o limite.

Problema

A maioria dos sistemas tem proporção de leitura para escrita de 10 para 1 ou mais. Isso torna a replicação a resposta natural: adicionar réplicas multiplica a capacidade de leitura sem tocar no modelo.

O que a torna insuficiente sozinha é a assimetria: cada réplica adicionada aumenta a capacidade de leitura e não muda em nada a de escrita — porque toda escrita continua indo para todas as cópias.

Existe um ponto em que a escrita satura, e nenhuma quantidade de réplicas ajuda.

Conceitos Centrais

A amplificação de escrita

1 primário, 0 réplicas → 1 escrita por operação
1 primário, 5 réplicas → 6 escritas por operação
1 primário, 20 réplicas → 21 escritas por operação

Cada réplica precisa aplicar todas as escritas. O trabalho total de escrita cresce linearmente com o número de cópias, enquanto a capacidade de escrita por nó permanece a mesma.

A consequência prática: acima de certo número de réplicas, elas passam a gastar a maior parte da capacidade aplicando replicação, e sobra pouco para servir leitura.

Isso define o teto: replicação escala leitura até o ponto em que a escrita, aplicada em toda parte, consome os nós.

Quando esse ponto chega, a resposta é particionamento — que divide a escrita em vez de multiplicá-la.

Classificar as leituras é o trabalho

Nem toda leitura pode ir para réplica. A classificação que funciona:

crítica primário — saldo antes de debitar, verificação de estoque
do próprio usuário primário por N segundos após ele escrever
geral réplica
relatório réplica dedicada

A segunda linha é a que elimina a maior parte das queixas de "salvei e não aparece". Ver consistência eventual.

Sem essa classificação, duas coisas ruins acontecem: ou tudo vai para o primário — e a replicação não escala nada — ou tudo vai para réplica, e operações críticas decidem sobre dado velho.

Relatório em réplica compartilhada envenena a leitura geral

Uma consulta analítica pesada numa réplica que também serve tráfego de usuário aumenta o atraso dela para todo mundo, e compete por recursos.

Réplica de relatório deve ser dedicada. É a mesma lógica de separar OLTP de OLAP, aplicada dentro da camada de réplicas.

O atraso precisa entrar na decisão de roteamento

Uma réplica atrasada continua respondendo — com dados velhos, sem erro.

O roteamento maduro considera o atraso: réplicas acima de um limiar saem da rotação para leituras sensíveis, ou saem completamente.

Sem isso, uma réplica que travou continua recebendo tráfego e servindo dados congelados. Ver detecção de falhas.

Réplica não é apenas para escala

Vale lembrar, porque muda o dimensionamento: as réplicas também servem para disponibilidade — assumir se o primário cair.

Se todas as réplicas estão dimensionadas no limite servindo leitura, a promoção de uma delas acontece num nó já saturado, no pior momento possível.

O dimensionamento precisa reservar folga para esse cenário. Ver planejamento de capacidade.

Cache antes de réplica

Uma leitura servida por cache não chega a nenhuma réplica.

Para dados lidos repetidamente, cache é mais barato e mais rápido que adicionar réplicas — e não sofre amplificação de escrita.

A ordem prática: cache primeiro, réplica para o que o cache não cobre. Ver cache para escala e a escada em escala de banco de dados.

Modelo Mental

Réplica multiplica leitura e multiplica o trabalho de escrita. Ela escala até o ponto em que a escrita, aplicada em toda parte, consome os nós.

Quando Usar

  • A leitura domina a escrita.
  • As leituras toleram atraso de segundos.
  • Há carga de relatório a separar.
  • Disponibilidade exige cópias de qualquer forma.
  • Usuários geograficamente distribuídos leem localmente.

Quando Não Usar

Para escalar escrita.

Sem classificar as leituras.

Relatório em réplica compartilhada.

Sem considerar o atraso no roteamento.

Sem folga para promoção.

Antes do cache. Réplica é mais cara para o mesmo efeito em dados repetidos.

Alternativas

  • Cache — mais barato para leitura repetida.
  • Particionamento — quando o limite é escrita.
  • CQRS distribuído — modelo de leitura próprio, otimizado.
  • Visão materializada — pré-cálculo no próprio banco.

Trade-offs

Mais réplicasMenos
Mais capacidade de leituraMenos
Mais amplificação de escritaMenos
Mais tolerância a falhaMenos
Mais atraso a monitorarMenos
Custo linearBaixo
RéplicaCache
Todos os dadosSó o cacheado
Consulta arbitráriaChave conhecida
Sofre amplificaçãoNão
Sem invalidaçãoInvalidação a gerenciar

Modos de Falha

Escrita saturando com muitas réplicas.

Réplica atrasada servindo dado velho.

Réplica parada respondendo normalmente.

Relatório aumentando o atraso geral.

Promoção em nó saturado.

Leitura crítica em réplica. Decisão sobre dado desatualizado.

Erros Comuns

Adicionar réplicas para resolver escrita. Réplica escala leitura; toda escrita continua indo para o primário, e cada réplica adicional ainda aumenta o trabalho de replicação dele.

Não classificar as leituras. Nem toda leitura tolera atraso. Mandar tudo para réplica faz o usuário não ver a própria alteração ao recarregar — o relato de bug mais comum desse arranjo.

Não implementar "leia seus próprios escritos". É a garantia mínima que torna leitura de réplica aceitável para o usuário. Sem ela, a inconsistência aparece exatamente para quem acabou de agir.

Não monitorar atraso por réplica. O atraso varia entre réplicas e com a carga. A média esconde a réplica que está minutos atrás e continua recebendo leituras.

Não reservar folga para promoção. Se as réplicas operam no limite, promover uma a primário a coloca sob carga de escrita que ela não tem capacidade de absorver — e o failover derruba o sucessor.

Não usar cache antes. Réplica adicional custa uma instância de banco por mês; cache costuma resolver a mesma carga de leitura por uma fração, e deveria ser avaliado primeiro.

Exemplo Real

Uma plataforma de classificados escalou de 2 para 12 réplicas de leitura ao longo de dois anos, conforme o tráfego crescia.

Com 12 réplicas, dois problemas apareceram:

A escrita saturou. Cada anúncio publicado gerava 13 escritas — o primário e as 12 réplicas. As réplicas passavam a maior parte do tempo aplicando replicação, e a capacidade de leitura por réplica tinha caído. Adicionar a 13ª piorou o atraso de todas.

Atraso irregular. Duas réplicas serviam relatórios internos e tinham atraso de minutos, enquanto as outras tinham segundos. O roteamento não distinguia, e usuários ocasionalmente viam anúncios desatualizados — sem padrão aparente, o que dificultou o diagnóstico por meses.

As correções:

Cache antes de réplica. As buscas mais comuns — que respondiam por 70% da leitura — foram para cache com invalidação por evento. Isso permitiu reduzir de 12 para 6 réplicas, o que diminuiu a amplificação de escrita pela metade e melhorou o atraso de todas.

Réplicas dedicadas a relatório, fora da rotação de tráfego de usuário.

Roteamento sensível a atraso. Réplicas com mais de 5 segundos saem da rotação para leituras sensíveis; acima de 30 segundos, saem completamente.

Classificação de leitura. Publicação de anúncio e edição pelo próprio autor passaram a ler do primário por 30 segundos. A queixa de "editei e não mudou" desapareceu.

Particionamento planejado para quando a escrita voltar a saturar, com gatilho definido — o que a equipe estima em cerca de três anos no ritmo atual.

A avaliação posterior aponta: a resposta para dois anos de crescimento tinha sido sempre a mesma — adicionar uma réplica. Ninguém tinha calculado a amplificação de escrita, e a 12ª réplica estava tornando o sistema pior.

Conceitos Relacionados

Exercício Prático

Conte quantas réplicas você tem e multiplique pela taxa de escrita. Esse é o trabalho de escrita total do seu conjunto.

Compare com a capacidade de escrita de um nó. A razão diz quanto da capacidade de cada réplica está sendo consumida antes de servir qualquer leitura.

Perguntas de Entrevista

  • Por que replicação não escala escrita?
  • O que é amplificação de escrita e como ela define o teto?
  • Por que cache deve vir antes de réplica?

Para Aprofundar

  • Kleppmann, Martin. Designing Data-Intensive Applications. O'Reilly, 2017 — capítulo 5.
  • Botros, Silvia; Tinley, Jeremy. High Performance MySQL. 4ª ed. O'Reilly, 2021.
  • Gunther, Neil. Guerrilla Capacity Planning. Springer, 2007.
Terminou de ler este documento?Seu progresso fica salvo apenas neste navegador.