Pular para o conteúdo

Incidente · Júnior

GitLab 2017: rm -rf no banco primário e 5 métodos de backup que falharam

Incidente real. Pontos centrais: teste de restore.

9 min de leitura · Incidente em 2017, durou · Fonte: GitLab · Conteúdo revisado em 22 de outubro de 2026

Resposta curta

Incidente real. Pontos centrais: teste de restore. Em 31 de janeiro de 2017, o GitLab.com ficou fora do ar por horas depois que dados de produção foram apagados do servidor de banco primário. O post-mortem público da empresa é a fonte deste caso.

01 · CONTEXTO

Um primário, um standby e a falsa sensação de segurança

Em 31 de janeiro de 2017, o GitLab.com ficou fora do ar por horas depois que dados de produção foram apagados do servidor de banco primário. O post-mortem público da empresa é a fonte deste caso. A lição central cabe numa frase: ter backup não é o mesmo que ter recuperação de desastres, e só um restore testado prova que ela existe.

A arquitetura era simples. Um banco primário recebia todo o tráfego e um secundário em espera ativa ficava só para failover. Um único banco precisava aguentar toda a carga, e a réplica, por desenho, não servia como cópia de segurança: copia também um apagão.

  1. A aplicação envia todas as consultas ao único primário.

    Diagrama da arquitetura: Primário e standby do banco
    CPAplicação
    DBBanco primário
    DBSecundário em espera
  2. O primário replica seus dados para o secundário, que fica em espera.

    Diagrama da arquitetura: Primário e standby do banco
    CPAplicação
    DBBanco primário
    DBSecundário em espera
  3. O secundário existe para assumir em uma falha do primário. Isso não o torna um backup: o que for apagado lá também some.

    Diagrama da arquitetura: Primário e standby do banco
    CPAplicação
    DBBanco primário
    DBSecundário em esperasó failover

02 · A CADEIA DE EVENTOS

De um pico de carga a um diretório apagado

Dois eventos coincidiram: um aumento de spam e um processo que tentava remover um funcionário sinalizado por abuso por engano. A carga no primário subiu e ele descartou segmentos de WAL (o log de escrita antecipada) antes de o secundário copiá-los, então a replicação parou.

Sem arquivamento de WAL, o secundário precisava ser reconstruído à mão: apagar o diretório de dados da réplica e copiar tudo do primário. Esse trabalho era manual, não automatizado e mal documentado. Durante as tentativas, o comando de apagar o diretório foi executado no primário, e cerca de 300 GB já tinham sumido quando o engenheiro percebeu o erro e o interrompeu.

O que aconteceuPor que aconteceu
Replicação parouO primário removeu WAL antes da cópiaCarga alta e nenhum arquivamento de WAL
Réplica reconstruída à mãoProcedimento manual sob pressãoSem automação e sem documentação adequada
Primário apagadoComando executado no host erradoO post propõe tornar óbvio em qual host se está, em vez de proibir comandos

03 · OS BACKUPS

Quatro procedimentos, nenhum utilizável

Ao procurar os backups, o primeiro achado foi um bucket de armazenamento vazio. Havia quatro procedimentos de recuperação em vigor, e nenhum atendia à necessidade naquele momento.

  1. O dump lógico diário deveria alimentar o bucket. Ao procurar, o bucket estava vazio.

    Diagrama da arquitetura: Procedimentos de backup do banco
    DBBanco primário
    CPTarefa agendada de dump
    DBBucket de backupsvazio
    DBBanco de staging
    DBSecundário
    NWAlertas por e-mail
  2. A tarefa rodava em um servidor de aplicação e usava uma versão antiga da ferramenta de dump contra um banco de versão maior, então terminava com erro.

    Diagrama da arquitetura: Procedimentos de backup do banco
    DBBanco primário
    CPTarefa agendada de dumpversão errada
    DBBucket de backups
    DBBanco de staging
    DBSecundário
    NWAlertas por e-mail
  3. O aviso de falha ia por e-mail, mas a falta de DMARC fez o destino rejeitá-lo. A falha foi silenciosa.

    Diagrama da arquitetura: Procedimentos de backup do banco
    DBBanco primário
    CPTarefa agendada de dump
    DBBucket de backups
    DBBanco de staging
    DBSecundário
    NWAlertas por e-mailrejeitado
  4. O snapshot do disco ia ao staging para testes. Funcionava, mas não era feito para recuperação de desastre.

    Diagrama da arquitetura: Procedimentos de backup do banco
    DBBanco primário
    CPTarefa agendada de dump
    DBBucket de backups
    DBBanco de stagingfora do propósito
    DBSecundário
    NWAlertas por e-mail
  5. A réplica servia a failover e já tinha sido apagada na reconstrução. Os snapshots do Azure não estavam ligados nos servidores de banco.

    Diagrama da arquitetura: Procedimentos de backup do banco
    DBBanco primário
    CPTarefa agendada de dump
    DBBucket de backups
    DBBanco de staging
    DBSecundárioapagada
    NWAlertas por e-mail
Para que serviaPor que não salvou
Dump lógico diárioBackup de restauraçãoDump falhava por versão incompatível e o aviso era rejeitado
Snapshot de disco para stagingCopiar dados para testesNão era pensado para recuperação de desastre
Snapshots do AzureRestaurar discos inteirosNão estavam habilitados nos servidores de banco
ReplicaçãoFailoverDados da réplica já tinham sido apagados

04 · A RECUPERAÇÃO

Restaurando a partir do staging

A única opção que reduzia a perda era um snapshot manual feito por um engenheiro cerca de seis horas antes da falha; a alternativa era perder quase um dia de dados. A cópia saiu do staging, que usava discos lentos e baratos, e levou cerca de 18 horas, com os discos como gargalo. Na tarde de 1 de fevereiro o banco voltou sem webhooks, restaurados depois.

  1. Sem o primário, os usuários não conseguem usar o serviço.

    Diagrama da arquitetura: Restauração a partir do staging
    CLUsuários
    DBStaging com snapshot
    DBBanco de produção reconstruídosem dados
  2. O staging guardava a única cópia utilizável, de horas antes da falha.

    Diagrama da arquitetura: Restauração a partir do staging
    CLUsuários
    DBStaging com snapshotúnica cópia
    DBBanco de produção reconstruído
  3. A cópia para produção ficou presa a discos lentos e limitados, e a restauração demorou muitas horas.

    Diagrama da arquitetura: Restauração a partir do staging
    CLUsuários
    DBStaging com snapshotgargalo de disco
    DBBanco de produção reconstruídoreconstruído

Houve perda permanente: estimativa de pelo menos milhares de projetos e comentários e centenas de contas novas. Os repositórios Git e as wikis ficaram indisponíveis, mas não perderam dados. Para evitar reutilizar IDs que possam ter sido emitidos antes da queda, os contadores de ID do banco foram avançados por uma margem grande.

05 · LIÇÕES

O que o desenho precisa provar

O post lista melhorias que atacam cada falha: testes automatizados de restauração, investigação de recuperação em ponto no tempo com arquivamento contínuo, e monitoramento dos backups. Observabilidade aqui significa alertar sobre o que deveria existir, como um backup recente, e não só sobre o que falhou ruidosamente.

O raciocínio de fundo vem do próprio texto: o ambiente ideal é aquele em que se pode errar e recuperar rápido e com pouco impacto, o que exige praticar a recuperação com regularidade.

Perguntas frequentes

O que é GitLab 2017: rm -rf no banco primário e 5 métodos de backup que falharam?

Incidente real. Pontos centrais: teste de restore.

O que o design de GitLab 2017: rm -rf no banco primário e 5 métodos de backup que falharam cobre?

Ele está organizado nestas seções: Um primário, um standby e a falsa sensação de segurança, De um pico de carga a um diretório apagado, Quatro procedimentos, nenhum utilizável, Restaurando a partir do staging e O que o desenho precisa provar.

Quanto tempo leva GitLab 2017: rm -rf no banco primário e 5 métodos de backup que falharam e qual é o nível?

Leva cerca de 9 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.