Pular para o conteúdo

Arquitetura real · Pleno

OpenAI: um primário Postgres para 800 milhões de usuários do ChatGPT

Arquitetura real em produção. Pontos centrais: réplicas de leitura e isolamento de workload em vez de sharding.

15 min de leitura · Fonte: OpenAI · Conteúdo revisado em 23 de outubro de 2026

Resposta curta

Arquitetura real em produção. Pontos centrais: réplicas de leitura e isolamento de workload em vez de sharding. A OpenAI descreve como sustenta milhões de consultas por segundo para 800 milhões de usuários com um único primário PostgreSQL que atende todas as escritas e quase 50 réplicas de leitura espalhadas por várias regiões.

01 · CONTEXTO

Um escritor para centenas de milhões de usuários

A OpenAI descreve como sustenta milhões de consultas por segundo para 800 milhões de usuários com um único primário PostgreSQL que atende todas as escritas e quase 50 réplicas de leitura espalhadas por várias regiões.

A carga do banco cresceu mais de dez vezes em um ano e segue subindo. O desenho se sustenta porque a carga é majoritariamente de leitura; a empresa diz que isso, somado às otimizações, ainda deixa folga para crescer.

Uma arquitetura de primário único significa que uma instância trata todas as escritas enquanto várias réplicas tratam as leituras. Isso cria um gargalo inerente, porque as escritas não podem ser distribuídas. O caso mostra até onde dá para empurrar esse desenho antes de partir para fragmentação.

02 · A ESCOLHA

Por que não fragmentar o banco

O PostgreSQL da OpenAI permaneceu sem fragmentação. O motivo central é que fragmentar as cargas existentes seria complexo e demorado, exigindo mudanças em centenas de endpoints e podendo levar meses ou até anos. Como a carga é majoritariamente de leitura e há otimizações extensas, a arquitetura atual ainda oferece folga; a empresa não descarta fragmentar no futuro, mas não é prioridade de curto prazo.

SituaçãoDecisão relatada
Cargas existentes do PostgreSQLFragmentar exigiria mudar centenas de endpoints e poderia levar meses ou anos.
Carga majoritariamente de leituraA arquitetura atual ainda dá folga para o crescimento do tráfego.
Escritas pesadas e fragmentáveisMigradas para sistemas fragmentados, como o Azure Cosmos DB.
Tabelas novasNão entram mais no PostgreSQL atual; novas cargas vão para sistemas fragmentados.

03 · ARQUITETURA

Um escritor, muitas réplicas e cache

A OpenAI combinou aumentar o tamanho da instância (escala vertical) com adicionar mais réplicas de leitura (escala horizontal). O diagrama mostra o desenho resultante.

  1. Todas as escritas do PostgreSQL chegam ao único primário.

    Diagrama da arquitetura: Primário único com réplicas e cache
    CLUsuários
    CPServiços de aplicação
    CHCamada de cache
    DBRéplicas de leitura
    DBPrimário PostgreSQLúnico escritor
    DBSistema fragmentado
  2. As leituras vão para as réplicas sempre que possível; só ficam no primário as leituras que fazem parte de transações de escrita.

    Diagrama da arquitetura: Primário único com réplicas e cache
    CLUsuários
    CPServiços de aplicação
    CHCamada de cache
    DBRéplicas de leituraleituras
    DBPrimário PostgreSQL
    DBSistema fragmentado
  3. Uma camada de cache atende a maior parte do tráfego de leitura para aliviar o PostgreSQL.

    Diagrama da arquitetura: Primário único com réplicas e cache
    CLUsuários
    CPServiços de aplicação
    CHCamada de cachemaior parte das leituras
    DBRéplicas de leitura
    DBPrimário PostgreSQL
    DBSistema fragmentado
  4. As escritas pesadas que podem ser particionadas vão para um sistema fragmentado, e as cargas novas nascem nele.

    Diagrama da arquitetura: Primário único com réplicas e cache
    CLUsuários
    CPServiços de aplicação
    CHCamada de cache
    DBRéplicas de leitura
    DBPrimário PostgreSQL
    DBSistema fragmentadoescrita fragmentável
  5. O primário transmite o log de escrita (WAL) a cada réplica de leitura.

    Diagrama da arquitetura: Primário único com réplicas e cache
    CLUsuários
    CPServiços de aplicação
    CHCamada de cache
    DBRéplicas de leitura
    DBPrimário PostgreSQLenvia o WAL
    DBSistema fragmentado

04 · ALIVIAR O PRIMÁRIO

Escritas, consultas e conexões sob controle

Na frente de escrita, a OpenAI corrigiu bugs de aplicação que geravam escritas redundantes e introduziu escritas preguiçosas, onde cabível, para suavizar picos. Na frente de consultas, uma query que juntava 12 tabelas esteve por trás de incidentes graves quando seu volume subia; a lição foi evitar joins complexos e, quando necessários, quebrar a consulta e levar a lógica de junção para a aplicação.

Muitas consultas problemáticas vêm de ORMs, então é importante revisar o SQL que eles geram. Também é preciso configurar timeouts, como idle_in_transaction_session_timeout, para que consultas ociosas não bloqueiem o autovacuum. Esses são exemplos dos anti-padrões de desempenho em bancos transacionais.

Cada instância tem um limite máximo de conexões (5.000 no Azure PostgreSQL), e a OpenAI já teve incidentes em que tempestades de conexões esgotaram todas as disponíveis. A resposta foi o PgBouncer, um proxy que agrupa e reutiliza conexões; em benchmarks, o tempo médio de conexão caiu de 50 ms para 5 ms.

  1. Cada instância de banco tem um limite máximo de conexões, e tempestades de conexões já esgotaram esse limite em incidentes passados.

    Diagrama da arquitetura: Pool de conexões com PgBouncer
    CPClientes da aplicação
    NWService do Kubernetes
    CPPods do PgBouncer
    DBRéplica de leituralimite de conexões
  2. O PgBouncer fica como proxy entre as aplicações e o banco e reutiliza conexões, reduzindo as conexões ativas dos clientes.

    Diagrama da arquitetura: Pool de conexões com PgBouncer
    CPClientes da aplicação
    NWService do Kubernetes
    CPPods do PgBouncerreutiliza conexões
    DBRéplica de leitura
  3. Cada réplica tem seu próprio deployment Kubernetes com vários pods PgBouncer, atrás de um mesmo Service que balanceia o tráfego entre os pods.

    Diagrama da arquitetura: Pool de conexões com PgBouncer
    CPClientes da aplicação
    NWService do Kubernetesbalanceia
    CPPods do PgBouncer
    DBRéplica de leitura
  4. Proxy, clientes e réplicas ficam na mesma região para reduzir a sobrecarga de rede.

    Diagrama da arquitetura: Pool de conexões com PgBouncer
    CPClientes da aplicação
    NWService do Kubernetes
    CPPods do PgBouncermesma região
    DBRéplica de leitura

05 · FALHAS EM CASCATA

Cache, isolamento e limites de taxa

Os incidentes de sobrecarga costumam seguir um padrão: um problema a montante provoca um pico de carga no banco, como misses generalizados do cache, um surto de joins caros saturando a CPU ou uma tempestade de escritas de uma funcionalidade nova. Com o uso de recursos subindo, a latência aumenta, as requisições expiram e as retentativas amplificam a carga em um ciclo vicioso que pode degradar o serviço inteiro.

  1. A taxa de acerto do cache cai de repente por uma falha na camada de cache.

    Diagrama da arquitetura: Cache, trava e isolamento por prioridade
    CPServiços de alta prioridade
    CPServiços de baixa prioridade
    CHCache com trava de chavemuitos misses
    DBInstância de alta prioridade
    DBInstância de baixa prioridade
  2. O surto de misses empurra um grande volume de requisições direto para o PostgreSQL.

    Diagrama da arquitetura: Cache, trava e isolamento por prioridade
    CPServiços de alta prioridade
    CPServiços de baixa prioridade
    CHCache com trava de chave
    DBInstância de alta prioridadecarga alta
    DBInstância de baixa prioridadecarga alta
  3. Com a trava de chave, só uma requisição busca o dado no banco e repovoa o cache; as outras esperam a atualização.

    Diagrama da arquitetura: Cache, trava e isolamento por prioridade
    CPServiços de alta prioridade
    CPServiços de baixa prioridade
    CHCache com trava de chaveuma busca por chave
    DBInstância de alta prioridade
    DBInstância de baixa prioridade
  4. Requisições de baixa e alta prioridade vão a instâncias separadas, então um pico de baixa prioridade não degrada o tráfego crítico.

    Diagrama da arquitetura: Cache, trava e isolamento por prioridade
    CPServiços de alta prioridade
    CPServiços de baixa prioridade
    CHCache com trava de chave
    DBInstância de alta prioridadeprotegida
    DBInstância de baixa prioridadeabsorve o pico

O isolamento de cargas vale também entre produtos e serviços, para que a atividade de um não afete a confiabilidade de outro. Além disso, a OpenAI aplica limitação de taxa em várias camadas (aplicação, pooler de conexões, proxy e consulta) e evita intervalos de retentativa curtos demais, que podem causar tempestades de retentativas.

A camada de ORM também foi estendida para limitar taxa e, quando necessário, bloquear por completo certos padrões de consulta. Essa forma de load shedding permite recuperação rápida de surtos de consultas caras.

06 · DISPONIBILIDADE E LIMITES

O ponto único de falha e o teto do desenho

Com um único escritor, se ele cair o serviço inteiro é afetado. Por isso as leituras críticas foram tiradas do primário: se ele cair, elas continuam sendo atendidas pelas réplicas. As escritas ainda falhariam, mas o impacto é menor.

  1. Cenário de falha: o primário cai e as escritas passam a falhar.

    Diagrama da arquitetura: Falha do primário com standby quente
    CPServiços de aplicação
    DBPrimário PostgreSQLcenário: cai
    DBStandby quente
    DBRéplicas de leitura
  2. As leituras críticas continuam sendo atendidas pelas réplicas.

    Diagrama da arquitetura: Falha do primário com standby quente
    CPServiços de aplicação
    DBPrimário PostgreSQL
    DBStandby quente
    DBRéplicas de leituraleituras seguem
  3. O standby quente, sincronizado continuamente, pode ser promovido para reduzir o tempo fora do ar.

    Diagrama da arquitetura: Falha do primário com standby quente
    CPServiços de aplicação
    DBPrimário PostgreSQL
    DBStandby quentepode ser promovido
    DBRéplicas de leitura
  4. Com várias réplicas por região e folga de capacidade, a falha de uma réplica não causa queda regional.

    Diagrama da arquitetura: Falha do primário com standby quente
    CPServiços de aplicação
    DBPrimário PostgreSQL
    DBStandby quente
    DBRéplicas de leiturauma réplica falha

O desenho tem um teto. Como o primário transmite o WAL a cada réplica, mais réplicas aumentam a pressão em rede e CPU e deixam o atraso de replicação maior e mais instável. A OpenAI diz que não pode adicionar réplicas indefinidamente sem sobrecarregar o primário.

A saída em estudo é a replicação em cascata, em que réplicas intermediárias repassam o WAL às seguintes, o que permitiria passar de cem réplicas. O custo é complexidade operacional, sobretudo no failover, e a funcionalidade ainda estava em teste.

Há limites também no próprio PostgreSQL. O MVCC copia a linha inteira a cada atualização, o que amplifica a escrita, e as leituras precisam percorrer versões mortas, o que amplifica a leitura. Até uma mudança pequena de esquema pode reescrever a tabela inteira; por isso só mudanças leves são permitidas, com timeout estrito de cinco segundos, e preenchimentos retroativos com limite de taxa podem levar mais de uma semana.

07 · RESULTADOS

O que o desenho entregou e onde ele dói

A OpenAI relata milhões de consultas por segundo em cargas de leitura intensa, quase 50 réplicas adicionadas com atraso de replicação próximo de zero, latência p99 de dois dígitos baixos em milissegundos no cliente e disponibilidade de cinco noves.

Em doze meses houve apenas um incidente SEV-0 do PostgreSQL. Ele ocorreu no lançamento do ChatGPT ImageGen, quando o tráfego de escrita subiu mais de dez vezes com mais de cem milhões de novos usuários em uma semana.

A empresa segue migrando as cargas de escrita restantes, mais difíceis de fragmentar, e diz que continuará explorando outras abordagens, incluindo PostgreSQL fragmentado ou sistemas distribuídos alternativos.

Perguntas frequentes

O que é OpenAI: um primário Postgres para 800 milhões de usuários do ChatGPT?

Arquitetura real em produção. Pontos centrais: réplicas de leitura e isolamento de workload em vez de sharding.

O que o design de OpenAI: um primário Postgres para 800 milhões de usuários do ChatGPT cobre?

Ele está organizado nestas seções: Um escritor para centenas de milhões de usuários, Por que não fragmentar o banco, Um escritor, muitas réplicas e cache, Escritas, consultas e conexões sob controle, Cache, isolamento e limites de taxa e O ponto único de falha e o teto do desenho.

Quanto tempo leva OpenAI: um primário Postgres para 800 milhões de usuários do ChatGPT e qual é o nível?

Leva cerca de 15 minutos para ler e tem nível Pleno.

Agora projete você mesmo

Rode este caso como uma entrevista na escola de System Design: você toma as decisões, o tutor as questiona e você vê a nota do seu desenho.