Proč NoSQL škáluje jinak
NoSQL databáze byly navrženy pro horizontální škálování, vysokou dostupnost a zpracování velkých objemů dat na běžném hardwaru. Na rozdíl od klasických relačních systémů s vertikálním škálováním a silnou konzistencí se NoSQL opírá o sharding (dělení dat napříč uzly) a replikaci (kopírování dat pro zajištění odolnosti a výkonu). Volby v návrhu se často řídí principy CAP a PACELC – tedy kompromisy mezi dostupností, konzistencí, latencí a tolerancí k rozdělení sítě.
Modely konzistence a teoretické rámce
- CAP: při rozdělení sítě (P) je nutné volit mezi Consistency (C) a Availability (A). NoSQL systémy často preferují AP (např. ve stylu Dynamo) nebo CP (např. MongoDB/majority, Etcd).
- PACELC: mimo rozdělení sítě (Else) se volí mezi Latency (L) a Consistency (C). Prakticky jde o volbu mezi kvórem a čtením s nízkou latencí z lokálních replik.
- Úrovně konzistence: strong, bounded-staleness, monotonic, read-your-writes, eventual. V praxi je lze nastavit pro každou operaci zvlášť (např. nastavitelné úrovně konzistence v Cassandře, readConcern/writeConcern v MongoDB).
Horizontální škálování: sharding a rozdělení klíčů
Sharding rozděluje datovou sadu na partitions/shards umístěné na různých uzlech. Klíčové je minimalizovat horká místa a rovnoměrně rozložit zátěž.
- Sharding založený na hashi: konzistentní hashování (Dynamo, Cassandra) nebo hashovaný shard key (MongoDB). Vyrovnává distribuci, ale snižuje efekt lokality při rozsahových dotazech.
- Sharding založený na rozsazích: výborně se hodí pro rozsahové dotazy; vyžaduje dělení a slučování shardů a hlídání horkých rozsahů (časové klíče, monotónní ID).
- Sharding podle adresáře/vyhledávání: centrální směrování (katalog routeru) je flexibilní, ale přidává další pohyb datových částí a vytváří bod selhání či škálování řídicí vrstvy.
- Kompozitní a kombinovaný hashový a rozsahový sharding: kombinují výhody obou přístupů (např. prefix tenant + hash orderId) pro scénáře s více tenanty.
Replikace: topologie a protokoly
- Na bázi leaderu (primary–replica): zápisy probíhají na leaderu a replikují se na followers (MongoDB, Couchbase, Redis v režimu replikace). Konflikty se řeší jednodušeji, konzistence je silnější při potvrzování většinou replik.
- Bez leaderu (kvórum, styl Dynamo): klient zapisuje a čte pomocí kvór; konflikty se řeší metodou last write wins, vektory verzí nebo pomocí CRDT. Dostupnost je vysoká, ale konsolidace je složitější.
- Multi-leader: více uzlů, na které lze zapisovat (geograficky distribuované active-active); je nutné řešit konfliktní zápisy a datové typy conflict-free.
Kvórum a „nastavitelná konzistence“
U systémů s kvórem a replikačním faktorem N platí pro silnou konzistenci při čtení následující pravidlo: zvolte W (počet potvrzení zápisu) a R (počet potvrzení čtení) tak, aby R + W > N. Běžné volby jsou W=majority, R=majority pro chování typu CP nebo W=1, R=1 pro nízkou latenci (eventual consistency).
Mechanismy odolnosti: anti-entropy a opravy
- Hinted handoff: dočasné uložení zápisů určených nedostupnému uzlu a jejich pozdější doručení.
- Oprava při čtení: při čtení klient zjistí rozdíly a zapíše opravy na pomalejší repliky.
- Merkleovy stromy/vrstvené hashování: efektivní porovnávání shardů mezi replikami.
- Vektorové hodiny a verze: rozlišování souběžných verzí (kauzální řazení).
- CRDT: datové typy s matematicky definovanou konvergencí (čítače, množiny, mapy) – odstraňují potřebu ručního slučování.
Datové struktury a cesty zápisu
- LSM-tree (Cassandra, HBase, základy LevelDB): zapisuje sekvenčně do logu a memtable, později provádí kompakci do souborů SST. Nabízí vysokou propustnost zápisů, ale představuje kompromis z hlediska čtení a kompakce.
- B+-tree (některé implementace úložišť klíč–hodnota a dokumentových databází): stabilní latence čtení, ale bez optimalizací jsou zápisy na HDD/SSD náročnější.
- WAL/commitlog: zajišťuje trvanlivost zápisů před potvrzením klientovi; je nutné dimenzovat IO a oddělit log od datových souborů.
Geografická replikace a více regionů
- Active-passive: primární region s asynchronní replikací do lokality pro zotavení po havárii (DR); nižší náklady, delší RPO/RTO.
- Active-active: zápisy probíhají ve více regionech; je nutné stanovit strategii řešení konfliktů (časová logika, CRDT, leader pro jednotlivé klíče).
- Latence a směrování: geo-DNS, směrování klientů na nejbližší repliku, vzory read-local/write-global.
Vyvažování zátěže a topologie clusteru
- Konzistentní hashování s virtuálními uzly: jemnozrnné rozložení shardů a rychlejší vyvažování.
- Vědomí racků/zón: repliky napříč racky či zónami zvyšují odolnost proti výpadku domény.
- Klientské ovladače: směrování „token-aware“, automatické opakování požadavků s exponenciálním prodlužováním prodlev a jističe (circuit breakers).
Resharding, vyvažování a růst clusteru
- Scale-out: přidání uzlů → přesun tokenů/partition; kontrola dopadu na latenci a IO.
- Online resharding: postupné dělení a slučování shardů za provozu, omezení rychlosti pro minimalizaci dopadů.
- Omezení horkých míst: přidávání náhodných znaků ke klíčům (salting), dělení podle časových intervalů, náhodné prefixy, write sharding na aplikační vrstvě.
Datové modelování pro škálování
- Návrh nejprve podle přístupových vzorů: tabulky/kolekce navrhujte podle dotazů; denormalizace je očekávaná.
- Disciplína při volbě partition key: vysoká kardinalita a rovnoměrná distribuce; pro rozsahové dotazy přidejte sekundární komponentu.
- TTL a zásady expirace: snížení objemu často používaných dat, dopad na kompakci a GC.
Praktické použití v konkrétních systémech
- Apache Cassandra: konzistentní hashování, nastavitelné úrovně konzistence (ONE, QUORUM, ALL), LSM+kompakce (Size-Tiered/Leveled), více datových center pomocí NetworkTopologyStrategy.
- MongoDB: shardování prostřednictvím konfiguračních serverů a routerů mongos, hashové/rozsahové shard keys, replica sets s majority writeConcern, transakce ACID v rámci shardu (transakce napříč více shardy mají režii).
- Couchbase: oddělené služby (Data/Query/Index), vbuckets pro vyvažování, replikace mezi datovými centry (XDCR).
- Redis Cluster: 16 384 hashovacích slotů, repliky pro vysokou dostupnost, pipelining/Lua pro dávkové zpracování; vhodný pro cache a úložiště klíč–hodnota s nízkou latencí.
- Amazon DynamoDB: spravovaný sharding a automatické škálování, limity partition throughput, Global Tables pro více regionů.
Latence, propustnost a řízení zpětného tlaku
- Řízení tempa a omezení rychlosti: omezte paralelismus klientů, aby se v úložišti netvořily fronty.
- Dávkové zpracování: dávkování zápisů/čtení pro efektivnější IO (pozor na SLA pro jednotlivé požadavky).
- Prioritizace: oddělení systémových a uživatelských úloh (kompakce, opětovné sestavení indexů oproti online provozu).
Správa životního cyklu dat a kompakce
- Zásady kompakce: volba mezi nižší latencí čtení (LCS) a menším zesílením zápisu (STCS/TWCS) podle vzorce zápisů.
- Ochranná lhůta GC: časové okno pro anti-entropy a tombstones; příliš krátká lhůta znamená riziko obnovení smazaných záznamů.
- Vrstvení dat podle stáří a četnosti přístupu: přesun historických shardů na levnější úložiště.
Monitorování a SLO
| Oblast | Klíčové metriky | Poznámka |
|---|---|---|
| Latence | P50/P95/P99 čtení/zápisu | Rozlišujte mezi lokálním provozem a provozem napříč datovými centry. |
| Propustnost | Operace/s, míra omezování rychlosti | Ověřte limity shardu/partition. |
| Ztráty a chyby | Timeouty, nedostupnost, selhání zápisu | Mapujte na topologii/kvóra. |
| Úložiště | Velikost/fronta kompakce | Sledujte tombstones a počet souborů SSTable. |
| Replikace | Zpoždění replikace, fronta hinted handoff | Zpoždění delší než RPO znamená problém. |
Bezpečnost a izolace v distribuovaných clusterech
- Šifrování při přenosu (TLS/mTLS mezi uzly a klienty), šifrování uložených dat (disky, snímky, zálohy).
- RBAC/ABAC, oddělení tenantů (prefixy klíčů, namespaces), limity na úrovni shardů.
- Audit: přístupy, změny schémat, operace správy clusteru (vyvažování, resharding).
Zálohování, PITR a obnova v topologii se shardy
- Koordinované snímky: konzistentní bod napříč shardy (bariéra/zámek, transakční značky, kontrolní body opLog/binlog/WAL).
- PITR: archivace logů pro každý shard, obnova podmnožiny shardů a přehrání do kontrolního bodu.
- Test obnovy: izolovaný testovací cluster, ověření integrity a latencí před přepnutím.
Provoz v Kubernetes a automatizace
- Operátory: deklarativní řízení topologie (shardy, repliky, anti-affinity, třída úložiště), nasazování a návrat k předchozí verzi.
- Rozpočty výpadků podů: zachování kvóra a dostupnosti při údržbě.
- PersistentVolumes: třídy IOPS/latence; vyhrazené uzly pro datové pody.
Testování škálování a scénářů selhání
- Zátěžové a dlouhodobé testy: postupné zvyšování zátěže, sledování P99 a fronty kompakce.
- Chaos engineering: simulace výpadků uzlů, zón a rozdělení sítě; ověření chování kvór.
- Kontrola schémat a dotazů: prevence dotazů typu „scatter/gather“ napříč mnoha shardy.
Nejčastější antipatterny a jak se jim vyhnout
- Monotónní shard key (časové razítko, autoID) → horký shard. Použijte hashování/přidávání náhodných znaků ke klíčům nebo časové intervaly.
- Výchozí konzistence všude → buď zbytečná latence, nebo riziko. Nastavte ji pro každou operaci zvlášť (read/write concern).
- Nedostatečně dimenzovaná kompakce → nárůst latence. Sledujte frontu a plánujte údržbu mimo špičku.
- „Replikace = záloha“ – to neplatí. Zaveďte koordinované snímky a PITR.
- Nerovnoměrný růst tenantů → sharding zohledňující tenanty a možnost migrace mezi shardy.
Kontrolní seznam pro návrh škálovatelného NoSQL
- Jasně definované přístupové vzory; zvolený shard key s vysokou kardinalitou a bez horkých míst.
- Replikační faktor a konzistence (R/W) odvozené od SLO (latence, RPO/RTO).
- Topologie zohledňující racky/zóny a automatické vyvažování.
- Monitorování P50/95/99, zpoždění replikace, fronty kompakce, tombstones.
- Strategie geografické replikace (active-passive oproti active-active) a směrování provozu.
- Zálohy napříč shardy, PITR, pravidelné testy obnovy.
- Bezpečnost: mTLS, šifrování uložených dat, RBAC/ABAC, audit.
- Provozní příručky: resharding, výměna uzlu, průběžná aktualizace, reakce na incidenty.
Závěr: škálování jako disciplína, nikoli jednorázová volba
Úspěšné škálování a replikace v prostředí NoSQL spočívají ve správné kombinaci shardingu, replikace, volby konzistence a provozní disciplíny. Technické principy (kvórum, CRDT, anti-entropy) musejí být sladěny s obchodními SLO a pečlivým datovým modelováním. Dobře navržený a monitorovaný cluster umožní růst bez ztráty výkonu a zajistí odolnost vůči chybám i regionálním výpadkům.
