Introduction
- En 2017, Discord a expliqué comment l’entreprise avait migré sa base de données de MongoDB vers Cassandra pour stocker les messages
- Cassandra offre de la scalabilité, de la tolérance aux pannes et une maintenance relativement simple, mais avec le temps, des problèmes de performance et une charge de maintenance plus lourde sont apparus
- En 2022, Discord a de nouveau migré sa base de données, cette fois vers ScyllaDB
Problèmes rencontrés avec Cassandra
- Structure de stockage des messages : les messages sont partitionnés et stockés à l’aide de
channel_id et de bucket
- Problème de partition chaude : lorsque le trafic se concentre sur certains canaux, la latence augmente dans l’ensemble de la base de données
- Problèmes de maintenance : les opérations de compaction des SSTables et les problèmes de garbage collection de la JVM entraînent une baisse des performances
Changement d’architecture
- Adoption de ScyllaDB : une base de données compatible Cassandra écrite en C++, qui résout les problèmes liés au garbage collection
- Service de données : un service intermédiaire est placé entre l’API et la base de données pour réguler le trafic et améliorer les performances
- Utilisation de Rust : Rust est utilisé pour écrire du code concurrent sûr et rapide
Service de données
- Fusion des requêtes : lorsque plusieurs utilisateurs demandent les mêmes données, une seule requête est envoyée à la base de données et le résultat est partagé
- Routage basé sur un hachage cohérent : les requêtes d’un même canal sont routées vers la même instance de service afin de réduire la charge sur la base de données
Migration à grande échelle
- Mise en place du cluster ScyllaDB : une configuration de stockage rapide et durable a été construite à l’aide de SSD locaux et de RAID
- Migration des données : les données ont été transférées rapidement à l’aide d’un migrateur de données écrit en Rust
- Validation automatique des données : un petit volume de requêtes de lecture est envoyé aux deux bases de données afin de comparer les résultats et vérifier l’intégrité des données
Quelques mois plus tard
- Amélioration des performances : de meilleures performances sont obtenues avec moins de nœuds que Cassandra
- Réduction de la latence : les performances de lecture et d’insertion des messages se sont nettement améliorées
- Nouveaux cas d’usage produit : grâce à ces gains de performance, il est devenu possible d’implémenter de nouvelles fonctionnalités
# Résumé de GN⁺
- Discord a migré sa base de données vers ScyllaDB pour résoudre les problèmes de performance de Cassandra
- Grâce à un service de données écrit en Rust et à ScyllaDB, l’entreprise gère efficacement le trafic et améliore les performances
- Pendant la migration des données, des méthodes rapides et efficaces ont permis d’achever le basculement sans interruption de service
- Cet article traite des défis et des solutions d’une migration de base de données à grande échelle, ce qui en fait une lecture utile pour les personnes intéressées par l’exploitation de systèmes de grande ampleur
1 commentaires
Avis Hacker News
L’article de blog incrimine le GC, mais le vrai problème vient plutôt de la manière dont Cassandra était utilisé, ou de la façon dont Cassandra gère les suppressions massives
S’ils avaient utilisé un protocole de chat distribué, ce problème ne se serait pas posé
Commentaire complémentaire du cofondateur de ScyllaDB
tombstone_gc=repairLa couche de service fait penser à Varnish Cache
Supprimer d’anciens messages est quasiment impossible
Article très bien écrit
Le nombre de nœuds de stockage de messages de Discord est plus faible que prévu
Stocker des données et faire du data mining sont deux problèmes différents
L’équipe ScyllaDB a priorisé les améliorations de performance et a implémenté des requêtes inversées
Discussion sur « How Discord Stores Trillions of Messages »