GoSuda

Databázové servery a embedded databázy: porovnanie architektúry a charakteristík I/O

By gosunuts views ...

Databázový server

Databázový server je databáza, ktorá beží ako samostatný serverový proces a spracúva požiadavky aplikácií prostredníctvom siete. Väčšina RDBMS, ktoré nám sú známe, ako MySQL, PostgreSQL alebo Oracle DB, patrí k tomuto modelu. Databázový server má nasledujúce výhody.

  • Centralizovaná správa: Dáta sú spravované na jednom mieste, čo uľahčuje zachovanie konzistencie, zabezpečenie, zálohovanie a obnovu.
  • Nezávislosť zdrojov: Databázový server má pridelené vlastné CPU, pamäť a úložisko, vďaka čomu zabezpečuje stabilný výkon bez ohľadu na stav aplikácie.
  • Vysoká súbežnosť a škálovateľnosť: Je optimalizovaný pre súbežný prístup mnohých používateľov a horizontálne škálovanie prostredníctvom klastrovania alebo replikácie je pomerne jednoduché.

Vďaka týmto vlastnostiam sa databázový server za posledné desaťročia etabloval ako štandard softvérovej infraštruktúry. Vplyvom technologického vývoja a zmien prostredia sa však v niektorých prostrediach začali prejavovať nevýhody databázového servera, a preto sa ako ich alternatíva opäť dostáva do popredia vnorená databáza.

Nový trend: vnorená databáza

Vnorená databáza je databázový engine, ktorý nevyžaduje samostatný serverový proces, je zahrnutý v aplikácii ako knižnica a beží v rámci rovnakého procesu. Typickými príkladmi vnorených databáz sú SQLite, LevelDB a RocksDB. Dôvody, prečo sa vnorené databázy v súčasnom technologickom prostredí stali silnou alternatívou, sú nasledovné.

  • Nástup SSD

    V systémovom prostredí zameranom na HDD bol výkon náhodného prístupu výrazne nižší v porovnaní s výkonom sekvenčného čítania a zápisu dát. Preto bolo kľúčom k optimalizácii výkonu minimalizovať diskové I/O operácie a maximalizovať využitie pamäťovej cache. Databázové servery sa tomu prispôsobili prevádzkou rozsiahlej cache a spracovaním zápisových operácií dávkovo, čím prekonávali fyzické obmedzenia HDD.

    Nástup SSD však tento predpoklad úplne zmenil. SSD má výkon náhodného I/O až tisíckrát vyšší ako HDD a jeho latencia je výrazne nižšia. V dôsledku toho zanikol zaužívaný názor, že „diskové I/O je najväčšou prekážkou“, a naopak, latencia spôsobená vzdialeným prístupom k databázovému serveru cez sieť sa začala javiť ako nová úzka hrdlo.

  • MSA a nezávislosť dát

    V minulosti bola typickou štruktúrou jedna veľká monolitická aplikácia závislá od jedinej centralizovanej databázy. Tento prístup bol jednoduchý, no s rastúcim rozsahom služieb sa ťažšie menila dátová schéma a všetky služby zdieľajúce rovnakú databázu boli príliš previazané.

    V moderných architektúrach mikroservisov sa na riešenie týchto problémov kladie dôraz na princíp „Database per Service“. Každá služba vlastní a zapuzdruje svoje vyhradené dátové úložisko, čím sa zabezpečuje nezávislosť medzi službami a uľahčuje sa izolácia porúch a škálovanie. V tomto kontexte sa vnorená databáza stáva ideálnou voľbou pre dátové úložisko na úrovni služby. Je ľahká a rýchla a môže byť nasadená spolu s kódom služby, vďaka čomu sa výborne hodí do prostredia MSA.

    Typicky sa v prostredí Kubernetes používa vzor sidecar, pri ktorom sa vnorená databáza umiestni vedľa kontajnera aplikácie s cieľom optimalizovať lokálne spracovanie dát. Tento prístup znižuje sieťové úzke hrdlá a minimalizuje latenciu prístupu k dátam.

  • Zjednodušenie prevádzkového prostredia

    Databázový server vyžaduje zložité prevádzkové postupy, ako sú inštalácia, aktualizácie, zálohovanie, obnova po haváriách, replikácia a monitorovanie výkonu, a na ich zabezpečenie sú nevyhnutní vyhradení DBA a odborný prevádzkový personál. Najmä vo veľkých prostrediach je táto správcovská záťaž veľmi vysoká.

    Vnorená databáza tieto problémy výrazne zmierňuje. Keď je databáza integrovaná v rámci aplikácie, unit testy, zostavovanie, správa verzií a nasadenie prebiehajú spoločne, a preto nie je potrebná samostatná prevádzka servera. Okrem toho sa pri horizontálnom škálovaní aplikácie škáluje aj vnorená databáza a umožňuje sa automatizovaná správa prostredníctvom kultúry DevOps a CI/CD pipeline. Najmä v startupoch, malých službách a vývojových prostrediach pre prototypy vnorená databáza výrazne znižuje prevádzkovú zložitosť a výrazne zvyšuje rýchlosť vývoja a nasadenia.

  • Vysokovýkonné systémové jazyky a rozvoj ekosystému

    V minulosti sa databáza a aplikácia bežne písali v rôznych jazykoch. Napríklad databázové engine vyžadujúce vysoký výkon sa väčšinou písali v jazykoch C a C++, zatiaľ čo aplikácie sa vyvíjali v jazykoch ako Java, Python alebo PHP. Tento spôsob bol účinný pri optimalizácii výkonu, no mal obmedzenia v podobe problémov s bezpečnosťou pamäte, zložitým spracovaním súbežnosti, latenciou a ťažkosťami s integráciou knižníc a nasadením.

    Nedávny nástup moderných systémových programovacích jazykov, ako sú Go a Rust, however, tieto obmedzenia výrazne zmiernil. Go je najmä vhodný nielen na vysokovýkonné aplikácie, ale aj na písanie nízkoúrovňových programov, ako sú databázové engine, čo umožňuje pracovať s databázou a aplikáciou v rámci jedného jazykového ekosystému.

    V jazyku Golang sa skutočne aktívne používajú vysokovýkonné vnorené databázy, ako sú BadgerDB a PebbleDB. To znamená, že vnorené databázy už nie sú len ľahkou alternatívou k databázovým serverom, ale stali sa významnou voľbou s vlastnou konkurenčnou silou.

Záver

Pri požiadavkách na centralizovanú správu rozsiahlych dát, komplexné transakcie a vysokú súbežnosť zostáva databázový server najsilnejším riešením. Avšak v jednotlivých službách architektúry MSA, na IoT edge zariadeniach, pri rýchlom prototypovaní a v projektoch, kde je dôležitá prevádzková efektívnosť, sa vnorená databáza môže stať efektívnejšou a rozumnejšou voľbou. Podstatné je v konečnom dôsledku zvoliť optimálny nástroj, ktorý najlepšie zodpovedá danej situácii a požiadavkám, a vývoj vnorených databáz nám ponúka širší a rozmanitejší výber možností.