Modely konzistence jsou formální dohody (smlouvy) o tom, jaká nekonzistence je povolená a jak se smí projevit.
Neříká jak to systém dělá, ale co musí být pravda.
Bez modelu konzistence nelze říct, zda je pozorované chování správné nebo chybné.
Princip
Definuje smlouvu (kontrakt) mezi distribuovaným datovým úložištěm (DS) a klientem.
- Určuje pravidla, jak a kdy se změny provedené jedním procesem zviditelní ostatním.
- Hlavní trade-off: Čím silnější konzistence (data jsou více „jako na jednom PC“), tím horší výkon a dostupnost (CAP theorem).
[!note] Klient
Klient je v distribuovaném systému role procesu, který aktivně iniciuje komunikaci zasláním požadavku (Request) za účelem využití služby. Tento proces běží na uzlu, který se v tu chvíli označuje jako klientský uzel.
Model konzistence je cílový stav, komunikační model je prostředek, jak ho dosáhnout. Fyzikální vlastnosti komunikace limitují maximální dosažitelnou konzistenci.
Dělení modelů (Data-centric)
Modely seřazené od nejsilnějších (nejdražších) po nejslabší (nejrychlejší).
Silné modely (Strong consistency)
Snaží se simulovat chování jednoho počítače. Vyžadují synchronizaci (blokování).
Strict Consistency (striktní)
- Definice: Jakýkoliv zápis je okamžitě viditelný všem.
- Realita: Nemožné v distribuovaném systému (rychlost světla). Slouží jen jako teoretický ideál.
Linearizability (Linearizovatelnost / Atomická):
- Definice: Operace vypadají, že proběhly instantně v nějakém bodě mezi voláním a návratem. Musí respektovat reálný čas.
- Laicky: Když mi server A potvrdí zápis v 12:00:01, tak server B v 12:00:02 už musí vrátit novou hodnotu.
- Použití: Bankovní systémy, zámky, semafory.
Sequential Consistency (Sekvenční)
- Definice: Výsledek je stejný, jako by se operace všech procesů provedly v nějakém sekvenčním pořadí, které respektuje pořadí instrukcí v jednotlivých programech. Neřeší reálný čas.
- Laicky: Je jedno, jestli se zápis projeví za sekundu nebo za minutu, ale všichni musí vidět změny ve stejném pořadí.
- Použití: Databázové repliky.
[!NOTE] Rozdíl Linearizability vs. Sequential
Linearizability řeší reálný čas (když já zavolám mobilem, ty to hned slyšíš). Sequential řeší jen shodu (je jedno, že zpráva přišla pozdě, hlavně že jsme ji všichni přečetli jako druhou v pořadí).
Slabé modely (weak consistency)
Obětují konzistenci pro rychlost a dostupnost (CAP theorem).
Causal Consistency (Kauzální)
- Definice: Zápisy, které jsou kauzálně závislé (příčina → následek), musí být všemi viděny ve stejném pořadí. Nezávislé (konkurentní) zápisy mohou být viděny různě.
- Implementace: logický čas#Vektorové hodiny (vector clocks).
- Příklad: Chat (Odpověď se nesmí zobrazit před Otázkou).
FIFO (PRAM) Consistency
- Definice: Vidím zápisy od jednoho procesu ve správném pořadí. Zápisy od různých procesů se mohou míchat.
Eventual Consistency (Případná)
- Definice: Pokud ustanou zápisy, časem (eventually) se všechny repliky shodnou. Mezitím mohou vracet stará data.
- Použití: DNS, Web caching, Amazon Dynamo, Facebook feed.
- Výhoda: Extrémně levné a dostupné (funguje i při výpadku sítě).
[!note] Využití
standard pro moderní webové aplikace kvůli CAP teorému.
Klientské záruky (Client-Centric Consistency)
Někdy server nedokáže garantovat globální konzistenci, ale může dát záruku konkrétnímu klientovi (Session guarantees). Hodí se pro mobilní uživatele, kteří se přepojují mezi replikami.
- Monotonic Reads: Pokud jsem něco přečetl, už nikdy neuvidím starší verzi (nevracím se v čase).
- Read-Your-Writes: Vždy vidím data, která jsem sám zapsal (i když ostatní je ještě nevidí).
- Writes-Follow-Reads: Pokud čtu data X a pak zapíšu Y, tak Y je kauzálně po X.