BANCO DE DADOS · POSTGRESQL · HA

    Consultoria PostgreSQL Alta Disponibilidade — Arquitetura 24/7 com Streaming Replication, Patroni e Failover Testado.

    HTI Tecnologia · Equipe TécnicaPublicado em julho de 202613–16 min de leitura

    Alta disponibilidade PostgreSQL não é um parâmetro que se liga — é uma arquitetura que se desenha, testa e sustenta. A diferença entre um cluster que "tem replicação" e um cluster que sustenta SLA contratual de 99,99% em produção está em uma dezena de decisões técnicas concretas: quórum de DCS, timeout de failover, roteamento de conexão, política de fencing, ordem de start após restore. Este guia é a base da metodologia de consultoria PostgreSQL que aplicamos em ambientes multi-AZ críticos.

    A HTI opera bancos de dados de missão crítica desde 1990 e aplica ao PostgreSQL o mesmo padrão operacional que sustenta 99,9999% em ambientes Oracle, MySQL e SQL Server. HA aqui não é discurso — é runbook numerado, DR testado por trimestre e RTO medido em minutos.

    POR QUE ALTA DISPONIBILIDADE EM POSTGRES É DIFERENTE

    Postgres não vem com HA "de fábrica" no mesmo sentido que Oracle RAC ou SQL Server Always On. Existe replicação nativa (Streaming Replication e Logical Replication), mas failover automático, detecção de falha, promoção segura e roteamento de conexão são responsabilidades da stack ao redor — Patroni + DCS + pooler + monitoramento. Isso é bom (flexibilidade e portabilidade máxima) e ruim (é fácil errar em qualquer uma das camadas).

    O padrão que vemos com mais frequência em Health Check: uma réplica de leitura configurada como "plano de HA", sem orquestrador, sem quórum, sem teste de promoção. Quando o primário cai de madrugada, alguém acorda para promover manualmente, e o RTO real chega em horas. HA funcional exige que a promoção aconteça sem intervenção humana, no meio da madrugada, dentro do tempo previsto — e que o time confie o suficiente na automação para deixar acontecer.

    01

    SLA, RTO E RPO — DEFINA ANTES DE DESENHAR ARQUITETURA

    Antes de escolher tecnologia, defina três números com o negócio, por escrito. SLA (Service Level Agreement): percentual de uptime contratual — 99,9% permite 8h45min de indisponibilidade por ano, 99,99% permite 52 min, 99,999% permite 5 min. RTO (Recovery Time Objective): quanto tempo o negócio aceita ficar fora após uma falha — 5 min, 30 min, 4 horas. RPO (Recovery Point Objective): quantos dados o negócio aceita perder — zero, 1 s, 5 min, 1 h.

    Esses três números determinam praticamente toda a arquitetura. RPO zero exige replicação síncrona. RTO abaixo de 1 minuto exige failover automático com DCS e conexões roteadas por VIP/pooler. SLA 99,999% exige múltiplas AZs, DR geográfico e observabilidade com alerta acionável — não painel visual. Sem esses números fixados, qualquer discussão de arquitetura vira preferência técnica.

    "HA sem SLA definido é decoração. HA sem RTO/RPO testados é aposta."

    02

    STREAMING REPLICATION — A BASE DE TODA ARQUITETURA

    Streaming Replication é replicação física: o primário envia continuamente o WAL para uma ou mais réplicas (standbys), que aplicam o WAL em modo hot standby — disponíveis para leitura. É a base de qualquer arquitetura HA em Postgres. Modo assíncrono é o default; síncrono exige configuração explícita e tem custo em latência de commit.

    -- postgresql.conf no PRIMÁRIO (base para HA)
    wal_level = replica
    max_wal_senders = 10
    wal_keep_size = '2GB'
    max_replication_slots = 10
    hot_standby = on
    archive_mode = on
    archive_command = 'test ! -f /wal-archive/%f && cp %p /wal-archive/%f'
    -- Para RPO zero, adicione:
    synchronous_commit = on
    synchronous_standby_names = 'ANY 1 (standby1, standby2)'

    Replication slots vs wal_keep_size

    Use replication slots em produção — garantem que o primário retém o WAL necessário para cada réplica, mesmo que ela fique offline por horas. O risco: se uma réplica desaparecer permanentemente e o slot não for removido, o WAL cresce até encher o disco do primário. Monitore pg_replication_slots e tenha alerta para pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn) acima de um threshold (por exemplo 5 GB).

    -- Monitorar lag e saúde das réplicas (a partir do primário)
    SELECT
      application_name,
      state,
      sync_state,
      pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), sent_lsn)) AS sent_lag,
      pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), write_lsn)) AS write_lag,
      pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), flush_lsn)) AS flush_lag,
      pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn)) AS replay_lag,
      write_lag, flush_lag, replay_lag
    FROM pg_stat_replication;

    Thresholds práticos em produção OLTP: replay_lag < 500ms em condição normal, alerta em > 5s, incidente crítico em > 30s. Lag alto por horas geralmente indica réplica com hardware inferior, I/O saturado ou query longa segurando snapshot na réplica (hot_standby_feedback mal calibrado).

    03

    PATRONI + DCS — ORQUESTRAÇÃO E FAILOVER AUTOMÁTICO

    Patroni é o orquestrador de cluster PostgreSQL de facto em 2026 — usado pela Zalando (que o criou), CloudNativePG, Crunchy Data e praticamente todo operador Kubernetes de Postgres. Ele resolve o que Streaming Replication não faz: detecção de falha do primário, eleição de líder via DCS (Distributed Configuration Store — etcd, Consul, ZooKeeper), promoção segura, fencing do primário antigo para evitar split-brain, e REST API para automação.

    -- patroni.yml (trecho relevante, cluster de 3 nós + etcd)
    scope: postgres-prod
    name: node1
    etcd3:
      hosts: etcd1:2379,etcd2:2379,etcd3:2379
    bootstrap:
      dcs:
        ttl: 30
        loop_wait: 10
        retry_timeout: 10
        maximum_lag_on_failover: 1048576 # 1MB
        synchronous_mode: true
        synchronous_mode_strict: false
    postgresql:
      use_pg_rewind: true
      parameters:
        max_connections: 500
        wal_level: replica

    DCS com quórum — o detalhe que define split-brain

    DCS precisa ter quórum: 3 nós (tolera 1 falha), 5 nós (tolera 2), sempre número ímpar. Rodar etcd em 2 nós não é HA — é menos resistente do que rodar em 1 nó, porque a perda de qualquer um trava todo o cluster. Distribua os nós de DCS por AZs diferentes. Nunca coloque etcd e Postgres no mesmo host físico em produção — falha correlata elimina os dois de uma vez.

    Parâmetros críticos de failover

    ttl (default 30s): tempo até o líder ser considerado morto se não renovar o lease. Reduzir para 15s acelera failover mas aumenta risco de false-positive em rede instável. loop_wait (10s): frequência do health check. maximum_lag_on_failover: bytes máximos de lag que uma réplica pode ter para ser promovida — em síncrona, zero; em assíncrona, alinhe com o RPO acordado. synchronous_mode_strict = false permite que o cluster continue aceitando writes se todas as síncronas caírem (com perda de garantia de RPO); true prefere indisponibilidade a perda — decisão de negócio, não técnica.

    AUDITORIA DE ALTA DISPONIBILIDADE

    🔍 Health Check PostgreSQL HA.

    Auditoria completa da sua arquitetura PostgreSQL HA — replicação, failover, backup, RTO/RPO testados. Relatório com achados por severidade e roadmap acionável.

    Solicitar Health Check →

    04

    PGBOUNCER, VIP E ROTEAMENTO DE CONEXÃO

    Failover no Postgres promove uma réplica — mas a aplicação continua apontando para o IP do primário antigo, agora inalcançável. Você precisa de uma camada que redirecione conexão para o líder atual, sem alterar string de conexão da aplicação. Três padrões funcionam:

    • VIP flutuante (keepalived, Corosync): IP virtual que "salta" para o novo líder após failover. Simples, funciona em rede plana; ruim em multi-AZ ou cloud sem IPs flutuantes livres.
    • HAProxy + Patroni REST API: HAProxy consulta o endpoint /master ou /replica de cada nó Patroni via health check HTTP; roteia writes para o líder atual, reads para qualquer réplica. Padrão de mercado em bare-metal e VMs.
    • PgBouncer com reload orquestrado: PgBouncer aponta para o líder; após failover, Patroni dispara callback que atualiza pgbouncer.ini e faz reload. Combina pool + roteamento; recomendado para workload com alta concorrência.

    Em Kubernetes, o padrão é service gerenciado pelo operador (Zalando postgres-operator, CloudNativePG): dois services por cluster — -rw aponta para o líder atual, -ro para réplicas. O operador atualiza os endpoints do service em segundos após failover.

    05

    BACKUP, PITR E WAL ARCHIVING — REPLICAÇÃO NÃO É BACKUP

    Replicação replica erros humanos em milissegundos. DROP TABLE no primário chega na réplica sem cerimônia. HA cobre falha de infraestrutura — não cobre falha operacional, corrupção lógica, ransomware ou "alguém rodou o script errado". Backup + PITR é camada separada e não-negociável.

    A ferramenta de referência para PostgreSQL em produção é pgBackRest — backup full/differential/incremental, retenção configurável, verificação de integridade, restore paralelo, WAL archiving assíncrono com compressão. Barman é alternativa válida com integração mais direta em ambientes Debian/Ubuntu. pg_dump tem lugar apenas em dumps lógicos pontuais — não é solução de backup em produção.

    -- pgBackRest: exemplo mínimo de configuração
    [global]
    repo1-path=/var/lib/pgbackrest
    repo1-retention-full=7
    repo1-retention-diff=14
    process-max=4
    compress-type=zst
    [postgres-prod]
    pg1-path=/var/lib/postgresql/16/main
    pg1-port=5432
    -- Rotina típica:
    pgbackrest --stanza=postgres-prod backup --type=full # semanal
    pgbackrest --stanza=postgres-prod backup --type=diff # diário
    pgbackrest --stanza=postgres-prod backup --type=incr # a cada N horas

    Regra 3-2-1 sem exceção: 3 cópias dos dados, em 2 mídias diferentes, sendo 1 em localização geográfica separada. Armazene backups fora da mesma conta/tenant de cloud da produção (segregação de blast radius em incidente de credencial). Teste restore em ambiente isolado nos últimos 90 dias — se você não sabe o tempo de restore, você não sabe seu RTO real.

    06

    FAILOVER TESTADO — NÃO APENAS CONFIGURADO

    Failover que nunca foi disparado em produção não é HA — é esperança. A HTI mantém rotina trimestral de chaos drill para os clientes em DBA Remoto PostgreSQL: derrubada controlada do primário, medição de RTO real, validação de que a aplicação reconectou, verificação de integridade dos dados e revisão do runbook a cada exercício.

    O runbook mínimo de failover

    • Detecção: quais alertas disparam e para quem — Patroni via REST API + Prometheus pg_up == 0 + monitoramento externo de porta.
    • Confirmação: critério objetivo para não agir em falso-positivo (rede vs banco); Patroni já faz isso, humano só valida.
    • Promoção: automática via Patroni; manual documentada como fallback (patronictl failover).
    • Reconexão da aplicação: validação em segundos, não em promessa. Métrica: taxa de erro por endpoint pós-failover.
    • Fencing do primário antigo: Patroni cuida com pg_rewind; validar que o nó voltou como réplica, não como split-brain.
    • Post-mortem: RTO real, RPO real (via análise de WAL), gaps identificados, ação corretiva com prazo.

    Chaos drill é rotina: derrubar o primário no horário combinado, medir. Um cluster que não foi testado em 90 dias tem alta probabilidade de falhar quando precisar — configuração drifta, DNS quebra, certificado vence, backup deixa de rodar em silêncio.

    07

    OBSERVABILIDADE E RUNBOOK — O QUE TRANSFORMA ARQUITETURA EM SLA

    Arquitetura HA sem observabilidade acionável entrega SLA no papel — não na operação. O mínimo em produção:

    • postgres_exporter ou pgwatch2 exportando métricas para Prometheus.
    • Dashboards em Grafana com paineis de: lag de replicação, taxa de commit, hit ratio, autovacuum, WAL generation rate, tempo de checkpoint, top queries por pg_stat_statements.
    • Alertas acionáveis — não "CPU alta", mas "lag de replicação > 5s por 2 min", "datfrozenxid age > 1B", "checkpoint por WAL > 30% dos últimos 100", "pg_is_in_recovery() mudou de estado".
    • Roteamento de alerta 24/7 com escalonamento (PagerDuty, Opsgenie, plantão interno) — alerta que ninguém atende é ruído.
    • Runbook por classe de incidente, versionado, revisado a cada drill.
    • Monitoramento comportamental que vai além de métricas de infra — em ambientes gerenciados pela HTI, isso é feito com DBSnoop (ferramenta proprietária) que rastreia padrões de ingestão, tentativas de acesso a objetos protegidos e desvios comportamentais aplicáveis a qualquer RDBMS do portfólio.

    OS ERROS QUE MAIS QUEBRAM HA DE POSTGRES EM PRODUÇÃO

    • DCS sem quórum (2 nós de etcd): qualquer falha trava o cluster inteiro.
    • Réplica no mesmo rack ou mesma AZ do primário: falha correlata elimina os dois; HA que não sobrevive à queda de uma AZ não é HA.
    • Synchronous_mode_strict = true sem múltiplas réplicas síncronas: qualquer manutenção derruba writes.
    • Replication slot esquecido: réplica removida, slot ativo, WAL cresce até encher o disco do primário e derrubar o banco.
    • hot_standby_feedback = on com query longa na réplica: bloqueia vacuum no primário e gera bloat descontrolado.
    • Aplicação com pool sem retry/reconnect logic: failover funciona em 15 segundos, mas a aplicação leva 10 minutos para se recuperar porque HikariCP/pgpool está com connectionTimeout de 30 min.
    • Backup nunca restaurado: descobre-se em incidente que o pgBackRest está com repo corrompido há 3 meses.
    • Runbook em Wiki que ninguém leu: na hora do incidente, cada engenheiro toma uma decisão diferente.

    QUANDO CHAMAR UM DBA ESPECIALISTA

    Alta disponibilidade PostgreSQL é o tipo de projeto que raramente sai bem "na primeira tentativa" quando desenhado por quem opera Postgres pela primeira vez. Três cenários pedem consultoria especializada:

    • Greenfield com SLA contratual: ambiente novo, com SLA acordado com cliente ou regulador. Desenhar errado no início custa 10x reprojetar depois — escopo típico de consultoria PostgreSQL.
    • Cluster existente que nunca fez failover real: auditoria de HA, chaos drill guiado, correção do runbook, medição de RTO real — natural em um Health Check focado em disponibilidade.
    • Operação 24/7 sem time dedicado: arquitetura HA sem gente de plantão que sabe o que fazer no incidente é meia-solução. Cobrimos com DBA Remoto PostgreSQL — NOC 24/7, SLA contratual, DBSnoop na operação.

    A HTI opera bancos de dados relacionais desde 1990, sustenta ambientes com SLA de até 99,9999% em produção real (padrão HTI multi-RDBMS) e trabalha a partir de sala física de acesso restrito no PIT em São José dos Campos. Não vendemos hora de tentativa — vendemos arquitetura, runbook e chaos drill como padrão operacional.

    PRÓXIMO PASSO

    Vamos desenhar seu PostgreSQL 24/7?

    Se o seu SLA exige 99,99% ou mais, HA de Postgres é projeto — não plugin. Fale com um Expert PostgreSQL da HTI para revisar a arquitetura atual ou desenhar do zero.

    PERGUNTAS FREQUENTES

    Streaming Replication síncrona ou assíncrona?

    Depende do RPO contratual. Assíncrona (padrão) tem latência de commit mínima e replica em milissegundos, mas você perde as últimas transações se o primário cair antes de replicar — RPO próximo de zero em condições normais, mas não zero garantido. Síncrona (synchronous_commit = on + synchronous_standby_names) garante que cada commit é confirmado por pelo menos uma réplica antes de retornar sucesso para a aplicação — RPO zero, mas custo direto em latência de commit e risco de indisponibilidade se todas as réplicas síncronas caírem. A recomendação clássica: síncrona em pelo menos uma réplica local + assíncrona em réplicas remotas.

    Patroni ou repmgr para orquestração?

    Patroni é o padrão de mercado em 2026 — usado pela maioria dos operadores Kubernetes de Postgres (Zalando, CloudNativePG, Crunchy), suporta múltiplos backends de DCS (etcd, Consul, ZooKeeper, Kubernetes), tem failover automático, REST API e integração natural com PgBouncer. Repmgr ainda funciona bem em setups tradicionais, mas exige mais scripts customizados para failover automático e não tem a mesma tração da comunidade. Para greenfield, Patroni. Para ambiente legado com repmgr estável, migração exige janela e planejamento.

    É possível ter 99,999% de uptime só com Streaming Replication?

    Não. Streaming Replication resolve replicação de dados — não resolve detecção de falha, promoção automática, redirecionamento de conexão nem split-brain. Uptime de 99,99% (52 minutos por ano) e 99,999% (5 minutos por ano) exige a stack completa: replicação + Patroni + DCS com quórum + PgBouncer + VIP ou HAProxy + monitoramento com alertas roteados 24/7 + runbook testado + backup com restore validado. Faltando qualquer camada, você pode ter arquitetura teórica de HA sem entregar o SLA na prática.

    Alta disponibilidade PostgreSQL funciona igual em RDS, Aurora e Supabase?

    Não. RDS PostgreSQL Multi-AZ é replicação em nível de storage (block-level) com failover gerenciado — funciona bem, mas failover leva 60–120 segundos e você não controla a lógica. Aurora PostgreSQL usa storage distribuído com 6 cópias em 3 AZs e failover em 30 segundos, mas parâmetros de tuning e comportamento de WAL são específicos. Supabase provisiona réplicas gerenciadas com pooler embutido. Em qualquer caso, os princípios (RTO/RPO definidos, failover testado, backup validado, runbook) permanecem — a implementação técnica muda.