Databaseservers en embedded databases: vergelijking van architectuur en I/O-kenmerken

Databaseserver
Een databaseserver is een database die als zelfstandig serverproces draait en verzoeken van applicaties via het netwerk verwerkt. Vrijwel alle RDBMS's die we goed kennen, zoals MySQL, PostgreSQL en Oracle DB, behoren tot dit model. Een databaseserver heeft de volgende voordelen.
- Gecentraliseerd beheer: Gegevens worden op één plek geïntegreerd beheerd, wat consistentie, beveiliging, back-up en herstel eenvoudiger maakt.
- Onafhankelijkheid van resources: Door een eigen CPU, geheugen en opslag toegewezen te krijgen, garandeert de server stabiele prestaties ongeacht de status van de applicatie.
- Hoge concurrency en schaalbaarheid: De server is geoptimaliseerd voor gelijktijdige toegang door veel gebruikers, en horizontale schaling via clustering of replicatie is relatief eenvoudig.
Dankzij deze kenmerken heeft de databaseserver de afgelopen decennia een standaard binnen de softwarematige infrastructuur gevormd. Door technologische ontwikkelingen en veranderingen in de omgeving zijn in sommige omgevingen echter de nadelen van databaseservers naar voren gekomen, en als alternatief krijgt de embedded database opnieuw aandacht.
Een nieuwe trend: embedded databases
Een embedded database is een databasemotor die zonder afzonderlijk serverproces wordt opgenomen in de applicatie als bibliotheek en binnen hetzelfde proces wordt uitgevoerd. SQLite, LevelDB en RocksDB zijn representatieve embedded databases. De achtergrond waarom deze embedded databases in de moderne technologische omgeving als sterk alternatief naar voren zijn gekomen, is als volgt.
Opkomst van SSD
In het systeemlandschap met HDD's als hoofdopslag was de willekeurige toegangsprestatie aanzienlijk lager dan de prestatie bij sequentieel lezen en schrijven van gegevens. Daarom was het minimaliseren van schijf-I/O en het maximaliseren van geheugencaching de kern van prestatieoptimalisatie. Databaseservers hebben zich hierop aangepast door grote caches te beheren en schrijfbewerkingen te bundelen, waarmee ze de fysieke beperkingen van de HDD hebben overwonnen.
De opkomst van SSD's heeft deze uitgangspunten echter volledig veranderd. SSD's zijn duizenden keren sneller in willekeurige I/O dan HDD's, en de latentie is aanzienlijk korter. Hierdoor verdween de bestaande opvatting dat "schijf-I/O de grootste bottleneck is", en begon de vertraging bij toegang tot een externe databaseserver via het netwerk juist op te vallen als nieuw knelpunt.
MSA en gegevensonafhankelijkheid
Vroeger was het gebruikelijk dat één grote monolithische applicatie afhankelijk was van één centrale database. Deze aanpak is eenvoudig, maar naarmate de schaal van de dienst toeneemt, wordt het wijzigen van het gegevensschema moeilijk, en doordat alle diensten dezelfde database delen, wordt de koppeling te sterk.
In moderne microservicearchitecturen wordt daarom het principe "Database per Service" als belangrijk beschouwd. Doordat elke service zijn eigen toegewijde gegevensopslag bezit en inkapselt, wordt de onafhankelijkheid tussen services gewaarborgd, en worden foutisolatie en schaling eenvoudiger. In dit proces wordt de embedded DB een ideale keuze als gegevensopslag op serviceniveau. Omdat hij licht en snel is en samen met de servicecode kan worden uitgerold, past hij uitstekend bij MSA-omgevingen.
Typisch wordt in Kubernetes-omgevingen vaak het sidecarpatroon gebruikt, waarbij een embedded DB naast de applicatiecontainer wordt geplaatst om lokale gegevensverwerking te optimaliseren. Dit vermindert netwerkknelpunten en minimaliseert de vertraging bij gegevenstoegang.
Vereenvoudiging van de bedrijfsvoering
Databaseservers vereisen complexe operationele processen zoals installatie, patchen, back-up, herstel na storingen, replicatie en prestatiemonitoring, en daarvoor zijn toegewijde DBA's en professioneel operationeel personeel nodig. Vooral in grootschalige omgevingen is deze beheerlast zeer groot.
Een embedded DB verlicht deze problemen aanzienlijk. Wanneer de database in de applicatie is geïntegreerd, verlopen unit-testen, build, versiebeheer en deployment samen, waardoor geen afzonderlijk serverbeheer nodig is. Bovendien wordt de embedded DB mee geschaald wanneer de applicatie scale-out ondergaat, en is geautomatiseerd beheer via DevOps-cultuur en CI/CD-pijplijnen mogelijk. Met name bij startups, kleinschalige diensten en prototypeontwikkelomgevingen verlaagt een embedded database de operationele complexiteit aanzienlijk en versnelt zij de ontwikkeling en uitrol aanzienlijk.
Systeemtalen met hoge prestaties en ontwikkeling van het ecosysteem
Vroeger was het gebruikelijk dat database en applicatie in verschillende talen werden geschreven. Zo werden databasemotoren die hoge prestaties vereisen voornamelijk in C of C++ geschreven, terwijl applicaties werden ontwikkeld in talen zoals Java, Python en PHP. Deze aanpak was effectief voor prestatieoptimalisatie, maar kende beperkingen zoals problemen met geheugenveiligheid, complexe concurrency-verwerking, latentie, en moeilijkheden bij integratie van bibliotheken en deployment.
Met de opkomst van moderne systeemprogrammeertalen zoals Go en Rust zijn deze beperkingen echter aanzienlijk verminderd. Vooral Go is geschikt voor hoogwaardige applicaties en ook voor het schrijven van laag-niveau programma's zoals databasemotoren, waardoor database en applicatie binnen één taalecosysteem samen kunnen worden beheerd.
In de praktijk worden in Golang hoogwaardige embedded databases zoals BadgerDB en PebbleDB actief gebruikt. Dit betekent dat embedded databases zich niet louter als lichtgewicht alternatief voor databaseservers hebben ontwikkeld, maar zich als belangrijke keuze met eigen concurrentiekracht hebben gevestigd.
Conclusie
Voor voorwaarden die centraal beheer van grootschalige gegevens, complexe transacties en hoge concurrency vereisen, blijft de databaseserver de krachtigste oplossing. In MSA-omgevingen met afzonderlijke services, IoT-edge-apparaten, snelle prototyping en projecten waarin operationele efficiëntie belangrijk is, kan een embedded database echter de efficiëntere en redelijkere keuze zijn. Uiteindelijk is het belangrijkste het kiezen van het optimale hulpmiddel dat het best aansluit op de gegeven situatie en eisen, en de ontwikkeling van embedded databases biedt ons een bredere en diversere keuzemogelijkheid.