Read in English · Leer en español · Lire en français
Abschnitt 6.6 von 6.8 · Fortgeschritten · 30 Min. Lesezeit
Konsistenzmodelle, CAP und PACELC
Videolektion
5 Min. · auf Englisch gesprochen, mit UntertitelnNur anhören (Audio)
Transkript lesen
Sobald Daten kopiert werden, können die Kopien voneinander abweichen. In dieser Lektion lernen Sie die wichtigsten Konsistenzmodelle kennen, was das CAP-Theorem wirklich besagt, welche alltägliche Abwägung PACELC ergänzt und wie man wählt.
Stellen Sie sich ein Geschäft mit drei Filialen vor. Jede führt eine Kopie der Bestandsliste, und sie rufen einander bei Änderungen an. Fällt die Leitung aus und fragt ein Kunde eine Filiale nach dem letzten Fahrrad, kann sie sagen: Ich bin nicht sicher, bitte warten Sie. Oder sie antwortet anhand ihrer eigenen Liste und riskiert, ein Fahrrad zu verkaufen, das eine andere Filiale gerade verkauft hat. Selbst wenn die Telefone funktionieren, lässt die vorherige Rückfrage bei den anderen die Kunden warten. Verteilte Systeme stehen vor genau diesen Entscheidungen, und die richtige hängt davon ab, was eine falsche Antwort kosten würde.
Ein Konsistenzmodell ist der Vertrag, der festlegt, welche Abweichungen zwischen Kopien Clients beobachten dürfen. Vorsicht beim mehrdeutigen Wort. Das C in ACID bedeutet den Übergang von einem gültigen Zustand in einen anderen. In CAP, das für Konsistenz, Verfügbarkeit und Partitionstoleranz steht, ist das C enger: Jeder Lesevorgang verhält sich, als gäbe es eine einzige, aktuelle Kopie.
Hier ist die Leiter, vom stärksten zum schwächsten Modell. Linearisierbar verhält sich wie eine einzige Kopie: Sobald ein Schreibvorgang abgeschlossen ist, sieht ihn jeder spätere Lesevorgang. Wollen zwei Kunden den letzten Rabattcode einlösen, gelingt es genau einem. Sequenziell hält eine vereinbarte Reihenfolge der Schreibvorgänge ein, aber ein Lesevorgang kann leicht veraltet sein. Kausal verlangt nur, dass Ursachen vor ihren Wirkungen gesehen werden. Die Antwort eines Restaurants im Bestell-Chat darf nie ohne die Frage des Kunden erscheinen. Session Guarantees sind Versprechen an einen einzelnen Client. Nachdem Sie Ihre Adresse geändert haben, sehen Sie die neue. Und haben Sie einmal „unterwegs“ gesehen, sehen Sie nie wieder „in Zubereitung“. Eventual ist die schwächste nützliche Garantie: Hören die Schreibvorgänge auf, stimmen alle Replikate irgendwann überein. Wie lange das dauert, sagt sie nicht. Jede Stufe nach unten bedeutet weniger Koordination und geringere Latenz, und die schwächeren Modelle arbeiten während einer Netzwerkpartition weiter.
Nun das CAP-Theorem, am Beispiel eines Ticketsystems. Client eins kauft Platz vierzehn C über Replikat A, das ihn als verkauft vermerkt. Dann trennt eine Netzwerkpartition Replikat A von Replikat B, sodass B vom Verkauf nichts erfahren kann. Client zwei fragt Replikat B, ob Platz vierzehn C frei ist. B muss wählen. Es kann Konsistenz wählen: verweigern oder in ein Timeout laufen und sagen, versuchen Sie es später erneut. Oder es wählt Verfügbarkeit: Es antwortet, der Platz sei frei. Das ist veraltet, und der Platz wird womöglich doppelt verkauft.
„Wähle zwei beliebige von dreien“ ist eine Fehldeutung. In jedem vernetzten System treten Partitionen auf, ob Sie das wählen oder nicht. Die einzige Wahl ist, wie man sich dann verhält. Partitionen sind selten, daher kann ein System meistens beides bieten. Die Wahl gilt nur während einer Partition und kann für jede Operation anders ausfallen. Entwerfen Sie also für Partitionen: Erkennen Sie sie, schränken Sie manche Operationen ein, etwa Bestellungen annehmen, aber Erstattungen aufschieben, und führen Sie danach den Zustand zusammen und kompensieren Sie Fehler. PACELC ergänzt, was CAP auslässt. Gibt es eine Partition, wählen Sie zwischen Verfügbarkeit und Konsistenz. Andernfalls, im Normalbetrieb, wählen Sie zwischen Latenz und Konsistenz, denn konsistente Lesevorgänge brauchen Koordination, und die bezahlen Sie bei jeder Anfrage.
Manche Speicher lassen Sie das mit Arithmetik einstellen. Bei N Replikaten ist ein Schreibvorgang bestätigt, sobald W ihn gespeichert haben, und ein Lesevorgang fragt R Replikate und nimmt die neueste Version. Hier ist N drei, und W und R sind beide zwei. Der Writer setzt einen Preis von zwölf, und die Replikate eins und zwei bestätigen ihn. Replikat drei hinkt hinterher und hält noch zehn. Der Leser sammelt Antworten von zwei Replikaten: dem nachhinkenden Replikat drei und Replikat zwei. Weil R plus W größer als N ist, müssen sich die beiden Mengen überschneiden. Hier liegt Replikat zwei in beiden. Also sieht der Leser die neuere Version und liefert zwölf. Doch Überschneidung allein ist nicht linearisierbar. Zum Beispiel können Uhren, die nicht übereinstimmen, einen späteren Schreibvorgang verlieren lassen. Deshalb berechnet die Plattform Kunden zusätzlich den Preis, der beim Bezahlvorgang in der Bestellung gespeichert wurde.
Fragen Sie also für jedes Datum, was schiefgeht, wenn ein Client einen veralteten Wert sieht, und was das kostet. Geld, der letzte Platz beim Vorverkaufsstart und ein eindeutiger Benutzername rechtfertigen starke Konsistenz. Die eigene Adresse eines Kunden und der Bestellstatus brauchen nur Session Guarantees, und die sind günstig: etwa einige Sekunden nach dem Schreibvorgang des Nutzers vom Leader lesen. Ein Restaurant-Chat braucht kausale Reihenfolge. Und Likes, Bewertungen und der Punkt eines Kuriers auf der Karte können eventual sein. Aber Eventual Consistency ist für Nutzer sichtbar, daher braucht sie Produktentscheidungen, nicht nur technische.
Der vollständige Abschnitt geht die Quorum-Optionen durch und zeigt, wie sich vier bekannte Datenbanken konfigurieren lassen. Als Nächstes, in Abschnitt sechs Punkt sieben, betrachten wir Sagas und verteilte Transaktionen. Bis gleich.
Was Sie wissen müssen
- Ein Konsistenzmodell ist der Vertrag, der festlegt, welche veralteten oder umgeordneten Werte Clients beobachten dürfen; das C von CAP (Single-Copy, linearisierbar) unterscheidet sich vom C von ACID (gültiger Zustand) und von Isolationsebenen.
- Vom stärksten zum schwächsten: linearisierbar (eine Kopie, Echtzeit-Reihenfolge), sequenziell (eine vereinbarte Reihenfolge), kausal (Ursachen vor Wirkungen), Session Guarantees wie Read-your-Writes und Monotonic Reads und Eventual Consistency (Konvergenz, wenn keine Schreibvorgänge mehr kommen).
- Das CAP-Theorem (Brewers Vermutung von 2000, 2002 von Gilbert und Lynch bewiesen) besagt, dass ein repliziertes System während einer Netzwerkpartition pro Anfrage zwischen Konsistenz und Verfügbarkeit wählen muss; Partitionen sind nicht optional, daher ist „wähle zwei von dreien“ eine Fehldeutung.
- Brewers Artikel von 2012 empfiehlt, Partitionen zu erkennen, in einem expliziten Partitionsmodus zu arbeiten und sich danach mit Zusammenführungen und Kompensationen zu erholen, wobei für verschiedene Operationen unterschiedlich entschieden wird.
- PACELC (Abadi, 2010 und 2012) ergänzt, dass Systeme andernfalls (else), ohne Partition, bei jeder Anfrage Latenz gegen Konsistenz abwägen.
- Mit N Replikaten, W Schreibbestätigungen und R Leseantworten sorgt die Wahl R + W > N dafür, dass sich Lese- und Schreibmengen überschneiden, aber Quoren allein sind nicht linearisierbar.
- Wählen Sie die Konsistenz je Anwendungsfall: stark für Geld, eindeutige Ressourcen und Invarianten; Session Guarantees für die eigenen Daten eines Nutzers; Eventual Consistency für Zähler, Feeds und Positionen.
Was „konsistent“ bedeutet, sobald Daten kopiert werden
Sobald ein System mehr als eine Kopie eines Datums hält, auf Replikaten in verschiedenen Zonen, in Caches oder in anderen Services, können die Kopien eine Zeit lang voneinander abweichen. Ein Konsistenzmodell ist der Vertrag, der festlegt, welche Abweichungen Clients beobachten dürfen. Es ist ein Versprechen darüber, was Lesevorgänge angesichts der erfolgten Schreibvorgänge liefern können, und damit ein Versprechen darüber, mit welchen Überraschungen der Anwendungscode umgehen muss.
Vorsicht beim mehrdeutigen Wort. Das C in ACID (Abschnitt 0.5) bedeutet, dass eine Transaktion die Datenbank von einem gültigen Zustand in einen anderen überführt und dabei Regeln einhält wie „ein Kontostand wird nie negativ“. Das C in CAP bedeutet etwas anderes und Engeres: Jeder Lesevorgang verhält sich so, als gäbe es eine einzige, aktuelle Kopie. Isolationsebenen von Datenbanken wie Serializable oder Read Committed sind eine dritte Familie, die gleichzeitige Transaktionen betrifft; sie werden unter Transaktionen und Isolation behandelt. In diesem Abschnitt geht es um die Garantien replizierter Daten.
Konsistenzmodelle vom stärksten zum schwächsten
Linearisierbarkeit, 1990 von Maurice Herlihy und Jeannette Wing definiert, ist das stärkste Modell für ein einzelnes Objekt. Jede Operation scheint zu einem Zeitpunkt zwischen ihrem Beginn und ihrem Ende augenblicklich wirksam zu werden, und alle Clients sehen dieselbe Reihenfolge, die die Echtzeit respektiert: Sobald ein Schreibvorgang abgeschlossen ist, sieht jeder danach beginnende Lesevorgang ihn oder etwas Neueres. Das System verhält sich, als gäbe es eine einzige Kopie. Beispiel aus der Essenslieferung: Zwei Kunden versuchen, den letzten Rabattcode einzulösen; mit einem linearisierbaren Speicher gelingt es genau einem, und der andere sieht, dass er weg ist, egal welches Replikat sie erreichen.
Sequenzielle Konsistenz, 1979 von Leslie Lamport für Multiprozessoren definiert, behält die eine globale Reihenfolge bei und hält die Operationen jedes Clients in der Reihenfolge, in der dieser Client sie ausgelöst hat, verzichtet aber auf die Echtzeitanforderung. Ein Client darf einen leicht veralteten Wert lesen, solange sich alle über die Reihenfolge aller Schreibvorgänge einig sind. In verteilten Datenbanken wird sie selten ausdrücklich angeboten, erklärt aber den Unterschied zwischen „eine vereinbarte Reihenfolge“ und „eine vereinbarte Reihenfolge, die zur Uhr passt“.
Kausale Konsistenz verlangt nur, dass kausal zusammenhängende Operationen von allen in derselben Reihenfolge gesehen werden: Hing das Schreiben von B davon ab, A gesehen zu haben, darf niemand B ohne A sehen. Gleichzeitige, voneinander unabhängige Schreibvorgänge dürfen von verschiedenen Clients in unterschiedlicher Reihenfolge gesehen werden. Beispiel: Ein Restaurant antwortet im Bestell-Chat auf die Frage eines Kunden „Ja, es ist glutenfrei“; niemand sollte je die Antwort ohne die Frage sehen. Kausale Konsistenz ist attraktiv, weil Jepsens viel genutzte Übersicht der Konsistenzmodelle sie als mit Sticky-Verfügbarkeit erreichbar einstuft: Sie kann während einer Partition weiterarbeiten, solange jeder Client beim selben Replikat bleibt.
Die Session Guarantees, 1994 von Douglas Terry und Kollegen beschrieben, sind schwächere Versprechen pro Client, die die verwirrendsten Anomalien beseitigen. Read-your-Writes: Nachdem ein Kunde die Lieferadresse geändert hat, zeigt sein nächster Lesevorgang die neue Adresse, auch wenn andere Nutzer sie erst später sehen. Monotonic Reads: Hat ein Client einmal den Bestellstatus „unterwegs“ gesehen, sieht er nie später „in Zubereitung“, weil ein späterer Lesevorgang ein nachhinkendes Replikat getroffen hat. (Zwei weitere Garantien, Monotonic Writes und Writes-Follow-Reads, schränken die Reihenfolge ein, in der die Schreibvorgänge eines Clients angewendet werden.)
Eventual Consistency, 2008 von Werner Vogels bekannt gemacht, ist die schwächste nützliche Garantie: Kommen keine neuen Schreibvorgänge, konvergieren alle Replikate irgendwann auf denselben Wert. Sie sagt nichts darüber, wie lange das dauert oder was in der Zwischenzeit gelesen werden kann, und eine einfache Implementierung, die widersprüchliche Schreibvorgänge löst, indem sie den mit dem jüngsten Zeitstempel behält, bekannt als Last Write Wins, verwirft den anderen stillschweigend. Stärkere Formen wie Strong Eventual Consistency mit konfliktfreien replizierten Datentypen (CRDTs) garantieren, dass Replikate, die dieselben Aktualisierungen erhalten haben, denselben Zustand halten, indem sie Datentypen nutzen, deren gleichzeitige Aktualisierungen sich immer zusammenführen lassen, etwa Zähler und Mengen.
Die Konsistenzleiter
CAP: was es tatsächlich besagt
Eric Brewer stellte die CAP-Idee im Jahr 2000 in seiner Keynote auf dem ACM Symposium on Principles of Distributed Computing (PODC) als Vermutung vor. 2002 veröffentlichten Seth Gilbert und Nancy Lynch einen formalen Beweis, der sie für ihre präzisen Definitionen zu einem Theorem machte. Konsistenz bedeutete Linearisierbarkeit. Verfügbarkeit bedeutete, dass jede Anfrage, die ein nicht ausgefallener Knoten erhält, zu einer Antwort führen muss. Partitionstoleranz bedeutete, dass das System seine Versprechen auch dann hält, wenn das Netzwerk beliebig viele Nachrichten zwischen Knoten verliert.
Genau gelesen ist das CAP-Theorem eng. Es besagt, dass ein repliziertes System, wenn eine Netzwerkpartition auftritt, sodass manche Knoten andere nicht erreichen, für jede Anfrage zwischen Konsistenz und Verfügbarkeit wählen muss. Ein Knoten, der von den neuesten Schreibvorgängen abgeschnitten ist, kann entweder die Antwort verweigern (oder warten, bis die Partition behoben ist) und so die Konsistenz wahren, oder mit dem antworten, was er hat, und so die Verfügbarkeit wahren, mit dem Risiko, veraltete Daten zu liefern oder widersprüchliche Schreibvorgänge anzunehmen. Das Diagramm zeigt das Dilemma für ein Ticketsystem, das Platz 14C verkauft.
Mehrere verbreitete Lesarten sind falsch. „Wähle zwei beliebige von dreien“ legt nahe, Partitionstoleranz sei optional, doch in jedem System, das über ein Netzwerk kommuniziert, treten Partitionen auf, ob Sie sie wählen oder nicht; die einzige echte Wahl ist, wie sich das System dann verhält. Ein sogenanntes „CA“-System ist eines, das nicht entschieden hat, was bei einer Partition geschehen soll; vertretbar ist das nur dort, wo Partitionen praktisch unmöglich sind, etwa auf einem einzelnen Knoten. „Unsere Datenbank ist CP (oder AP)“ ist meist ungenau: CAP-Verfügbarkeit ist eine sehr starke Eigenschaft, die viele als hochverfügbar vermarktete Systeme nicht haben, und viele als CP bezeichnete Systeme sind auch nicht linearisierbar. Martin Kleppmann argumentierte 2015, Datenbanken sollten überhaupt nicht als CP oder AP etikettiert werden, weil die meisten keine der beiden Definitionen erfüllen und ihr Verhalten von der Konfiguration abhängt. „CAP erklärt unsere Latenz“ ist ebenfalls falsch: CAP sagt nichts darüber, was geschieht, wenn keine Partition vorliegt, also die meiste Zeit.
Die CAP-Entscheidung, konkret gemacht
CAP zwölf Jahre später
2012 erklärte Brewer selbst in einem Artikel in IEEE Computer mit dem Titel „CAP Twelve Years Later: How the Rules Have Changed“, dass die Formel „zwei von dreien“ in die Irre geführt habe. Partitionen sind selten, daher kann ein System fast immer sowohl Konsistenz als auch Verfügbarkeit bieten; die Wahl gilt nur während einer Partition und nur für die betroffenen Operationen. Die Wahl muss auch nicht global sein: Verschiedene Operationen und verschiedene Daten können unterschiedlich entscheiden.
Brewer empfahl, in drei Schritten ausdrücklich für Partitionen zu entwerfen: die Partition erkennen, in einen expliziten Partitionsmodus wechseln, in dem manche Operationen eingeschränkt sind (zum Beispiel Bestellungen annehmen, aber Rückerstattungen aufschieben), und danach einen Wiederherstellungsprozess ausführen, der den Zustand zusammenführt und Fehler aus der Zeit der Partition kompensiert. Er wies auch darauf hin, dass das C von CAP Single-Copy-Konsistenz ist, eine strengere Teilmenge dessen, was das C von ACID schützt, und dass Invarianten wie „nie überverkaufen“ unter Umständen nachträglich repariert werden müssen. Diese Sichtweise führt direkt zu den fachlichen Kompensationen der Sagas: Eine Fluggesellschaft, die einen Flug überbucht, entschädigt den Fluggast, statt während einer Netzwerkstörung alle Buchungen abzulehnen.
PACELC: die Abwägung, die Sie jeden Tag bezahlen
Daniel Abadi wies 2010 in einem Blogbeitrag und 2012 in einem Artikel in IEEE Computer, „Consistency Tradeoffs in Modern Distributed Database System Design: CAP is Only Part of the Story“, darauf hin, dass CAP die Abwägung ignoriert, vor der Entwerfende tatsächlich die meiste Zeit stehen. PACELC liest sich so: Gibt es eine Partition, wähle zwischen Verfügbarkeit (Availability) und Konsistenz (Consistency); andernfalls (Else), im Normalbetrieb, wähle zwischen Latenz (Latency) und Konsistenz (Consistency).
Die „Else“-Hälfte ist die wichtige Ergänzung. Um einen Lesevorgang konsistent zu machen, muss ein repliziertes System koordinieren: den Schreibvorgang an andere Replikate senden und auf Bestätigungen warten, jeden Lesevorgang an einen Leader leiten oder mehrere Replikate kontaktieren und vergleichen. Jedes davon kostet Netzwerk-Roundtrips, und über Regionen hinweg kann ein Roundtrip Dutzende oder sogar Hunderte Millisekunden kosten. Ein System, das ohne Koordination vom nächstgelegenen Replikat antwortet, ist schneller, aber möglicherweise veraltet. Diese Abwägung wird bei jeder Anfrage bezahlt, mit oder ohne Partition.
PACELC-Einstufungen werden oft zitiert, etwa PA/EL für Systeme, die auf Geschwindigkeit und Verfügbarkeit ausgelegt sind, und PC/EC für Systeme, die immer Konsistenz bevorzugen. Behandeln Sie sie als Beschreibungen einer Konfiguration, nicht eines Produkts: Dieselbe Datenbank kann in einem Deployment PA/EL und in einem anderen PC/EC sein, je nach Einstellungen, die pro Tabelle, pro Abfrage oder pro Anfrage gewählt werden.
Quoren: Konsistenz mit Arithmetik einstellen
Leaderlose replizierte Speicher nach dem Vorbild von Amazons Dynamo-Paper (2007) lassen jede Operation wählen, wie viele Replikate sie einbezieht. Bei N Replikaten eines Eintrags gilt ein Schreibvorgang als bestätigt, wenn W Replikate ihn gespeichert haben, und ein Lesevorgang sammelt Antworten von R Replikaten und liefert die neueste Version darunter. Gilt R + W > N, überschneidet sich jede Lesemenge mit jeder Schreibmenge in mindestens einem Replikat, sodass ein Lesevorgang mindestens eine Kopie des neuesten bestätigten Schreibvorgangs einschließt.
Die Wahl von R und W wägt Konsistenz, Latenz und Verfügbarkeit gegeneinander ab. Niedrigere Werte bedeuten, auf weniger und schnellere Replikate zu warten und mehr Ausfälle zu tolerieren, um den Preis möglicher veralteter Lesevorgänge. Höhere Werte bedeuten das Gegenteil. Schreibvorgänge werden meist ohnehin an alle N Replikate gesendet; W entscheidet nur, auf wie viele Bestätigungen der Client wartet.
Die Überschneidung der Quoren ist für aktuelle Lesevorgänge notwendig, aber für sich genommen keine Linearisierbarkeit. Gleichzeitige Schreibvorgänge können nach Zeitstempeln von Uhren geordnet werden, die nicht übereinstimmen, sodass ein späterer Schreibvorgang unter Last-Write-Wins verlieren kann. Ein Schreibvorgang, der scheiterte, nachdem er einige Replikate erreicht hatte, kann auf diesen noch sichtbar sein. „Sloppy“ Quoren, die während Ausfällen Schreibvorgänge auf Ersatzknoten annehmen, heben die Überschneidung auf. Und zwei Lesevorgänge, die sich mit einem noch laufenden Schreibvorgang überschneiden, können erst neue, dann alte Werte sehen, sofern der Lesende nachhinkende Replikate nicht vor der Rückgabe repariert. Speicher, die echte Compare-and-Set-Semantik brauchen, ergänzen für genau diese Operationen ein Konsensprotokoll, etwa die auf Paxos basierenden Lightweight Transactions in Apache Cassandra.
Warum R + W > N funktioniert
Wie sich bekannte Datenbanken konfigurieren lassen
Reale Produkte sitzen selten an einem einzigen Punkt der Leiter. Sie bieten Einstellungen, und die richtige Beschreibung lautet „wie dieses Deployment konfiguriert ist“. Es folgen vier gängige Beispiele; prüfen Sie die aktuelle Dokumentation der Version, die Sie betreiben, denn Standardwerte ändern sich zwischen Releases.
Konfigurierbare Konsistenz in vier weit verbreiteten Datenbanken (Verhalten laut Dokumentation zum Zeitpunkt der Erstellung)
| Datenbank | Typisches Standardverhalten | Einstellungen, die die Konsistenz stärken | Worauf zu achten ist |
|---|---|---|---|
| PostgreSQL mit Streaming Replication | Ein Primary nimmt alle Schreibvorgänge an; die Replikation zu Standbys ist standardmäßig asynchron, daher können Lesevorgänge von einem Standby veraltet sein. | synchronous_standby_names mit synchronous_commit (zum Beispiel remote_apply) lässt einen Commit warten, bis die Standbys ihn haben; lesen Sie für Read-your-Writes vom Primary. | Synchrone Replikation erhöht die Commit-Latenz, und Schreibvorgänge stocken, wenn die erforderlichen Standbys nicht erreichbar sind. |
| MongoDB-Replica-Set | Schreibvorgänge verwenden in den meisten Deployments standardmäßig Majority-Bestätigung; Lesevorgänge vom Primary verwenden standardmäßig den Read Concern local, der Daten liefern kann, die später zurückgerollt werden. | Read Concern majority oder linearizable; kausal konsistente Sessions, wenn Lese- und Schreibvorgänge beide Majority verwenden. | Lesen von Secondaries (Read Preference) tauscht Aktualität gegen Latenz und Last. |
| Apache Cassandra | Das Konsistenzlevel wird pro Anfrage gewählt (ONE, QUORUM, LOCAL_QUORUM, ALL und andere); Konflikte werden über Last-Write-Wins-Zeitstempel aufgelöst. | QUORUM (oder LOCAL_QUORUM innerhalb eines Rechenzentrums) für Lese- und Schreibvorgänge, sodass R + W > Replikationsfaktor; Lightweight Transactions für Compare-and-Set. | Clock Skew beeinflusst Last-Write-Wins; LOCAL_QUORUM gibt keine rechenzentrumsübergreifende Garantie. |
| Amazon DynamoDB | Lesevorgänge sind standardmäßig eventual consistent; Global Tables replizieren standardmäßig asynchron zwischen Regionen. | ConsistentRead=true auf Tabellen und lokalen sekundären Indizes; Global Tables mit Multi-Region Strong Consistency (seit 2025 allgemein verfügbar). | Stark konsistente Lesevorgänge sind auf globalen sekundären Indizes nicht verfügbar, verbrauchen die doppelte Lesekapazität und können langsamer sein. |
Konsistenz je Anwendungsfall wählen
Die nützlichste Gewohnheit ist, nicht mehr zu fragen „Ist unser System konsistent?“, sondern für jedes Datum und jede Operation: Was geht schief, wenn ein Client einen veralteten oder umgeordneten Wert sieht, und was kostet das? Geldbewegungen, eindeutige Ressourcen und Invarianten rechtfertigen meist starke Konsistenz und ihre Latenz. Zähler, Feeds, Empfehlungen und Analysen meist nicht. Viele für Nutzer sichtbare Anomalien verschwinden schon mit den Session Guarantees, die günstig sind: Leiten Sie die Lesevorgänge eines Nutzers für einige Sekunden nach dessen Schreibvorgang an den Primary, oder führen Sie ein Versions-Token in der Session mit und warten Sie, bis das Replikat damit gleichgezogen hat.
Konsistenzbedarf je Anwendungsfall
| Anwendungsfall | Kosten eines veralteten oder umgeordneten Lesevorgangs | Sinnvolle Garantie | Typischer Mechanismus |
|---|---|---|---|
| Kontostand vor einer Abhebung | Überziehung über das Limit; Geld verloren | Linearisierbar (und serialisierbare Transaktionen) | Ein einzelner Leader für das Konto, synchrone Replikation oder Konsens |
| Letzter Platz oder letztes Ticket beim Vorverkaufsstart | Einen Platz doppelt verkaufen; Erstattungen und verärgerte Kunden | Linearisierbar pro Platz | Bedingter Schreibvorgang (Compare-and-Set) auf dem Platz-Datensatz |
| Eindeutiger Benutzername bei der Registrierung | Zwei Konten mit demselben Namen | Linearisierbar bei der Eindeutigkeitsprüfung | Unique Constraint in einer Datenbank oder eine konsensgestützte Registry |
| Eigene Lieferadresse des Kunden nach der Bearbeitung | Essen geht an die alte Adresse | Read-your-Writes | Nach einem Schreibvorgang vom Leader lesen oder ein Versions-Token in der Session |
| Dem Kunden angezeigter Bestellstatus | Status scheint zurückzuspringen; Verwirrung und Support-Anrufe | Monotonic Reads plus Read-your-Writes | Sticky Routing zu einem Replikat oder Versions-Tokens |
| Restaurant-Chat mit dem Kunden | Eine Antwort erscheint vor ihrer Frage | Kausal | Kausal konsistenter Speicher oder Reihenfolge pro Unterhaltung |
| Warenkorb | Ein entfernter Artikel taucht wieder auf; leicht ärgerlich | Eventual, mit Zusammenführung | Hinzufügungen immer annehmen; Versionen zusammenführen (das Beispiel aus dem Dynamo-Paper) |
| Like-Zähler oder Restaurantbewertung | Zahl weicht ein paar Sekunden lang um einige ab | Eventual | Asynchrone Replikation, Zähler oder CRDTs |
| Kurierstandort auf der Karte | Punkt ein paar Sekunden hinterher | Eventual, neuester Wert gewinnt | Schreibvorgänge mit niedriger Latenz an das nächste Replikat; alte Positionen verworfen |
Prüfen Sie Ihr Verständnis
Was ist der Unterschied zwischen Linearisierbarkeit und sequenzieller Konsistenz?
Beide verlangen eine einzige Reihenfolge der Operationen, auf die sich alle Clients einigen und die die eigene Reihenfolge jedes Clients respektiert; Linearisierbarkeit verlangt zusätzlich, dass diese Reihenfolge die Echtzeit respektiert, sodass ein Lesevorgang, der nach Abschluss eines Schreibvorgangs beginnt, ihn sehen muss.
Warum ist eine „CA“-Datenbank in einem verteilten System keine sinnvolle Wahl?
Weil Netzwerkpartitionen in jedem System auftreten, das über ein Netzwerk kommuniziert; ein System, das annimmt, dass sie nie vorkommen, hat einfach nicht entschieden, was es tun wird, wenn sie auftreten.
Was ist bei N = 5 und W = 2 das kleinste R, das eine Überschneidung von Lese- und Schreibmengen garantiert?
R = 4, weil R + W größer als 5 sein muss.
Ein Nutzer bearbeitet sein Profil, und die neu geladene Seite zeigt die alte Version, obwohl es keine Rolle spielt, wenn andere Nutzer die Änderung erst spät sehen. Welche Garantie fehlt, und was ist eine günstige Abhilfe?
Read-your-Writes; die Lesevorgänge dieses Nutzers kurz nach einem Schreibvorgang an den Leader leiten oder ein Versions-Token mitführen und auf ein Replikat warten, das gleichgezogen hat.
Quellen und weiterführende Literatur
- Eric Brewer: CAP Twelve Years Later: How the Rules Have Changed (InfoQ reprint of the IEEE Computer article)
- Daniel Abadi: Problems with CAP, and Yahoo's little known NoSQL system (2010, origin of PACELC)
- Jepsen: Consistency models
- Martin Kleppmann: Please stop calling databases CP or AP (2015)
- Apache Cassandra documentation: Dynamo (tunable consistency and quorums)
Haben Sie eine Frage zu diesem Abschnitt? ArchitectBot, der KI-Lernassistent des Kurses, antwortet zuerst aus dem Kurs.
Fragen: „Wir fügen unserer Bestelldatenbank Read Replicas hinzu. Welche Ansichten der Kunden-App brauchen Read-your-Writes, und wie stellen wir das günstig bereit?“