Datenbankserver und Embedded Database
Datenbankserver
Ein Datenbankserver ist eine Datenbank, die als unabhängiger Serverprozess läuft und Anfragen von Anwendungen über ein Netzwerk verarbeitet. Die meisten uns bekannten RDBMS wie MySQL, PostgreSQL und Oracle DB fallen unter dieses Modell. Ein Datenbankserver bietet die folgenden Vorteile:
- Zentralisierte Verwaltung: Daten werden an einem Ort integriert verwaltet, was Konsistenz, Sicherheit, Sicherung und Wiederherstellung erleichtert.
- Ressourcenunabhängigkeit: Durch die Zuweisung eigener CPU, Speichers und Speichermedien wird eine stabile Leistung unabhängig vom Status der Anwendung gewährleistet.
- Hohe Parallelität und Skalierbarkeit: Er ist für den gleichzeitigen Zugriff vieler Benutzer optimiert, und die horizontale Skalierung durch Clustering oder Replikation ist relativ einfach.
Dank dieser Eigenschaften hat sich der Datenbankserver in den letzten Jahrzehnten als Standard der Softwareinfrastruktur etabliert. Durch technologische Fortschritte und veränderte Umgebungsbedingungen haben sich jedoch in einigen Umgebungen die Nachteile des Datenbankservers gezeigt, und als Alternative dazu gewinnen eingebettete Datenbanken wieder an Bedeutung.
Neuer Trend: Eingebettete Datenbanken
Eine eingebettete Datenbank ist ein Datenbank-Engine, das als Bibliothek in eine Anwendung integriert ist und im selben Prozess ausgeführt wird, ohne einen separaten Serverprozess zu benötigen. Beispiele für eingebettete Datenbanken sind SQLite, LevelDB und RocksDB. Der Hintergrund für den Aufstieg dieser eingebetteten Datenbanken als starke Alternative in modernen Technologieumgebungen ist wie folgt:
Aufkommen von SSDs
In der Vergangenheit, in HDD-zentrierten Systemumgebungen, war die Leistung des wahlfreien Zugriffs im Vergleich zur sequentiellen Datenlese-/Schreibleistung deutlich schlechter. Daher war die Minimierung von Disk I/O und die Maximierung des Memory Caching der Schlüssel zur Leistungsoptimierung. Datenbankserver haben sich darauf eingestellt, große Caches zu betreiben und Schreiboperationen zu bündeln, um die physikalischen Grenzen von HDDs zu überwinden.
Das Aufkommen von SSDs hat diese Prämisse jedoch vollständig verändert. SSDs sind tausende Male schneller im Random I/O als HDDs, und ihre Latenzzeiten sind revolutionär kürzer. Infolgedessen ist die frühere Annahme, dass "Disk I/O der größte Engpass ist", verschwunden, und stattdessen wird die Latenz, die durch den Fernzugriff auf DB-Server über das Netzwerk entsteht, zu einem neuen Engpass.
MSA und Datenunabhängigkeit
Früher war es üblich, dass eine riesige monolithische Anwendung von einer zentralisierten Datenbank abhing. Dieser Ansatz war einfach, aber mit zunehmender Servicegröße wurde die Änderung des Datenschemas schwierig, und es entstand das Problem einer übermäßigen Kopplung, da alle Services dieselbe DB teilten.
In der modernen Microservices Architecture wird zur Lösung dieser Probleme das Prinzip "Database per Service" betont. Jeder Service besitzt und kapselt seinen eigenen dedizierten Datenspeicher, wodurch die Unabhängigkeit zwischen den Services gewährleistet und die Fehlerisolation und Skalierung erleichtert werden. In diesem Prozess werden eingebettete Datenbanken zu einer idealen Wahl als Datenspeicher auf Serviceebene. Sie sind leicht und schnell und können zusammen mit dem Servicecode bereitgestellt werden, was sehr gut zur MSA-Umgebung passt.
Im Kubernetes-Umfeld wird beispielsweise häufig das Sidecar-Pattern verwendet, um eingebettete Datenbanken neben dem Anwendungskontainer zu platzieren und die lokale Datenverarbeitung zu optimieren. Dies reduziert Netzwerkengpässe und minimiert Datenzugriffslatenzen.
Vereinfachung der Betriebsumgebung
Für Datenbankserver sind komplexe Betriebsabläufe wie Installation, Patching, Sicherung, Fehlerwiederherstellung, Replikation und Leistungsüberwachung unerlässlich, und dafür sind engagierte DBAs und spezialisiertes Betriebspersonal erforderlich. Insbesondere in großen Umgebungen ist dieser Verwaltungsaufwand sehr hoch.
Eingebettete Datenbanken mildern diese Probleme erheblich. Wenn die Datenbank in die Anwendung integriert ist, erfolgen Unit-Tests, Builds, Versionsverwaltung und Bereitstellung gemeinsam, sodass kein separater Serverbetrieb erforderlich ist. Darüber hinaus wird die eingebettete Datenbank zusammen mit der Anwendung skaliert, wenn die Anwendung skaliert wird, und eine automatisierte Verwaltung durch die DevOps-Kultur und CI/CD-Pipelines wird möglich. Insbesondere in Startups, kleinen Services und Prototypen-Entwicklungsumgebungen reduzieren eingebettete Datenbanken die betriebliche Komplexität drastisch und beschleunigen die Entwicklungs- und Bereitstellungsgeschwindigkeit erheblich.
Entwicklung leistungsstarker Systemprachen und Ökosysteme
In der Vergangenheit war es üblich, dass Datenbanken und Anwendungen in verschiedenen Sprachen geschrieben wurden. Beispielsweise wurden hochleistungsfähige Datenbank-Engines hauptsächlich in C, C++ geschrieben, während Anwendungen in Sprachen wie Java, Python, PHP entwickelt wurden. Dieser Ansatz war effektiv für die Leistungsoptimierung, hatte aber Einschränkungen wie Probleme mit der Speichersicherheit, komplexe Parallelitätsverarbeitung, Latenzzeiten und Schwierigkeiten bei der Bibliotheksintegration und -bereitstellung.
Mit dem Aufkommen moderner Systemprogrammiersprachen wie Go und Rust wurden diese Einschränkungen jedoch erheblich gemildert. Insbesondere Go eignet sich nicht nur für Hochleistungsanwendungen, sondern auch für das Schreiben von Low-Level-Programmen wie Datenbank-Engines, wodurch Datenbanken und Anwendungen innerhalb eines Sprachökosystems gemeinsam behandelt werden können.
Tatsächlich werden in Golang hochleistungsfähige eingebettete Datenbanken wie BadgerDB und PebbleDB aktiv verwendet. Dies bedeutet, dass eingebettete Datenbanken nicht nur eine leichte Alternative zu Datenbankservern sind, sondern sich als wichtige Option mit eigener Wettbewerbsfähigkeit etabliert haben.
Fazit
Unter Bedingungen, die eine zentrale Verwaltung großer Datenmengen, komplexe Transaktionen und hohe Parallelität erfordern, ist der Datenbankserver nach wie vor die leistungsstärkste Lösung. In MSA-Umgebungen für einzelne Services, IoT-Edge-Geräte, schnelles Prototyping und Projekte, bei denen die Betriebseffizienz wichtig ist, können eingebettete Datenbanken jedoch eine effizientere und sinnvollere Wahl sein. Letztendlich ist es wichtig, das optimale Werkzeug zu wählen, das am besten zu den gegebenen Umständen und Anforderungen passt, und die Entwicklung eingebetteter Datenbanken bietet uns eine breitere und vielfältigere Auswahl.