Pular para o conteúdo

Incidente · Staff

Roblox out/2021: 73 h fora do ar por contenção no Consul

Incidente real. Pontos centrais: service discovery e mesh e controle de sobrecarga.

15 min de leitura · Incidente em 2021-10, durou 73 h · Fonte: Roblox · Conteúdo revisado em 22 de outubro de 2026

Resposta curta

Incidente real. Pontos centrais: service discovery e mesh e controle de sobrecarga. Entre 28 e 31 de outubro de 2021, a Roblox ficou fora do ar por 73 horas. A plataforma serve dezenas de milhões de jogadores por dia sobre centenas de serviços internos.

01 · CONTEXTO

Uma plataforma inteira apoiada em um registro de serviços

Entre 28 e 31 de outubro de 2021, a Roblox ficou fora do ar por 73 horas. A plataforma serve dezenas de milhões de jogadores por dia sobre centenas de serviços internos. O post-mortem oficial afirma que não houve perda de dados de usuários nem acesso não autorizado; a duração, e não o dano aos dados, é o que torna o caso um clássico de resposta a incidentes.

A infraestrutura é própria, com mais de 18 mil servidores e 170 mil contêineres. O Nomad agenda os contêineres, o Vault entrega segredos e o Consul faz service discovery, health checks, locks de sessão e ainda serve de KV store. Os serviços só se encontram entre si por meio desse registro.

O Consul roda como um cluster com 5 votantes e 5 não votantes. Os votantes guardam o estado autoritativo e os não votantes são réplicas de leitura. Um líder é eleito com o algoritmo Raft e é ele quem replica as escritas.

  1. O tráfego dos jogadores chega pelo DNS e vai aos serviços de backend.

    Diagrama da arquitetura: Plataforma com service discovery central
    CLJogadores
    NWDNS de entrada
    CPServiços de backend
    DBCluster Consul
    CPAgendador de contêineres
    CPCofre de segredos
    CHCamadas de cache
    DBBancos de dados
  2. Cada serviço consulta o Consul para saber onde estão os serviços de que depende.

    Diagrama da arquitetura: Plataforma com service discovery central
    CLJogadores
    NWDNS de entrada
    CPServiços de backend
    DBCluster Consulregistro central
    CPAgendador de contêineres
    CPCofre de segredos
    CHCamadas de cache
    DBBancos de dados
  3. O agendador e o cofre de segredos também dependem do Consul, então ele fica no caminho de quase tudo.

    Diagrama da arquitetura: Plataforma com service discovery central
    CLJogadores
    NWDNS de entrada
    CPServiços de backend
    DBCluster Consuldependência comum
    CPAgendador de contêineres
    CPCofre de segredos
    CHCamadas de cache
    DBBancos de dados
  4. Abaixo dos serviços ficam os caches e os bancos. Os bancos não foram afetados pela queda, mas o sistema de cache ficou doente.

    Diagrama da arquitetura: Plataforma com service discovery central
    CLJogadores
    NWDNS de entrada
    CPServiços de backend
    DBCluster Consul
    CPAgendador de contêineres
    CPCofre de segredos
    CHCamadas de cachedoente
    DBBancos de dadosnão afetados

02 · A INVESTIGAÇÃO

Três hipóteses razoáveis, três falhas

Em 28 de outubro à tarde, o Vault ficou lento e um único servidor Consul mostrava CPU alta, sem impacto aos jogadores. As métricas apontavam latência de escrita elevada no KV, e a primeira hipótese foi hardware degradado, com a troca de um nó. Mesmo com hardware novo o desempenho não voltou, e às 16:35 os jogadores online caíram a 50% do normal.

A razão da queda total é estrutural: sem um Consul saudável, os serviços não se localizam, o agendador não cria contêineres e o cofre não entrega segredos. O próprio post conclui que o Consul era um ponto único de falha. Nesse ponto entrou o raciocínio sobre disponibilidade de uma camada que todas as outras supõem estar de pé.

O que se tentouO que se aprendeu
Hardware melhorTrocar todos os nós por máquinas de 128 núcleosNão resolveu o problema; o desempenho de escrita seguiu degradado
Reset por snapshotParar o cluster e restaurar o estado de poucas horas antesFuncionou até a carga de reconexão voltar; então degradou de novo
Reduzir o usoDesligar usos não essenciais e espaçar health checks de 60 s para 10 minFuncionou por horas, depois o Consul ficou instável outra vez

03 · A CAUSA RAIZ

Um recurso novo e um defeito de armazenamento

Ao olhar por dentro do Consul, em vez de olhar a partir dos serviços que dependem dele, a equipe viu escritas no KV bloqueadas por longos períodos: contenção.

Meses antes, a Roblox migrou do Consul 1.9 para o 1.10 para usar um recurso de streaming, desenhado para reduzir CPU e banda ao distribuir atualizações. Um dia antes da queda, em 27 de outubro às 14:00, o recurso foi ativado em um serviço de roteamento de tráfego, e o número de nós desse serviço subiu 50% para o pico de fim de ano.

  1. O serviço de roteamento passa a assinar atualizações por streaming nos nós de leitura.

    Diagrama da arquitetura: Por dentro do cluster Consul
    CPServiço de roteamento de tráfego
    CPDemais serviços
    DBNão votantes
    DBLíder Raft
    DBVotantes
    NWPainéis do cluster
  2. Ao mesmo tempo, os demais serviços escrevem health checks e dados no líder, numa carga alta de escrita.

    Diagrama da arquitetura: Por dentro do cluster Consul
    CPServiço de roteamento de tráfego
    CPDemais serviços
    DBNão votantes
    DBLíder Raft
    DBVotantes
    NWPainéis do cluster
  3. Sob leitura e escrita muito altas, a contenção em um único canal bloqueia as escritas e o cluster perde eficiência.

    Diagrama da arquitetura: Por dentro do cluster Consul
    CPServiço de roteamento de tráfego
    CPDemais serviços
    DBNão votantescontenção
    DBLíder Raftescritas bloqueadas
    DBVotantes
    NWPainéis do cluster
  4. Mesmo depois de desligar o streaming, alguns líderes seguiam lentos, e a equipe precisou impedir que eles permanecessem eleitos.

    Diagrama da arquitetura: Por dentro do cluster Consul
    CPServiço de roteamento de tráfego
    CPDemais serviços
    DBNão votantes
    DBLíder Raftlíder lento
    DBVotantes
    NWPainéis do cluster

A análise da HashiCorp mostrou o efeito: o desenho do streaming concentra contenção em um único canal Go quando leitura e escrita estão ambas muito altas, e servidores de dois soquetes com memória NUMA pioram o problema, o que explica por que mais núcleos não ajudaram. O desligamento do streaming, propagado às 15:51 de 30 de outubro, trouxe a latência mediana das escritas a cerca de 300 ms.

O segundo problema ficou escondido por mais tempo. O Raft guarda seu log no BoltDB, que nunca devolve espaço ao disco depois de apagar entradas antigas, e sim reaproveita páginas livres rastreadas por uma freelist. Na carga da Roblox, um log de 4,2 GB guardava só 489 MB de dados reais, e uma freelist de 7,8 MB era regravada a cada append, mesmo para escritas de 16 kB ou menos.

ProblemaMecanismoTratamento
Streaming do ConsulContenção em um único canal sob leitura e escrita muito altasDesligado em todo o cluster; redesenho pela HashiCorp
Freelist do BoltDBFreelist enorme regravada a cada append no log do RaftCompactação do banco e troca planejada por bbolt

04 · RECUPERAÇÃO

Sem visibilidade e sem partida a frio

A causa levou tempo para aparecer também porque o monitoramento dependia do que estava quebrado. Sistemas críticos de monitoramento dependiam de sistemas afetados, como o Consul, e havia uma dependência circular entre a telemetria e o registro.

  1. Em operação normal, os serviços enviam métricas à telemetria.

    Diagrama da arquitetura: Telemetria que depende do que monitora
    CPServiços de backend
    NWPlataforma de telemetria
    DBCluster Consul
    CLEquipe de plantão
  2. A telemetria descobre o que coletar consultando o mesmo Consul.

    Diagrama da arquitetura: Telemetria que depende do que monitora
    CPServiços de backend
    NWPlataforma de telemetria
    DBCluster Consuldependência
    CLEquipe de plantão
  3. Com o Consul doente, a telemetria perde a visão exatamente quando a equipe mais precisa dela.

    Diagrama da arquitetura: Telemetria que depende do que monitora
    CPServiços de backend
    NWPlataforma de telemetriacega
    DBCluster Consulinstável
    CLEquipe de plantão

Com o Consul estável depois de 54 horas, restava reconstruir o cache. O cache atendia cerca de 1 bilhão de requisições por segundo e, por guardar dados transitórios, a saída mais simples era reimplantá-lo. Os dados de agendamento do cache no KV estavam incorretos, provavelmente por causa do reset por snapshot, e um nó doente aparecia ao agendador como livre e recebia jobs que falhavam. A ferramenta de implantação servia a ajustes incrementais, não à subida de um cluster grande do zero.

Às 05:00 de 31 de outubro, 61 horas após o início, Consul e cache estavam saudáveis. Com caches frios, a Roblox usou DNS steering para limitar quantos jogadores entravam, subindo o acesso em degraus de cerca de 10% e conferindo carga do banco, desempenho do cache e estabilidade a cada degrau. Às 16:45 de domingo, 73 horas após o início, todos os jogadores tinham acesso.

  1. Os jogadores voltam a tentar entrar e o DNS decide quem passa.

    Diagrama da arquitetura: Retorno gradual com DNS steering
    CLJogadores
    NWDNS com direcionamento
    EDGPágina de manutenção
    CPServiços de backend
    CHCaches frios
    DBBancos de dados
    NWMonitoramento
  2. Uma fração sorteada vai aos serviços e o restante fica na página de manutenção.

    Diagrama da arquitetura: Retorno gradual com DNS steering
    CLJogadores
    NWDNS com direcionamento
    EDGPágina de manutençãoretidos
    CPServiços de backend
    CHCaches frios
    DBBancos de dados
    NWMonitoramento
  3. Com os caches vazios, as leituras caem no banco até os caches se aquecerem.

    Diagrama da arquitetura: Retorno gradual com DNS steering
    CLJogadores
    NWDNS com direcionamento
    EDGPágina de manutenção
    CPServiços de backend
    CHCaches friosfrios
    DBBancos de dadoscarga extra
    NWMonitoramento
  4. A equipe confere as métricas antes de subir a fração para o degrau seguinte.

    Diagrama da arquitetura: Retorno gradual com DNS steering
    CLJogadores
    NWDNS com direcionamento
    EDGPágina de manutenção
    CPServiços de backend
    CHCaches frios
    DBBancos de dados
    NWMonitoramentoporta de decisão

05 · LIÇÕES

O que mudou e o que o caso ensina

Os pontos de falha estavam em como a plataforma dependia de um único cluster Consul para vários workloads. A Roblox construiu um datacenter adicional e passou a migrar para várias zonas, separou serviços críticos em clusters dedicados, começou a tirar dados do KV para um armazenamento mais apropriado, removeu a dependência circular da telemetria e adicionou alertas direcionados a Consul e BoltDB. Uma parte do plano de recuperação de desastres passou a ser a subida de caches do zero.

FragilidadeMudança
Um cluster para tudoClusters dedicados para serviços críticos e novos datacenters e zonas
Telemetria dependente do monitoradoRemoção da dependência circular e alertas sobre Consul e BoltDB
Recuperação do zeroImplantação de caches redesenhada para partir de um estado vazio

Perguntas frequentes

O que é Roblox out/2021: 73 h fora do ar por contenção no Consul?

Incidente real. Pontos centrais: service discovery e mesh e controle de sobrecarga.

O que o design de Roblox out/2021: 73 h fora do ar por contenção no Consul cobre?

Ele está organizado nestas seções: Uma plataforma inteira apoiada em um registro de serviços, Três hipóteses razoáveis, três falhas, Um recurso novo e um defeito de armazenamento, Sem visibilidade e sem partida a frio e O que mudou e o que o caso ensina.

Quanto tempo leva Roblox out/2021: 73 h fora do ar por contenção no Consul e qual é o nível?

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

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.