Pular para o conteúdo

Arquitetura real · Júnior

Instagram: 14 milhões de usuários com 3 engenheiros (Postgres e IDs por shard)

Arquitetura real em produção. Pontos centrais: geração de IDs únicos e shards lógicos vs físicos.

12 min de leitura · Fonte: Instagram · Conteúdo revisado em 23 de outubro de 2026

Resposta curta

Arquitetura real em produção. Pontos centrais: geração de IDs únicos e shards lógicos vs físicos. Em dezembro de 2011, o time do Instagram descreveu a própria pilha como um retrato de como uma startup com equipe pequena pode escalar até mais de 14 milhões de usuários em pouco mais de um ano. Naquele momento eram apenas 3 engenheiros.

01 · CONTEXTO

Uma startup, poucos engenheiros, muito tráfego

Em dezembro de 2011, o time do Instagram descreveu a própria pilha como um retrato de como uma startup com equipe pequena pode escalar até mais de 14 milhões de usuários em pouco mais de um ano. Naquele momento eram apenas 3 engenheiros.

Os princípios para escolher cada peça eram manter tudo muito simples, não reinventar a roda e preferir tecnologias comprovadas e sólidas quando possível. Tema de escalar na horizontal.

02 · A PORTA DE ENTRADA

Do DNS round-robin ao balanceador gerenciado

Toda requisição passava por máquinas de balanceamento de carga. A primeira versão usava 2 máquinas nginx com DNS round-robin entre elas, e o ponto fraco era o tempo que o DNS leva para atualizar quando uma das máquinas precisava ser desativada.

  1. O app consulta o DNS, que reveza as respostas entre as duas máquinas nginx.

    Diagrama da arquitetura: Instagram 2011: entrada com DNS round-robin
    CLApp do usuário
    NWDNS round-robinreveza
    NWnginx A
    NWnginx B
    CPServidores de aplicação
  2. Para tirar uma máquina de circulação é preciso esperar o DNS atualizar; esse é o ponto fraco apontado pelo time.

    Diagrama da arquitetura: Instagram 2011: entrada com DNS round-robin
    CLApp do usuário
    NWDNS round-robin
    NWnginx A
    NWnginx Ba desativar
    CPServidores de aplicação

Depois o time passou a usar o Elastic Load Balancer da Amazon, com 3 instâncias NGINX atrás dele, que podem ser trocadas e saem de rotação automaticamente se falharem num health check. O SSL também passou a ser terminado no ELB, o que alivia a CPU do nginx.

AspectoDNS round-robinELB com NGINX atrás
Máquinas nginx2 máquinas3 instâncias
Retirar uma máquinaDepende do DNS atualizarA instância pode ser trocada e sai de rotação se falhar no health check

03 · APLICAÇÃO, DADOS E CACHE

A pilha completa em 2011

A camada de aplicação cresceu de poucas máquinas para mais de 25, e é a parte fácil de escalar na horizontal porque as máquinas são stateless. O time observou que a carga era limitada por CPU, não por memória.

  1. A requisição entra pelo ELB, que também termina o SSL, e é distribuída a uma das instâncias NGINX.

    Diagrama da arquitetura: Instagram 2011: pilha completa
    CLApp do usuário
    EDGCloudFront
    NWElastic Load Balancertermina SSL
    NWInstâncias NGINX
    CPServidores de aplicação
    CHMemcached
    CHRedis
    DBPostgreSQL (principal)
    DBPostgreSQL (réplica)
    DBArmazenamento de objetos
    QGearman
    CPWorkers
  2. O NGINX repassa a requisição a um servidor de aplicação, camada que o time ampliou ao crescer.

    Diagrama da arquitetura: Instagram 2011: pilha completa
    CLApp do usuário
    EDGCloudFront
    NWElastic Load Balancer
    NWInstâncias NGINX
    CPServidores de aplicaçãostateless
    CHMemcached
    CHRedis
    DBPostgreSQL (principal)
    DBPostgreSQL (réplica)
    DBArmazenamento de objetos
    QGearman
    CPWorkers
  3. A aplicação lê e grava no PostgreSQL, que roda em master-replica com Streaming Replication.

    Diagrama da arquitetura: Instagram 2011: pilha completa
    CLApp do usuário
    EDGCloudFront
    NWElastic Load Balancer
    NWInstâncias NGINX
    CPServidores de aplicação
    CHMemcached
    CHRedis
    DBPostgreSQL (principal)principal
    DBPostgreSQL (réplica)réplica
    DBArmazenamento de objetos
    QGearman
    CPWorkers
  4. A aplicação usa Memcached como cache e Redis para feeds e sessões.

    Diagrama da arquitetura: Instagram 2011: pilha completa
    CLApp do usuário
    EDGCloudFront
    NWElastic Load Balancer
    NWInstâncias NGINX
    CPServidores de aplicação
    CHMemcachedcache
    CHRedisfeeds e sessões
    DBPostgreSQL (principal)
    DBPostgreSQL (réplica)
    DBArmazenamento de objetos
    QGearman
    CPWorkers
  5. As fotos vão direto para o S3, e o CloudFront serve de CDN para melhorar o tempo de carga das imagens no mundo todo.

    Diagrama da arquitetura: Instagram 2011: pilha completa
    CLApp do usuário
    EDGCloudFrontCDN
    NWElastic Load Balancer
    NWInstâncias NGINX
    CPServidores de aplicação
    CHMemcached
    CHRedis
    DBPostgreSQL (principal)
    DBPostgreSQL (réplica)
    DBArmazenamento de objetosfotos
    QGearman
    CPWorkers
  6. Tarefas como compartilhar em outras redes vão para uma fila e são tratadas por workers em segundo plano.

    Diagrama da arquitetura: Instagram 2011: pilha completa
    CLApp do usuário
    EDGCloudFront
    NWElastic Load Balancer
    NWInstâncias NGINX
    CPServidores de aplicação
    CHMemcached
    CHRedis
    DBPostgreSQL (principal)
    DBPostgreSQL (réplica)
    DBArmazenamento de objetos
    QGearmanfila
    CPWorkers

A maior parte dos dados (usuários, metadados de fotos, tags) ficava em PostgreSQL. O cluster principal tinha 12 instâncias de memória grande e doze réplicas em outra zona. O time viu que o disco de rede do EBS não oferecia seeks suficientes, então manter o working set em memória era extremamente importante.

ArmazenamentoO que guarda
PostgreSQLUsuários, metadados de fotos e tags
RedisFeed principal, feed de atividade e sessões
MemcachedCache, com 6 instâncias
Amazon S3Os arquivos das fotos

04 · QUANDO UM BANCO NÃO BASTA

Shardar sem trocar de banco

No fim de 2012 o Instagram recebia mais de 25 fotos e 90 curtidas por segundo. Para manter os dados importantes na memória e disponíveis rapidamente, o time começou a shardar os dados, isto é, a dividi-los em muitos baldes menores, cada um com uma parte.

O time avaliou algumas soluções NoSQL, mas concluiu que o que melhor atendia era distribuir os dados por um conjunto de servidores PostgreSQL.

Era preciso resolver como atribuir identificadores únicos a cada dado do banco. A solução típica de um único banco, a chave primária autoincremental, deixa de funcionar quando os dados entram em vários bancos ao mesmo tempo.

Os requisitos do time eram: IDs ordenáveis por tempo, para ordenar uma lista de IDs de fotos sem buscar mais informação; IDs idealmente de 64 bits, para índices menores e melhor armazenamento em sistemas como o Redis; e o mínimo possível de novas partes móveis.

AbordagemVantagem apontadaLimite apontado
Gerar na aplicaçãoCada thread gera IDs de forma independente, reduzindo pontos de falha e contençãoEm geral pede mais espaço, 96 bits ou mais, para garantir unicidade
Serviço dedicado (Snowflake)IDs de 64 bits, metade do tamanho de um UUIDMais complexidade e mais partes móveis, como ZooKeeper e servidores Snowflake
Ticket servers no bancoBancos são bem entendidos e têm fatores de escala previsíveisPode virar gargalo de escrita

Dos caminhos avaliados, o Snowflake do Twitter foi o que chegou mais perto, mas a complexidade de operar um serviço de IDs pesou contra. A escolha foi uma abordagem conceitualmente parecida, trazida para dentro do PostgreSQL.

05 · SHARDS LÓGICOS E O ID

Milhares de shards lógicos sobre poucos servidores físicos

O sistema tem vários milhares de shards lógicos, mapeados em código para um número bem menor de shards físicos. Cada shard lógico é um schema do Postgres, e cada tabela shardada existe dentro de cada schema.

  1. A aplicação guarda em código o mapa de qual shard lógico mora em qual servidor físico.

    Diagrama da arquitetura: Instagram 2012: shards lógicos sobre servidores físicos
    CPServidores de aplicaçãomapa no código
    DBServidor Postgres A
    DBServidor Postgres B
    DBServidor Postgres C
  2. Cada servidor físico hospeda um conjunto de shards lógicos, e cada shard lógico é um schema do Postgres.

    Diagrama da arquitetura: Instagram 2012: shards lógicos sobre servidores físicos
    CPServidores de aplicação
    DBServidor Postgres Aschemas
    DBServidor Postgres Bschemas
    DBServidor Postgres C
  3. Para crescer, move-se um conjunto de shards lógicos de um banco para outro, sem reagrupar os dados.

    Diagrama da arquitetura: Instagram 2012: shards lógicos sobre servidores físicos
    CPServidores de aplicação
    DBServidor Postgres A
    DBServidor Postgres Bcede shards
    DBServidor Postgres Crecebe shards

Cada ID combina três campos: tempo, shard lógico e uma sequência autoincremental.

Campo do IDTamanhoPara que serve
Tempo41 bitsMilissegundos desde uma época própria, o que dá 41 anos de IDs
Shard lógico13 bitsIdentifica o shard lógico do dado
Sequência10 bitsSequência autoincremental, módulo 1024

Com essa sequência, o sistema consegue gerar 1024 IDs por shard por milissegundo.

A geração do ID fica dentro de cada tabela de cada shard, usando PL/pgSQL e a função de autoincremento que o Postgres já oferece. O ID volta ao servidor de aplicação pelo RETURNING do INSERT.

06 · FILAS E OBSERVABILIDADE

Trabalho pesado fora da requisição, e olho no sistema

Compartilhar uma foto no Twitter ou no Facebook, ou avisar assinantes em tempo real de uma nova foto, vira uma tarefa enviada ao Gearman, um sistema de fila de tarefas. Fazer isso de forma assíncrona deixa o upload de mídia terminar rápido, enquanto o trabalho pesado roda em segundo plano.

  1. O usuário publica a foto e a aplicação conclui o upload.

    Diagrama da arquitetura: Instagram 2011: tarefas em segundo plano
    CLApp do usuário
    CPServidores de aplicação
    QGearman
    CPWorkers em Python
  2. A aplicação enfileira as tarefas pesadas, como o compartilhamento em outras redes e o fan-out do feed.

    Diagrama da arquitetura: Instagram 2011: tarefas em segundo plano
    CLApp do usuário
    CPServidores de aplicação
    QGearmantarefas na fila
    CPWorkers em Python
  3. Cerca de 200 workers em Python consomem a fila, divididos entre os serviços para os quais compartilham.

    Diagrama da arquitetura: Instagram 2011: tarefas em segundo plano
    CLApp do usuário
    CPServidores de aplicação
    QGearman
    CPWorkers em Pythonconsomem

O fan-out do feed também passa pelo Gearman, e por isso publicar é tão responsivo para um usuário novo quanto para um com muitos seguidores.

Com mais de 100 instâncias, acompanhar o sistema inteiro era importante. O time usava Munin para gráficos e alertas, com plugins próprios para métricas de negócio como cadastros por minuto e fotos postadas por segundo, além de Pingdom para monitoramento externo e PagerDuty para notificações e incidentes. Tema: monitoramento e observabilidade.

Perguntas frequentes

O que é Instagram: 14 milhões de usuários com 3 engenheiros (Postgres e IDs por shard)?

Arquitetura real em produção. Pontos centrais: geração de IDs únicos e shards lógicos vs físicos.

O que o design de Instagram: 14 milhões de usuários com 3 engenheiros (Postgres e IDs por shard) cobre?

Ele está organizado nestas seções: Uma startup, poucos engenheiros, muito tráfego, Do DNS round-robin ao balanceador gerenciado, A pilha completa em 2011, Shardar sem trocar de banco, Milhares de shards lógicos sobre poucos servidores físicos e Trabalho pesado fora da requisição, e olho no sistema.

Quanto tempo leva Instagram: 14 milhões de usuários com 3 engenheiros (Postgres e IDs por shard) e qual é o nível?

Leva cerca de 12 minutos para ler e tem nível Júnior.

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.