Účel a kontext: proč integrovat více databází v jednom systému
Moderní systémy často vyžadují kombinaci relačních, dokumentových, časových, grafových či vyhledávacích databází. Důvody jsou výkonnostní (optimalizace pro různé vzory dotazování), funkční (fulltextové vyhledávání, geodata, analytika) i provozní (oddělení domén, právní a regionální požadavky). Integrace více databází v jedné aplikační platformě – polyglot persistence – přináší výhody, ale také náročnost v oblasti konzistence, transakcí, modelování dat, observability, governance a bezpečnosti.
Integrační paradigmata a architektonické vzory
- Transakční integrace: aplikační logika zapisuje napříč úložišti v rámci jedné obchodní operace (typicky bez distribuovaných transakcí, viz Sagy).
- Asynchronní integrace: změny v jedné DB se šíří do dalších prostřednictvím událostí (CDC, outbox) a vytvářejí materializované pohledy.
- Virtuální integrace: dotazovací vrstva (federace SQL/GraphQL) agreguje data za běhu bez fyzické replikace.
- ETL/ELT: pravidelné dávkové přenosy do datového skladu/data lake pro analytické scénáře.
Volba strategií podle případu použití
| Případ použití | Doporučený vzor | Poznámka |
|---|---|---|
| Transakční provoz | Saga, outbox, CQRS | Vyhnout se 2PC, idempotentní zpracování událostí |
| Fulltextové vyhledávání a fasety | Asynchronní indexace (CDC → search) | Materializovaný index (Elasticsearch/OpenSearch) |
| 360° pohled na zákazníka | MDM + virtuální federace | Řešit kvalitu dat a golden record |
| Analytika/BI | ELT do DWH/lakehouse | Denormalizace, time-travel, SCD |
| Grafové vztahy | Dual-write → graf | Kurátorované projekce vztahů |
Modelování dat napříč úložišti
- Oddělení domén: každá doména má své „primární“ úložiště (system of record) a ostatní úložiště jsou konzumenty projekcí.
- Identifikátory: stabilní globální ID (ULID/UUIDv7) pro korelaci; vyhýbejte se složeným ID závislým na konkrétní DB.
- Referenční integrita: mimo jednu DB neexistuje – vynucujte ji na úrovni aplikace (kroky workflow, kompenzace).
- Schémata a kontrakty: spravujte je prostřednictvím schema registry (JSON Schema, Protobuf) a verzujte s ohledem na zpětnou kompatibilitu.
Konzistence: silná, eventual a „realita read-committed“
- Silná konzistence napříč DB je nákladná (latence, dostupnost). Používejte ji jen tam, kde je nezbytná (např. u zůstatků).
- Eventual consistency se používá u většiny projekcí; informujte uživatele o zpoždění a stavu synchronizace.
- Read-your-writes lze lokálně zajistit přesměrováním čtení do primárního zapisovacího úložiště nebo pomocí cache s potvrzením.
Distribuované transakce: 2PC vs. Sagy vs. TCC
- 2PC (two-phase commit): jednoduchý mentální model, ale vysoké náklady, coordinator jako SPOF a omezená podpora napříč DB.
- Saga pattern: obchodní proces jako série lokálních transakcí s kompenzačními kroky; orchestrace (centrální) vs. choreografie (řízená událostmi).
- TCC (Try-Confirm/Cancel): rezervace zdrojů a následné potvrzení; vhodné pro platební a rezervační systémy.
Outbox, CDC a přesuny dat
- Transactional outbox: zapisujte události do tabulky outbox v rámci stejné transakce jako obchodní změnu; zajistěte spolehlivý export (poller/stream).
- Change Data Capture (CDC): čtení binárních logů (např. Debezium) a proud změn do dalších úložišť (indexy, cache, graf, DWH).
- Idempotence: události opatřujte klíčem eventId, na cíli je deduplikujte; exactly-once je spíše procesní než technická vlastnost.
CQRS a materializované pohledy
Oddělení zapisovací (command) a čtecí (query) strany umožňuje optimalizovat data pro konkrétní dotazy. Čtecí modely (např. dokumentové modely, vyhledávací indexy, agregace) se asynchronně aktualizují na základě událostí.
Vrstva přístupu k datům a federace API
- Data Access Layer (DAL): jasně vymezené hranice pro každou doménu, anti-korupční vrstvy pro konkrétní ovladače DB.
- Federace GraphQL: sjednocení více zdrojů pod jedno schéma; pozor na dotazy N+1 a latenci resolverů.
- Federace/virtualizace SQL: dotazy pouze pro čtení; zápisy směrujte do system of record.
Výkon, latence a plánování kapacity
- Připojení: connection pooling a max connections pro každou DB; backpressure a circuit breaker.
- Indexace: účelové indexy pro čtecí projekce; na zapisovací straně minimalizujte sekundární indexy.
- Cache: read-through/write-through/side cache; invalidace řízená událostmi.
- Dávkové zpracování: agregace malých zápisů, komprese, operace bulk v analytických datových tocích.
Řešení konfliktů a souběhu
- Optimistické zámky: při zápisu prostřednictvím více čteček používejte verzovací sloupce (
version,etag). - Strategie slučování: vítězí poslední zápis, doménová pravidla, CRDT pro vybrané typy dat (počítadla, množiny).
- Čas a pořadí: používejte stabilní časové značky (ULID/Hybrid Logical Clock) a vyhýbejte se závislosti na posunech času NTP.
Bezpečnost napříč databázemi
- Autentizace a autorizace: samostatné účty/služby s minimálními oprávněními; row-level security tam, kde je k dispozici.
- Šifrování: TLS při přenosu, TDE/šifrování na úrovni sloupců při uložení, envelope encryption s KMS; rotace klíčů a audit.
- Maskování a anonymizace: definujte klasifikaci PII; vytvářejte materializované pohledy bez citlivých atributů.
- Audit a nepopiratelnost: neměnné logy (WORM), řetězení hashů, oddělené účty pro správu a provoz.
Governance, kvalita dat a MDM
- Data catalog & lineage: dohledatelnost původu dat a jejich transformací; vyhodnocování dopadů změn schémat.
- Master Data Management (MDM): deduplikace entit, pravidla slučování, survivorship a správa golden record.
- Validace kvality: pravidla integrity, profily dat, monitorování anomálií v toku CDC.
Observabilita a provoz
- Tracing: korelační ID napříč vrstvami (OpenTelemetry), měření latence pro každý zdroj a span pro dotazy do DB.
- Metriky: počet událostí za sekundu, zpoždění replikace, velikost outbox/lag, chybovost zpracování událostí, vytížení poolů.
- Logy: strukturované, bez citlivých údajů; při vysoké propustnosti používejte sampling.
Testování a ověřování
- Contract testing: ověřování schémat a kompatibility mezi producenty a konzumenty dat.
- Replay testy: přehrávání proudů (CDC) v izolovaném prostředí; odhalení problémů s idempotencí a pořadím.
- Chaos a failover: simulace výpadků jedné DB, split-brain, testování obnovy a konzistence.
Migrace, verze a změny schémat
- Blue/green & dual-run: dočasně zapisujte do staré i nové DB a porovnávejte výsledky čtení (shadow reads).
- Expand/contract: nejprve přidejte nové sloupce/typy, teprve poté změňte producenty a postupně odstraňte staré.
- Backfill: dávkově doplňujte historická data kontrolovaným tempem a ověřujte jejich integritu.
Anti-patterny a jak se jim vyhnout
- Dual-write bez koordinace: vznikají závody a nekonzistence; používejte outbox/CDC.
- Přehnaná federace: složité dotazy napříč více zdroji v hot-path; upřednostňujte projekce.
- Skryté kopie dat: stínové integrace bez governance; zaveďte katalog a určete vlastníky dat.
Příklad referenční architektury
- Primární transakční DB (PostgreSQL) jako system of record domény objednávek.
- CDC (Debezium) → Kafka → konzumenti: search-indexer (OpenSearch), reporting-writer (lakehouse), graph-projector (Neo4j).
- Outbox v rámci transakcí objednávek pro spolehlivé publikování doménových událostí.
- Vrstva BFF/API s CQRS: zápisy směřují do Postgresu, čtení z projekcí (cache, search, předpočítané hodnoty).
- Tracing pomocí OpenTelemetry, SLO: p95 latence čtení < 120 ms, zpoždění projekcí < 5 s.
Kontrolní seznam pro implementaci
- Určete system of record pro každou entitu a deklarujte SLA konzistence projekcí.
- Zaveďte globální ID a idempotentní zpracování událostí.
- Implementujte outbox/CDC a monitorujte lag.
- Oddělte zapisovací/čtecí cesty (CQRS) a navrhněte materializované pohledy.
- Zaveďte observabilitu (tracing, metriky, logy) a upozorňování na anomálie.
- Definujte governance (katalog, vlastníky dat, pravidla kvality, bezpečnostní klasifikaci).
- Plánujte migrace (expand/contract), testujte obnovu a návrat k předchozí verzi.
Závěr
Integrace více databází v jednom systému je účinným nástrojem pro škálování, funkční bohatost a odolnost. Úspěch nezávisí na jednom produktu, ale na disciplinovaném návrhu: jasném určení system of record, řízení konzistence prostřednictvím událostí, robustních projekcích pro čtení, observabilitě a důsledném zabezpečení. V kombinaci s kvalitní správou schémat, kvality dat a provozních SLO lze dosáhnout architektury, která efektivně obsluhuje různorodé požadavky bez zbytečné složitosti pro vývojáře i provoz.
