O `rm -rf` no primário — e os cinco backups que não funcionavam

GitLab · 31 de janeiro de 2017

Impacto: Cerca de 6 horas de dados perdidos e 18 horas de indisponibilidade do GitLab.com.

O que aconteceu

Um pico de carga causado por um raspador levou a réplica do banco a ficar para trás do primário. Um engenheiro trabalhava, de madrugada, para restabelecer a replicação.

Para recriar a réplica do zero, era preciso limpar o diretório de dados dela. O comando foi executado — mas no terminal conectado ao primário, não à réplica. Ao perceber, o engenheiro interrompeu em cerca de um segundo; boa parte dos dados já tinha ido.

Aí começou a parte que ficou famosa. Havia cinco mecanismos de recuperação previstos, e nenhum funcionou como esperado: os backups por pg_dump falhavam em silêncio por incompatibilidade de versão; os snapshots de disco não estavam habilitados para aquele servidor; o backup para o armazenamento de objetos estava vazio; e assim por diante.

O que salvou foi um snapshot feito por acaso, seis horas antes, por causa de um teste não relacionado. A restauração a partir dele levou a maior parte das 18 horas.

A linha do tempo

  1. T+0

    Pico de carga; a réplica fica para trás do primário.

  2. T+~2h

    Engenheiro trabalha para recriar a réplica.

  3. T+~2h30

    O comando de limpeza é executado no terminal do primário. Interrompido em ~1 segundo, tarde demais.

  4. T+~3h

    Descobre-se, um a um, que os cinco caminhos de recuperação não servem.

  5. T+~4h

    Um snapshot acidental de 6 horas antes é localizado.

  6. T+18h

    Serviço restabelecido, com ~6 horas de dados perdidos.

A causa raiz

O comando errado é o gatilho e é o detalhe menos importante. A causa raiz é que nenhum dos cinco mecanismos de backup era verificado — todos falhavam em silêncio havia tempo, e a organização acreditava estar protegida por cinco camadas que não existiam. Backup que não é restaurado periodicamente não é backup: é uma crença.

Antes do incidente

O que você colocaria na pilha para conter o estrago?

O que mudou depois

  • Restaurações passaram a ser testadas de forma automática e periódica — a única prova de que um backup existe.
  • Alertas foram criados para falha silenciosa dos processos de backup.
  • Terminais em produção ganharam identificação visual clara do servidor conectado.

Fonte: GitLab — *Postmortem of database outage of January 31 2017*, publicado no blog da empresa