Einführung
- 2017 teilte Discord mit, wie das Unternehmen seine Datenbank von MongoDB auf Cassandra migrierte, um Nachrichten zu speichern
- Cassandra bietet Skalierbarkeit, Fehlertoleranz und einfache Wartung, doch im Lauf der Zeit nahmen Performance-Probleme und der Wartungsaufwand zu
- 2022 migrierte Discord die Datenbank erneut, diesmal zu ScyllaDB
Probleme mit Cassandra
- Struktur der Nachrichtenspeicherung: Nachrichten werden partitioniert nach
channel_id und bucket gespeichert
- Hot-Partition-Problem: Wenn sich der Traffic auf bestimmte Kanäle konzentriert, steigt die Latenz in der gesamten Datenbank
- Wartungsprobleme: Performance-Einbußen durch SSTable-Kompaktierung und Garbage-Collection-Probleme der JVM
Architekturänderungen
- Einführung von ScyllaDB: Eine Cassandra-kompatible Datenbank, die in C++ geschrieben ist und die Garbage-Collection-Probleme löst
- Datenservice: Zwischen API und Datenbank wurde ein Zwischendienst eingefügt, um den Traffic zu steuern und die Performance zu verbessern
- Einsatz von Rust: Rust wurde verwendet, um sichere und schnelle nebenläufige Software zu schreiben
Datenservice
- Request Coalescing: Wenn mehrere Nutzer dieselben Daten anfordern, wird die Datenbank nur einmal abgefragt und das Ergebnis gemeinsam genutzt
- Routing auf Basis von Consistent Hashing: Anfragen für denselben Kanal werden an dieselbe Service-Instanz geleitet, um die Datenbanklast zu senken
Migration im großen Maßstab
- Aufbau eines ScyllaDB-Clusters: Schnelle und langlebige Speicherarchitektur mit lokalen SSDs und RAID
- Datenmigration: Die Daten wurden mithilfe eines in Rust geschriebenen Data Migrators schnell übertragen
- Automatische Datenvalidierung: Kleine Mengen an Leseanfragen wurden an beide Datenbanken gesendet und die Ergebnisse verglichen, um die Datenintegrität zu prüfen
Einige Monate später
- Verbesserte Performance: Bessere Leistung als Cassandra mit weniger Nodes
- Reduzierte Latenz: Die Performance beim Abrufen und Einfügen von Nachrichten wurde deutlich verbessert
- Neue Produkt-Use-Cases: Durch die Performance-Verbesserungen konnten neue Funktionen umgesetzt werden
# GN⁺-Zusammenfassung
- Discord migrierte seine Datenbank zu ScyllaDB, um die Performance-Probleme von Cassandra zu beheben
- Mit einem in Rust geschriebenen Datenservice und ScyllaDB konnte das Unternehmen den Traffic effizient steuern und die Performance verbessern
- Im Migrationsprozess wurden schnelle und effiziente Methoden eingesetzt, um die Umstellung ohne Downtime abzuschließen
- Der Artikel behandelt die Herausforderungen und Lösungen einer groß angelegten Datenbankmigration und ist daher nützlich für alle, die sich für den Betrieb großer Systeme interessieren
1 Kommentare
Hacker-News-Kommentare
Der Blogbeitrag gibt dem GC die Schuld, aber tatsächlich liegt das Problem in der Art, wie Cassandra verwendet wurde, oder darin, wie Cassandra Massenlöschungen verarbeitet
Mit einem verteilten Chat-Protokoll hätte es dieses Problem nicht gegeben
Zusätzlicher Kommentar des Mitgründers von ScyllaDB
tombstone_gc=repairDie Service-Schicht erinnert an Varnish Cache
Das Löschen alter Nachrichten ist fast unmöglich
Ein sehr gut geschriebener Artikel
Die Zahl der Message-Storage-Nodes bei Discord ist geringer als erwartet
Daten zu speichern und Data Mining darauf zu betreiben, sind zwei unterschiedliche Probleme
Das ScyllaDB-Team hat Leistungsverbesserungen priorisiert und Reverse Queries implementiert
Diskussion zu „How Discord Stores Trillions of Messages“