Be Software Architecture Wise
Be Wise Apps

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 Untertiteln
Nur 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

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

Eine Leiter der Konsistenzmodelle von linearisierbar oben bis Eventual unten, wobei die Kosten der Koordination sinken, je schwächer die Garantien werdenLinearisierbareine Kopie, EchtzeitfolgeSequenzielleine Folge; Programmfolge je ClientKausalUrsachen vor WirkungenSession GuaranteesRead-your-Writes, Monotonic ReadsEventualKonvergenz, wenn Schreiben stopptStarkSchwachleichter zudurchschauenmehr Koordinationhöhere Latenznicht verfügbarbei Partitionwenig Koordinationniedrige Latenzverfügbarbei Partition
Jede Stufe nach unten entfernt eine Garantie und etwas Koordination; die Session Guarantees sind Versprechen pro Client, die zwischen kausaler und einfacher Eventual Consistency liegen.

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

Bei einer Netzwerkpartition muss Replikat B die Antwort verweigern oder mit evtl. veralteten Daten antwortenClient 1Client 2Replikat A14C: verkauftReplikat B14C: freikauft 14C14C frei?PartitionKonsistenz wählen (CP)B verweigert/Timeout:„später erneut“Verfügbarkeit wählen (AP)B antwortet „frei“:veraltet; ggf. doppelt verkauftB muss wählen
Replikat B kann nicht erfahren, dass Platz 14C gerade auf Replikat A verkauft wurde, daher muss es entweder die Antwort verweigern oder riskieren, den Platz doppelt zu verkaufen.

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

Bei drei Replikaten müssen sich ein Schreiben mit zwei Acks und ein Lesen von zweien in mind. einem überschneidenN = 3 Replikate, W = 2, R = 2WriterPreis = 12LeserReplikat 1v2: 12Replikat 2v2: 12Replikat 3v1: 10 (hinkt)W = 2 AcksR = 2 AntwortenReplikat 2 in beiden Mengen:der Leser sieht v2, liefert 12
Der Schreibvorgang wurde von den Replikaten 1 und 2 bestätigt; der Lesevorgang fragt die Replikate 2 und 3; die Überschneidung bei Replikat 2 bedeutet, dass die neueste Version in der Lesemenge liegt.

Ausgearbeitetes Beispiel

Ausgearbeitetes Beispiel: N, W und R für einen Speicher mit Speisekartenpreisen wählen

Die Essenslieferplattform speichert Speisekartenpreise in einem leaderlosen Speicher mit N = 3 Replikaten, eines pro Availability Zone. Jedes Replikat antwortet innerhalb seiner Zone in etwa 2 ms und aus einer anderen Zone in etwa 5 ms. Der Quorum-Client wartet auf die W-t- (bzw. R-t-)schnellste Antwort.

W = 2, R = 2 (R + W = 4 > 3)Überschneidung garantiert. Lese- und Schreibvorgänge warten jeweils auf das zweitschnellste Replikat (etwa 5 ms). Beide gelingen auch bei Ausfall einer Zone. Ein gängiger, ausgewogener Standard.
W = 3, R = 1 (4 > 3)Überschneidung garantiert, und Lesevorgänge sind schnell (nächstes Replikat, etwa 2 ms), aber jeder Schreibvorgang scheitert, wenn auch nur ein Replikat ausgefallen ist: Die Schreibverfügbarkeit ist das Produkt dreier Verfügbarkeiten. Geeignet für Daten, die selten geschrieben und ständig gelesen werden, sofern gescheiterte Schreibvorgänge später wiederholt werden können.
W = 1, R = 3 (4 > 3)Schreibvorgänge sind schnell und überstehen zwei Ausfälle; jeder Lesevorgang muss alle drei Replikate erreichen, daher scheitern Lesevorgänge, wenn irgendeine Zone nicht erreichbar ist. Selten eine gute Abwägung.
W = 1, R = 1 (2, nicht > 3)Am schnellsten und am verfügbarsten, aber ein Lesevorgang kann den neuesten Schreibvorgang komplett verpassen. Akzeptabel für einen Beliebtheitszähler; nicht für einen Preis, der dem Kunden berechnet wird.
N = 5, W = 3, R = 3 (6 > 5)Überschneidung garantiert bei Toleranz von zwei ausgefallenen Replikaten für Lese- und Schreibvorgänge, um den Preis von mehr Speicher und etwas langsameren Quoren.

Allgemeine Regel: Mit R + W > N tolerieren Schreibvorgänge N − W Ausfälle und Lesevorgänge N − R Ausfälle.

Die Überschneidung liefert aktuelle Lesevorgänge nur für bestätigte Schreibvorgänge und nur mit zuverlässiger Versionierung; lesen Sie die Einschränkungen oben, bevor Sie sich bei Invarianten wie Lagerbeständen auf Quoren verlassen.

Für Preise wählte die Plattform W = 2, R = 2 und berechnete Kunden den Preis, der beim Bezahlvorgang in der Bestellung gespeichert wurde, sodass ein veralteter Speisekarten-Lesevorgang den berechneten Betrag nie ändern konnte.

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)

DatenbankTypisches StandardverhaltenEinstellungen, die die Konsistenz stärkenWorauf zu achten ist
PostgreSQL mit Streaming ReplicationEin 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-SetSchreibvorgä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 CassandraDas 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 DynamoDBLesevorgä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

AnwendungsfallKosten eines veralteten oder umgeordneten LesevorgangsSinnvolle GarantieTypischer Mechanismus
Kontostand vor einer AbhebungÜberziehung über das Limit; Geld verlorenLinearisierbar (und serialisierbare Transaktionen)Ein einzelner Leader für das Konto, synchrone Replikation oder Konsens
Letzter Platz oder letztes Ticket beim VorverkaufsstartEinen Platz doppelt verkaufen; Erstattungen und verärgerte KundenLinearisierbar pro PlatzBedingter Schreibvorgang (Compare-and-Set) auf dem Platz-Datensatz
Eindeutiger Benutzername bei der RegistrierungZwei Konten mit demselben NamenLinearisierbar bei der EindeutigkeitsprüfungUnique Constraint in einer Datenbank oder eine konsensgestützte Registry
Eigene Lieferadresse des Kunden nach der BearbeitungEssen geht an die alte AdresseRead-your-WritesNach einem Schreibvorgang vom Leader lesen oder ein Versions-Token in der Session
Dem Kunden angezeigter BestellstatusStatus scheint zurückzuspringen; Verwirrung und Support-AnrufeMonotonic Reads plus Read-your-WritesSticky Routing zu einem Replikat oder Versions-Tokens
Restaurant-Chat mit dem KundenEine Antwort erscheint vor ihrer FrageKausalKausal konsistenter Speicher oder Reihenfolge pro Unterhaltung
WarenkorbEin entfernter Artikel taucht wieder auf; leicht ärgerlichEventual, mit ZusammenführungHinzufügungen immer annehmen; Versionen zusammenführen (das Beispiel aus dem Dynamo-Paper)
Like-Zähler oder RestaurantbewertungZahl weicht ein paar Sekunden lang um einige abEventualAsynchrone Replikation, Zähler oder CRDTs
Kurierstandort auf der KartePunkt ein paar Sekunden hinterherEventual, neuester Wert gewinntSchreibvorgä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.

Weiter · 6.7SagasWie man Daten konsistent hält, wenn eine Geschäftsaktion mehrere Services umfasst: Two-Phase Commit und warum man es meidet, Sagas mit Kompensationen, Choreografie und Orchestrierung, Gegenmaßnahmen zur Isolation, die Transactional Outbox und idempotente Empfänger.Weiter →

Quellen und weiterführende Literatur

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?“