Introdução
- Em 2017, o Discord compartilhou como migrou o banco de dados de MongoDB para Cassandra para armazenar mensagens
- O Cassandra oferece escalabilidade, tolerância a falhas e facilidade de manutenção, mas com o tempo os problemas de desempenho e a carga de manutenção aumentaram
- Em 2022, o Discord migrou novamente o banco de dados, desta vez para ScyllaDB
Problemas no Cassandra
- Estrutura de armazenamento de mensagens: as mensagens eram armazenadas com particionamento por
channel_id e bucket
- Problema de partições quentes: quando o tráfego se concentrava em canais específicos, a latência de todo o banco de dados aumentava
- Problemas de manutenção: houve degradação de desempenho devido à compactação de SSTables e aos problemas de coleta de lixo da JVM
Mudanças na arquitetura
- Adoção do ScyllaDB: banco de dados compatível com Cassandra, escrito em C++, que resolveu os problemas de coleta de lixo
- Serviço de dados: foi colocado um serviço intermediário entre a API e o banco de dados para controlar o tráfego e melhorar o desempenho
- Uso de Rust: Rust foi usado para escrever código concorrente seguro e rápido
Serviço de dados
- Mesclagem de requisições: quando vários usuários solicitam os mesmos dados, o banco é consultado apenas uma vez e o resultado é compartilhado
- Roteamento com hash consistente: as requisições do mesmo canal são roteadas para a mesma instância de serviço, reduzindo a carga no banco de dados
Migração em grande escala
- Construção do cluster ScyllaDB: configuração de armazenamento rápida e durável com SSDs locais e RAID
- Migração de dados: os dados foram transferidos rapidamente usando um migrador de dados escrito em Rust
- Validação automática de dados: pequenas quantidades de requisições de leitura foram enviadas aos dois bancos para comparar os resultados e verificar a integridade dos dados
Alguns meses depois
- Melhoria de desempenho: ofereceu desempenho melhor que o Cassandra com menos nós
- Redução da latência: o desempenho de leitura e inserção de mensagens melhorou significativamente
- Novos casos de uso de produto: graças à melhora de desempenho, tornou-se possível implementar novos recursos
# Resumo do GN⁺
- O Discord migrou o banco de dados para ScyllaDB para resolver os problemas de desempenho do Cassandra
- Com um serviço de dados escrito em Rust e o ScyllaDB, conseguiu gerenciar o tráfego de forma eficaz e melhorar o desempenho
- No processo de migração de dados, usou métodos rápidos e eficientes para concluir a transição sem downtime
- O texto aborda os desafios e as soluções de uma migração de banco de dados em larga escala, sendo útil para quem se interessa pela operação de sistemas de grande porte
1 comentários
Comentários no Hacker News
O post do blog critica o GC, mas na prática o problema estava no modo como o Cassandra era usado ou em como o Cassandra lida com exclusões em massa
Se tivessem usado um protocolo de chat distribuído, esse problema não existiria
Comentário adicional do cofundador da ScyllaDB
tombstone_gc=repairA camada de serviço lembra o Varnish Cache
Excluir mensagens antigas é quase impossível
Artigo muito bem escrito
O número de nós de armazenamento de mensagens do Discord é menor do que o esperado
Armazenar dados e fazer mineração de dados são problemas diferentes
A equipe da ScyllaDB priorizou melhorias de desempenho e implementou consultas reversas
Discussão sobre "How Discord Stores Trillions of Messages"