Proč NoSQL a kdy po nich sáhnout
MongoDB, Apache Cassandra a Redis patří mezi nejrozšířenější NoSQL databáze, které řeší limity klasických relačních systémů při práci s velkým objemem dat, vysokou propustností a proměnlivými schématy. Každý nástroj reprezentuje odlišný datový model a škálovací filozofii: MongoDB jako document store, Cassandra jako wide-column store s důrazem na horizontální škálování a dostupnost, a Redis jako in-memory key–value engine s bohatými datovými strukturami pro extrémně nízké latence. Volba závisí na prioritách v tzv. CAP trojúhelníku (konzistence, dostupnost, odolnost vůči particím), na přístupu k datovému modelování, SLA, i provozních omezeních.
Datové modely a schémata
- MongoDB (Document): JSON-like dokumenty (BSON) s flexibilním schématem. Vhodné pro hierarchická data, embeddované subdokumenty a rychlou evoluci schémat bez masivních migrací.
- Cassandra (Wide-column): tabulky a partition key s clustering columns. Datový model odráží přístup „modeluj podle dotazů“ – denormalizace a materializace dat pro čtecí vzory.
- Redis (In-memory key–value): klíče a různé typy hodnot (strings, lists, sets, sorted sets, hashes, streams, bitmaps, hyperloglog). Od Redis 6+ per-key modules a data types rozšiřují možnosti (RedisJSON, RedisSearch, RedisGraph – dnes Redis Stack).
Dotazovací jazyky a API
- MongoDB: bohatá dotazovací DSL (find/aggregate pipeline), sekundární indexy, textové a geospatial dotazy, transakce na více dokumentů a ACID v rámci kolekcí a replikových sad.
- Cassandra: CQL (Cassandra Query Language) připomínající SQL, ale bez joins a ad-hoc agregací napříč partition. Důraz na předem navržené primární klíče a sekvenování clustering sloupců.
- Redis: příkazové API per datový typ (GET/SET, HGETALL, ZRANGE, XREAD/XADD…). Redis Stack přidává full-text vyhledávání a JSON dotazy.
Indexace a vyhledávání
- MongoDB: single field, compound, multikey (pole), TTL, partial a sparse indexy; podpora covered queries a hint. S Atlas Search (Lucene) i bohaté full-text/geo/semantic dotazy.
- Cassandra: primárně rely na primary key a clustering pořadí. Sekundární indexy jsou omezené (vhodné na nízkou kardinalitu). Pro full-text/analytics se často integruje Elastic/Trino/Spark.
- Redis: základní operace jsou O(1)/O(log n) dle typu; RedisSearch (v rámci Redis Stack) přináší invertované indexy, full-text a agregace.
Transakce, konzistence a CAP
- MongoDB: v replikové sadě výchozí readConcern/writeConcern s možností majority. Podpora multi-document transakcí (ACID) – vhodné pro OLTP-like scénáře.
- Cassandra: AP orientace (dostupnost + partition tolerance). Tunable consistency (ONE, QUORUM, ALL…) pro čtení/zápis. Transakce napříč partition nejsou, lightweight transactions (CAS) pro podmíněný zápis s Paxos overheadem.
- Redis: per-příkaz atomicita; transactions (MULTI/EXEC) bez izolace mezi klienty; LUA skripty pro atomické kompozity. Redis Cluster má asynchronní replikaci (eventual consistency mezi shardů).
Škálování, sharding a replikace
- MongoDB: replica set (primary + secondaries) pro HA; horizontální škálování pomocí sharded clusteru (shard key, balancer, range/hash sharding). Čtení lze odklonit na sekundární uzly s příslušnou konzistencí.
- Cassandra: masterless architektura, peer-to-peer s konzistentním hashováním, bez single-point-of-failure. Snadný scale-out přidáním uzlů, automatické rebalancování replik v keyspace s definovaným replication factor.
- Redis: Redis Cluster (hash sloty) pro horizontální škálování, replicas pro HA. Pro velmi vysokou odolnost a persistenci se kombinuje s AOF/RDB a sentinel pro failover.
Perzistence, odolnost a zotavení
- MongoDB: journaling, write-ahead logging, point-in-time zálohy (oplog), change streams pro CDC. Silná perzistence na disk.
- Cassandra: commit log + SSTables (LSM-tree), memtable flush, kompakce. Přirozeně odolná proti výpadkům uzlů; tunable consistency minimalizuje RPO.
- Redis: primárně in-memory; perzistence volitelně RDB snapshoty a AOF (append-only log) s různou fsync politikou. Při přísných RPO/RTO je nutná pečlivá konfigurace a replikace.
Latence a propustnost: výkonové profily
- Redis: sub-milisekundové latence a miliony RPS při in-memory přístupu; ideální pro cache, session store, realtime pořadníky, pub/sub a proudy (Streams).
- MongoDB: nízké až střední latence s bohatou funkcionalitou dotazů; vhodné pro API back-ends, katalogy, profily uživatelů, event storage s agregacemi.
- Cassandra: stabilní latence pod zátěží a lineární škálování pro masivní zápisy/čtení s předvídatelným přístupovým vzorem (telemetrie, time-series, IoT).
Typické use-casy
- MongoDB: mikroservisní aplikace, obsahové systémy, mobilní backendy, geolokace, event sourcing s change streams, rychlá iterace schématu.
- Cassandra: logování a metriky v petabyte škále, časové řady, messaging s nízkým RTO, retail clickstream s požadavkem na dostupnost v multi-regionu.
- Redis: caching vrstvy, rate limiting, fronty a leaderboards, realtime notifikace, feature flags, full-text a JSON (Redis Stack) při potřebě nízké latence.
Modelování dat: principy a anti-patterny
- MongoDB: embeddovat vs. referencovat – malé, často čtené podstruktury embed, velké a sdílené entity referencovat. Vyhnout se nekonečnému růstu dokumentu (document growth) a neefektivním unbounded arrays.
- Cassandra: nejprve specifikujte dotazy, až poté tabulky. Vyhýbejte se „horkým“ partition (skew) – volte kompozitní klíče a bucketing podle času.
- Redis: volba datového typu dle operací (počítadla → INCR, pořadníky → ZSET, dokumenty → JSON). Nastavujte TTL a eviction policy; vyhněte se příliš velkým klíčům (big values) bez chunkování.
Transakční požadavky a konzistence v praxi
Pokud je nutná silná ACID konzistence a více-entitní transakce, má navrch MongoDB (resp. zvážit relační DB). Cassandra řeší konzistenci per-request pomocí kvór a je vhodná tam, kde mírná eventualita není problém. Redis poskytne atomickou sekvenci operací (script/transaction) v rámci uzlu; v clusteru je třeba brát v úvahu key-slot omezení a cross-slot operace.
Observabilita, provoz a údržba
- MongoDB: profiler, explain plans, FTDC telemetrie; monitorujte oplog lag, blokace, velikosti working setů a indexů.
- Cassandra: nodetool, JMX metriky, compaction/GC chování, latence čtení/zápisu, stav replikace; pečlivě ladit kompakce (STCS/LCS/TWCS) a velikost memtable.
- Redis: INFO metriky, latency monitor, slowlog, sentinel/cluster stav; hlídat paměť, fragmentaci, RDB/AOF IO a replikace lag.
Bezpečnost a governance
- Autentizace/Autorizace: všechny tři podporují ACL; MongoDB role-based, Cassandra role management, Redis ACL per příkaz/klíčový vzor.
- Šifrování: TLS v tranzitu; šifrování na disku (TDE/dm-crypt) dle distribuce; správa klíčů přes KMS v cloudu.
- Audit: MongoDB má detailní audit logy; u Cassandry/Redis často externí centralizace (SIEM) přes export metrik/logů.
Cloudové služby a ekosystém
- MongoDB Atlas: spravovaný multi-cloud, serverless, Atlas Search, Triggers, Data Federation, konektory na BI/ETL.
- Managed Cassandra: DataStax Astra, Amazon Keyspaces (CQL), Azure Managed Instance pro Cassandra; integrace se Spark/Trino.
- Redis (Managed): Redis Enterprise Cloud, Amazon ElastiCache / MemoryDB, Azure Cache for Redis; Redis Stack pro JSON/Search.
Výkon a náklady: provozní strategie
- MongoDB: optimalizujte indexy, covered queries, kompresi a ukládání velkých souborů přes GridFS jen pokud je potřeba. Sledujte cenu IO/Storage u cloudu.
- Cassandra: lineární škálování přidáním uzlů; náklady dominují v počtu strojů a IO. Důležitá je správná velikost SSTable, kompakce a GC tuning JVM.
- Redis: paměť je drahá – využívejte kompresi (u JSON), expirace, LFU/LRU a oddělení „hot“/„warm“ dat (tiering do diskových nástaveb, pokud to produkt umožní).
Migrace a polyglot persistence
Často dává smysl polyglot přístup: Redis jako cache a messaging, MongoDB jako primární úložiště aplikačních dat a Cassandra pro time-series/eventy v masivním měřítku. Při migracích definujte kontrakty schémat, dual-write/change data capture a ověřujte konzistenci vzorkováním. Zohledněte idempotentní replay a backfill historických dat.
Testování, benchmarking a SLO
- Simulujte reálné workloady: mix čtení/zápisů, rozdělení klíčů, velikosti dokumentů/řádků a hotspoty.
- Měřte p50/p95/p99 latence a variabilitu; pozor na GC pauzy (Cassandra), page-faulty (MongoDB) a AOF fsync (Redis).
- Definujte SLO: latence, throughput, RPO/RTO a dostupnost; nastavte alerting a autoscaling pravidla.
Rozhodovací matice: rychlý výběr podle kritérií
- Potřeba bohatých dotazů a flexibilního schématu → MongoDB.
- Masivní škála napříč datovými centry s vysokou dostupností → Cassandra.
- Extrémní latence (sub-ms), caching, fronty, realtime analytika → Redis (Redis Stack pro JSON/Search).
- Silné ACID transakce přes více entit → spíše MongoDB (nebo relační DB).
- Jednoduché operace nad klíči a datovými strukturami → Redis.
Časté chyby a doporučení
- MongoDB: absence vhodného shard key, nadužívání $lookup místo promyšleného modelu, neomezené pole.
- Cassandra: špatně zvolený partition key → nevyvážené clustery; nevhodná kompakce → latence a diskový tlak.
- Redis: chybějící expirace, přetěžování jediného uzlu, nepochopení eviction policy a perzistence.
Kontrolní seznam při návrhu NoSQL řešení
- Výběr databáze podle převažujících dotazů a SLO (latence, propustnost, dostupnost).
- Datový model navržený podle dotazů a vzorů přístupu; validace na reálných scénářích.
- Strategie škálování (replication factor, shard key, cluster topologie, multi-region).
- Indexační strategie a observabilita (slow queries, hot partitions, cache hit ratio).
- Bezpečnost (TLS, ACL/role, šifrování at-rest) a zálohování/DR (RPO/RTO).
- Nákladová optimalizace (tiering, komprese, TTL, autoscaling) a testy odolnosti.
Závěr: správný nástroj na správnou práci
MongoDB, Cassandra a Redis nejsou záměnné – každá technologie řeší jinou třídu problémů. Úspěch spočívá v realistickém posouzení požadavků, disciplinovaném modelování, dobře navržené škálovací topologii a pečlivé observabilitě. V praxi se osvědčuje polyglot persistence – využít Redis pro rychlou vrstvu a messaging, MongoDB pro pružné aplikační datové modely a Cassandru pro lineárně škálovatelné time-series a události. Tím získáte robustní, výkonné a nákladově předvídatelné řešení v podmínkách moderních distribuovaných systémů.