- Na semana passada, a Uber explorou o LedgerStore (LSG), um banco de dados no estilo ledger somente para acréscimo.
- Nesta semana, o foco é em como a Uber migrou dados de razão contábil críticos para o negócio para o LSG.
- O texto discute como mais de 1 trilhão de itens (vários petabytes de dados) foram movidos de forma transparente, sem interrupções, e o que foi aprendido no processo.
Histórico
- O Gulfstream é a plataforma de pagamentos da Uber e foi lançado em 2017 usando o DynamoDB.
- Na escala da Uber, o DynamoDB ficou caro; por isso, eles passaram a manter apenas 12 semanas de dados (dados quentes) no DynamoDB, enquanto os dados mais antigos (dados frios) eram armazenados no TerraBlob, o blobstore da Uber.
- A solução de longo prazo era usar o LSG. O LSG foi projetado sob medida para armazenar dados no estilo de pagamentos.
- Principais recursos do LSG:
- Imutabilidade verificável (é possível confirmar com assinaturas criptográficas que os registros não foram alterados)
- Armazenamento em camadas para gerenciamento de custos (dados quentes ficam onde é melhor para atender requisições, e dados frios onde o armazenamento é mais otimizado)
- Melhoria na latência de índices secundários eventualmente consistentes
- Até 2021, o Gulfstream armazenava dados usando uma combinação de DynamoDB, TerraBlob e LSG.
- DynamoDB: dados das 12 semanas mais recentes
- TerraBlob: dados frios
- LSG: onde os dados eram gravados e o destino da migração
Por que era necessário migrar?
- O LSG é mais adequado para armazenar dados no estilo ledger por causa da imutabilidade.
- A mudança para o LSG trouxe economias recorrentes significativas.
- Passar de três armazenamentos para um simplificaria o código e o design do serviço Gulfstream.
- O LSG prometia menor latência de indexação e, por rodar on-premises dentro dos data centers da Uber, também oferecia menor latência de rede.
Riscos relacionados à natureza dos dados
- Os dados migrados eram todos os dados de razão contábil de negócios da Uber desde 2017:
- Registros imutáveis: 1,2 PB em tamanho comprimido
- Índices secundários: 0,5 PB em tamanho não comprimido
- Os registros imutáveis não podem ser modificados, enquanto os dados de índices secundários têm flexibilidade para serem alterados a fim de corrigir problemas.
Validação
- Para garantir que o backfill estava correto e aceitável em todos os aspectos, era necessário verificar se o sistema conseguia lidar com o tráfego atual e se os dados que não eram acessados no momento também estavam corretos.
- Critérios de validação:
- Completude: se todos os registros foram preenchidos no backfill
- Exatidão: se todos os registros estavam corretos
- Carga: se o LSG conseguia lidar com a carga atual
- Latência: se a latência P99 do LSG estava dentro de uma faixa aceitável
- Atraso: se a latência de geração de índices secundários estava dentro de uma faixa aceitável
Validação shadow
- As respostas antes e depois da migração foram comparadas para garantir que o tráfego atual não fosse afetado por problemas na migração dos dados ou por bugs no código.
- Com a validação shadow, a equipe confirmou que o backfill era pelo menos 99,99% completo e correto, definindo um limite superior de 99,9999%.
- A validação shadow também confirmou que o LSG conseguia lidar com o tráfego de produção e trouxe confiança ao código de acesso aos dados.
- Ela também trouxe confiança na completude e na exatidão dos dados que estavam sendo acessados naquele momento.
Validação offline e backfill incremental
- Todos os dados do LSG foram comparados com um dump de dados do DynamoDB.
- A validação offline confirmou que o backfill foi realizado corretamente e cobriu o conjunto completo de dados.
- A validação offline precisava ser realizada em conjunto com a validação shadow.
Problemas de backfill
- Todo backfill envolve riscos. A Uber usou o Apache Spark para executar o backfill.
- Como os problemas foram tratados:
- Escalabilidade: começar em pequena escala e expandir gradualmente
- Backfill incremental: dividir os dados em pequenos lotes para preenchimento
- Controle de velocidade: ajustar a taxa dos jobs de backfill
- Controle dinâmico de velocidade: ajustar a taxa monitorando o estado atual do sistema
- Parada de emergência: oferecer a capacidade de interromper rapidamente o backfill em caso de suspeita de sobrecarga
- Tamanho dos arquivos de dados: manter o tamanho dos arquivos de dump em um nível adequado
- Tolerância a falhas: lidar com problemas de qualidade/corrupção de dados
- Logging: limitar logs para não sobrecarregar a infraestrutura de logging
Mitigação de risco
- A equipe analisou vários dados estatísticos de validação e backfill e fez o rollout do LSG de forma conservadora.
- No início, foi usado um fallback para buscar dados do DynamoDB caso o backfill falhasse.
- Os logs de fallback foram verificados para confirmar que os dados não estavam realmente faltando no LSG.
Conclusão
- Este artigo abordou o processo de migrar dados de razão contábil críticos para o negócio, em larga escala, de um armazenamento de dados para outro.
- Foram tratados vários aspectos, como critérios de migração, validação, problemas de backfill e segurança operacional.
- A migração foi concluída ao longo de dois anos, sem interrupções nem incidentes.
Opinião do GN⁺
- Importância da migração de dados: migrações de dados em larga escala são complexas e arriscadas, mas oferecem grandes benefícios no longo prazo por meio de redução de custos e simplificação do sistema.
- Utilidade da validação shadow: a validação shadow é uma ferramenta poderosa para verificar a completude e a exatidão dos dados sem afetar o tráfego real.
- Necessidade da validação offline: a validação offline também é essencial, pois pode encontrar problemas que a validação shadow sozinha não revela.
- Abordagem gradual para backfill: executar o backfill em etapas, dividido em pequenos lotes, é eficaz para evitar sobrecarga do sistema.
- Função de parada de emergência: a capacidade de interromper rapidamente o backfill quando ocorre um problema é importante para manter a estabilidade do sistema.
1 comentários
Comentários do Hacker News
Resumo dos comentários do Hacker News
2 bilhões de corridas por trimestre
Usando o DynamoDB de forma inadequada
Google rejeita
SQLite em um único servidor
LedgerStore não é open source
Era da infraestrutura customizada
Nuvem proprietária cara
Consideraram o TigerBeetle?
DynamoDB é caro
Custo de manter a equipe