Marcio Cunha

Disaster Recovery e Replicação Multi-Região para PostgreSQL no Kubernetes

Descubra como estruturar alta disponibilidade e resiliência geográfica para bancos de dados PostgreSQL rodando em clusters Kubernetes distribuídos geograficamente.

Marcio Cunha•5 min
Também disponível em:EnglishEspañol
Resumo
  • A replicação síncrona garante perda zero de dados mas introduz latência perceptível entre datacenters distantes
  • Ferramentas de orquestração como o CloudNativePG automatizam failovers e gerenciam topologias complexas de nós
  • Testes periódicos de recuperação de desastres evitam surpresas indesejadas durante interrupções reais de infraestrutura
  • O particionamento de rede exige estratégias inteligentes de quorum para evitar o cenário de cérebro dividido
  • Estratégias de backup imutável fora do ambiente primário salvam operações de ataques de ransomware e corrupções lógicas

O desafio de manter dados seguros além de uma única fronteira geográfica

Quando construímos aplicações modernas, tendemos a confiar que a infraestrutura subjacente estará sempre disponível e operando sem falhas. Na prática, data centers sofrem quedas de energia, cortes de fibra óptica por escavações acidentais e até falhas catastróficas em hardware corporativo. Garantir a continuidade do negócio exige olhar além da resiliência local e projetar arquiteturas capazes de sobreviver à perda completa de uma região inteira de nuvem. No centro dessa estratégia está o banco de dados, o cofre onde guardamos o ativo mais valioso de qualquer empresa: a informação.

Gerenciar bancos de dados relacionais como o PostgreSQL dentro do Kubernetes, que é um orquestrador de contêineres projetado para gerenciar aplicações efêmeras, parecia uma contradição no passado. Contudo, a evolução dos operadores dedicados transformou essa realidade operacional. Um operador é como um engenheiro especialista embutido em código, capaz de automatizar tarefas complexas como backups, escalonamento e recuperação de falhas. Quando estendemos essa lógica para múltiplos data centers geograficamente separados, entramos no território da replicação multi-região e do disaster recovery, conhecido na engenharia como a capacidade de retomar operações críticas após um sinistro maior.

Entendendo as engrenagens da replicação síncrona e assíncrona

Para proteger dados contra desastres, precisamos copiar continuamente as informações gravadas no servidor principal, chamado de primário, para um ou mais servidores secundários, conhecidos como réplicas. No PostgreSQL, essa cópia ocorre no nível físico dos arquivos de log de transação (WAL - Write-Ahead Logging), que registram cada alteração antes de ela ser efetivamente aplicada às tabelas. A grande decisão arquitetural aqui envolve escolher entre a replicação síncrona e a assíncrona, um clássico dilema de engenharia entre consistência absoluta e velocidade de resposta.

Na replicação síncrona, o banco de dados primário só confirma que uma operação de gravação foi concluída após receber a confirmação de que a réplica em outra região também gravou o dado em seu disco. Na prática, isso significa zero perda de dados se o primário explodir, mas o usuário final experimentará uma lentidão perceptível devido ao tempo que a mensagem leva para viajar centenas ou milhares de quilômetros pela rede. Já na replicação assíncrona, o primário responde imediatamente ao cliente e envia os dados para a réplica em segundo plano. Isso garante alta velocidade, mas cria uma janela de vulnerabilidade onde alguns segundos ou megabytes de dados recentes podem simplesmente evaporar durante uma falha repentina.

Topologias de distribuição no Kubernetes entre regiões de nuvem

Distribuir um cluster Kubernetes entre várias regiões geográficas exige lidar com um obstáculo implacável da física: a latência de rede. A luz viaja rápido, mas cabos submarinos e roteadores adicionam milissegundos preciosos que impedem a criação de um cluster Kubernetes esticado e perfeitamente síncrono para cargas de trabalho transacionais pesadas. A abordagem mais madura e resiliente na engenharia moderna consiste em manter clusters Kubernetes independentes em cada região, conectados por redes seguras, utilizando operadores de banco de dados para coordenar a replicação do PostgreSQL entre eles.

Nessa topologia federada, a região primária abriga o banco de dados ativo que recebe leituras e escrituras, enquanto a região secundária mantém uma réplica em estado de prontidão constante. O operador instalado no Kubernetes monitora continuamente a saúde da infraestrutura por meio de sinais de vida chamados heartbeats. Se o operador na região secundária perceber que o primário na região principal parou de responder por um tempo limite configurado, ele inicia um processo automatizado de promoção. Esse processo transforma a réplica secundária no novo primário, redirecionando o tráfego de rede e garantindo que o sistema recupere sua capacidade operacional em poucos minutos.

Mitigando o risco do cérebro dividido durante quedas de rede

Um dos maiores pesadelos em arquiteturas distribuídas é o fenômeno conhecido como cérebro dividido ou split-brain. Isso ocorre quando uma falha na rede corta a comunicação entre a região principal e a região secundária, mas ambos os data centers continuam funcionando isoladamente. Sem conseguir conversar entre si, a réplica na segunda região pode assumir que o primário morreu e se promover a nova matriz. Quando a rede volta, temos dois bancos de dados aceitando gravações concorrentes de forma independente, corrompendo os dados de maneira catastrófica e irreversível.

Para evitar esse cenário desastroso, as arquiteturas modernas de alta disponibilidade recorrem a mecanismos de quorum e testemunhas externas chamadas de witness nodes. Um witness node é um componente leve que não armazena dados transacionais, servindo apenas como um árbitro neutro em uma terceira zona geográfica ou provedor de nuvem independente. Quando ocorre um isolamento de rede, qualquer nó que deseje se promover a primário precisa obter a maioria dos votos do quorum, que inclui o witness node. Como a região isolada não consegue atingir a maioria dos votos, ela é impedida de realizar escrituras, preservando a integridade absoluta dos dados da aplicação.

Implementando failovers automatizados e validações periódicas

A automação da recuperação de desastres é excelente até o dia em que falha silenciosamente por falta de uso. Sistemas complexos que nunca são testados tendem a falhar no momento exato em que mais precisamos deles. Por isso, engenheiros de confiabilidade de sites (SREs) realizam regularmente o chamado chaos engineering, injetando falhas controladas em ambientes de produção ou homologação para validar se o failover do banco de dados realmente funciona sem intervenção humana.

Abaixo apresentamos um exemplo de configuração de manifesto Kubernetes utilizado pelo operador CloudNativePG para definir um cluster PostgreSQL com políticas estritas de replicação e tolerância a falhas entre zonas ou regiões:

apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
  name: enterprise-db-cluster
  namespace: database-system
spec:
  instances: 3
  primaryUpdateStrategy: unsupervised
  storage:
    size: 100Gi
  postgresql:
    parameters:
      max_connections: '500'
      shared_buffers: 256MB
  replicationMode: synchronous

Esse trecho de código define a infraestrutura básica para manter três instâncias coordenadas, aplicando uma estratégia de atualização e replicação rigorosa. Quando combinada com políticas de backup contínuo para armazenamento de objeto externo, como o Amazon S3 ou Google Cloud Storage, essa configuração garante que mesmo que todas as instâncias do Kubernetes sofram danos estruturais simultâneos, a empresa conseguirá restaurar o banco de dados a partir do último estado consistente gravado na nuvem.

Considerações finais sobre resiliência e maturidade operacional

Construir uma estratégia sólida de disaster recovery para bancos de dados PostgreSQL em ambientes Kubernetes vai muito além de escrever arquivos de configuração YAML ou selecionar ferramentas de mercado sofisticadas. Envolve compreender profundamente os limites físicos da infraestrutura de rede, aceitar os trade-offs inevitáveis entre consistência de dados e velocidade de resposta, e cultivar uma cultura organizacional que valoriza testes rigorosos e simulações de falhas. A resiliência verdadeira não nasce do acaso, mas da engenharia intencional e do planejamento contínuo para o pior cenário possível.