Aufbau eines hochverfügbaren Web-Service ohne Datenbank
Erkundung
- Bei neuen Startups werden üblicherweise Web-Frameworks wie Rails, Django oder Node sowie Datenbanken wie MySQL, PostgreSQL oder MongoDB gewählt
- Aber was wäre, wenn sich Web-Service und Datenbankinstanz zu einer Einheit zusammenführen ließen? Der Ansatz besteht darin, alle Daten im RAM zu speichern
- Wenn RAM als Datenbank verwendet wird, müssen Daten nicht mehr über SQL-Abfragen serialisiert werden
- Indizes lassen sich mithilfe von In-Memory-Hash-Tabellen implementieren
- Hintergrundaufgaben können als Threads innerhalb eines großen Prozesses verarbeitet werden
- Falls der Prozess abstürzt, ist eine Wiederherstellung möglich, indem regelmäßig Snapshots des RAM erstellt und Änderungen auf die Festplatte geschrieben werden
Skalierung
- Wenn Kunden Hochverfügbarkeit verlangen, werden Server mithilfe des Raft-Konsensalgorithmus repliziert
- Fällt der Leader-Server aus, wird ein neuer Leader gewählt, der die Anfragen verarbeitet
- Auf diese Weise sind Rolling Deployments möglich, ohne die Server neu zu starten
Auslagerung
- Wenn es viele große Kunden gibt, kann der Web-Service per Sharding aufgeteilt und verarbeitet werden
- Jedem Enterprise-Kunden wird ein dedizierter Cluster bereitgestellt
- Der wichtigste Engpass kann die Performance des Commit-Threads sein
Unser Stack
- Einsatz von Common Lisp: bietet starke Unterstützung für Multithreading und eignet sich gut für Hot Reloading von Code
- Einsatz von bknr.datastore und bknr.cluster: Für die Raft-Implementierung wird Baidus Braft-Bibliothek verwendet
- Einsatz von EFS zur Speicherung von Bilddateien: Fehlerbehandlung und Tests sind einfacher als mit S3
Zusammenfassung
- Diese Architektur eignet sich gut für neue Startups, und mit Common Lisp stehen bereits viele Werkzeuge bereit
- Dank an die Mitwirkenden von bknr.datastore, Braft und Raft
GN⁺-Zusammenfassung
- Dieser Artikel stellt eine neue Architektur zum Aufbau eines hochverfügbaren Web-Service ohne Datenbank vor
- RAM wird als Datenbank verwendet, und Hochverfügbarkeit wird über den Raft-Konsensalgorithmus sichergestellt
- Common Lisp unterstützt Multithreading und Hot Reloading von Code
- Diese Architektur eignet sich für neue Startups und ermöglicht schnelle Entwicklung und Debugging
- Projekte mit ähnlichen Funktionen sind unter anderem Redis und Memcached
1 Kommentare
Hacker-News-Kommentare
Es ist seltsam, ohne SQLite ein eigenes Transaktionslog zu bauen
ramdiskzu verwenden und mit Standardwerkzeugen in einen persistenten Speicher zu replizierenEine eigene In-Memory-Datenbank zu bauen, statt MySQL, Postgres, Redis, MongoDB usw. zu verwenden, ist komplex
Die grundlegenden Aspekte von MySQL oder Postgres nicht lernen zu wollen, ist Zeitverschwendung
Das ähnelt der Architektur von HashiCorp Nomad, Consul und Vault
Es gibt den Irrglauben, dass RAM sehr billig ist
Ich habe schon ein Projekt gesehen, das Dateisystemverzeichnisse als Tabellen und JSON-Dateien als Zeilen verwendet hat
Die Verwendung einer relationalen Datenbank ist stabiler
Es wurde eine eigene Raft-Konsensschicht implementiert, um Komplexität zu vermeiden
Moderne Desktop- und Mobile-Apps verwenden oft Datenbanken wie SQLite
Eine eigene In-Memory-Datenbank zu bauen ist nicht einfacher, als Postgres oder SQLite zu installieren