Databázové servery a vestavěné databáze: srovnání architektury a charakteristik I/O

Databázový server
Databázový server je databáze, která běží jako samostatný serverový proces a zpracovává požadavky aplikací prostřednictvím sítě. Většina RDBMS, které jsou nám dobře známé, jako MySQL, PostgreSQL nebo Oracle DB, odpovídá tomuto modelu. Databázový server má následující výhody.
- Centralizovaná správa: Data jsou spravována na jednom místě, což usnadňuje zajištění konzistence, bezpečnosti, zálohování a obnovu.
- Nezávislost zdrojů: Server získává vlastní CPU, paměť a úložiště, a proto zajišťuje stabilní výkon bez ohledu na stav aplikace.
- Vysoká souběžnost a škálovatelnost: Je optimalizován pro současný přístup mnoha uživatelů a horizontální škálování pomocí clusteringu nebo replikace je relativně snadné.
Díky těmto vlastnostem se databázový server za posledních několik desetiletí etabloval jako standard softwarové infrastruktury. Vlivem technologického vývoje a změn prostředí se však u některých prostředí začaly projevovat nevýhody databázových serverů a jako jejich alternativa znovu získávají pozornost vestavěné databáze (embedded databases).
Nový trend: Vestavěná databáze
Vestavěná databáze je databázový engine, který nevyžaduje samostatný serverový proces, je zahrnut do aplikace ve formě knihovny a běží ve stejném procesu jako aplikace. Mezi reprezentativní vestavěné databáze patří SQLite, LevelDB a RocksDB. Důvody, proč se tyto vestavěné databáze v moderním technologickém prostředí staly silnou alternativou, jsou následující.
Nástup SSD
V dřívějších systémech založených na HDD výrazně klesal výkon náhodného přístupu ve srovnání s výkonem sekvenčního čtení a zápisu. Hlavním principem optimalizace výkonu proto bylo minimalizovat diskové I/O operace a maximalizovat využití paměťové cache. Databázové servery se tomu přizpůsobily provozováním velkých cache a shromažďováním zápisových operací, čímž překonávaly fyzická omezení HDD.
Nástup SSD však tento předpoklad zcela změnil. SSD dosahuje při náhodném I/O výkonu několikanásobně až tisícinásobně vyššího výkonu než HDD a jeho latence je výrazně nižší. V důsledku toho zanikl dřívější názor, že „diskové I/O je největším úzkým hrdlem“, a naopak se začala jako nové úzké hrdlo projevovat latence vznikající při přístupu k vzdálenému databázovému serveru prostřednictvím sítě.
MSA a nezávislost dat
V minulosti bylo běžné, že jedna rozsáhlá monolitická aplikace závisela na jediné centralizované databázi. Tento přístup byl sice jednoduchý, ale s rostoucím rozsahem služeb ztěžoval změny datového schématu a v důsledku toho, že všechny služby sdílely stejnou databázi, byla vazba mezi nimi nadměrně silná.
V moderních architekturách mikroslužeb se k řešení těchto problémů klade důraz na princip „Database per Service“. Každá služba vlastní a zapouzdřuje svůj vyhrazený datový úložiště, čímž je zajištěna nezávislost mezi službami a usnadněna izolace poruch a škálování. V tomto kontextu se vestavěná databáze stává ideální volbou jako datové úložiště na úrovni služby. Je lehká a rychlá a lze ji nasadit společně s kódem služby, což se velmi dobře hodí do prostředí MSA.
Typicky se v prostředí Kubernetes široce využívá vzor sidecar, při němž je vestavěná databáze umístěna vedle aplikačního kontejneru a optimalizuje lokální zpracování dat. Tento přístup snižuje síťové úzké hrdlo a minimalizuje latenci přístupu k datům.
Zjednodušení provozního prostředí
Databázový server vyžaduje složité provozní postupy, jako jsou instalace, aktualizace, zálohování, obnova po haváriích, replikace a monitorování výkonu, a k jejich zvládnutí je nutný specializovaný DBA a odborný provozní personál. Zejména ve velkých prostředích je tato správcovská zátěž velmi značná.
Vestavěná databáze tyto problémy výrazně zmírňuje. Pokud je databáze integrována přímo do aplikace, jsou jednotkové testy, sestavení, správa verzí a nasazení prováděny společně, takže není nutný samostatný provoz serveru. Kromě toho se vestavěná databáze při škálování aplikace rozšiřuje spolu s ní a umožňuje automatizovanou správu prostřednictvím kultury DevOps a pipeline CI/CD. Zejména ve startupech, menších službách a prostředích pro vývoj prototypů vestavěná databáze výrazně snižuje provozní složitost a výrazně zrychluje vývoj i nasazení.
Vysoce výkonné systémové jazyky a rozvoj ekosystému
V minulosti bylo běžné, že databáze a aplikace byly psány v různých jazycích. Například vysoce výkonné databázové enginy byly převážně psány v jazycích C a C++, zatímco aplikace se vyvíjely v jazycích jako Java, Python nebo PHP. Tento přístup byl efektivní z hlediska optimalizace výkonu, ale měl omezení v podobě problémů s bezpečností paměti, složitého zpracování souběžnosti, latence a obtíží při integraci knihoven a nasazení.
S nástupem moderních systémových programovacích jazyků, jako jsou Go a Rust, se však tato omezení výrazně zmírnila. Zejména Go je vhodný nejen pro vysoce výkonné aplikace, ale také pro psaní nízkoúrovňových programů, jako jsou databázové enginy, a umožňuje pracovat s databází i aplikací v rámci jednoho jazykového ekosystému.
V jazyce Golang se skutečně aktivně používají vysoce výkonné vestavěné databáze, jako jsou BadgerDB a PebbleDB. To znamená, že vestavěná databáze už nepředstavuje pouze lehkou alternativu k databázovému serveru, ale etabluje se jako důležitá volba se samostatnou konkurenceschopností.
Závěr
Pro centralizovanou správu velkých objemů dat, složité transakce a požadavky na vysokou souběžnost zůstává databázový server nejsilnějším řešením. Avšak pro jednotlivé služby v prostředí MSA, IoT edge zařízení, rychlé prototypování a projekty, kde je důležitá provozní efektivita, se může jako účinnější a rozumnější volba ukázat vestavěná databáze. Podstatné je v konečném důsledku vybrat nejvhodnější nástroj pro dané situace a požadavky, přičemž vývoj vestavěných databází nám nabízí širší a rozmanitější možnosti volby.