Zurück zum Blog
Architektur
FortgeschrittenFürBackend EngineersPlatform EngineersSoftware Architects
7 min

Das CAP-Theorem, ehrlich erklärt: Was es wirklich für die Datenbankwahl bedeutet

Das CAP-Theorem ist nicht 'zwei von drei aussuchen'. Netzwerkpartitionen sind keine Wahl, also lautet die echte Entscheidung: Konsistenz oder Verfügbarkeit während eines Netzwerksplits — plus PACELC für die 99 % der Zeit, in denen nichts kaputt ist.

cap-theoremdistributed-systemsconsistencyavailabilitydatabase-selectionpacelcsystem-design
Inhalt

Jeder Datenbankvergleich landet irgendwann beim selben Dreieck. Consistency, Availability, Partition tolerance — wähle zwei. Es sieht sauber aus, passt auf eine Folie und ist genau auf die Art falsch, die dich still einen Ausfall kostet.

Das CAP-Theorem ist real und es ist nützlich. Aber die „Zwei-von-drei“-Fassung hat eine ganze Generation von System-Design-Interviews in die Irre geführt. Partitionen sind keine Eigenschaft, die du dir aussuchst. Sie sind das, was das Netzwerk an einem Dienstagnachmittag mit dir macht. Wer das begriffen hat, für den ist CAP kein Party-Trick mehr, sondern ein echtes Werkzeug für die Frage, wo die Daten leben.

Consistency, Availability, Partition tolerance — das Dreieck, das jeder zeichnet, und die Wahl, zu der es wirklich zwingt.

Das ist die ehrliche Version: was die drei Buchstaben wirklich bedeuten, die eine Entscheidung, zu der CAP zwingt, und wie du sie in eine begründbare Datenbankwahl übersetzt.

Drei Wörter, die nicht das bedeuten, was du denkst

Vor dem Trade-off die Definitionen — denn die meisten CAP-Streits sind in Wahrheit Vokabelstreits.

  • Konsistenz heißt hier Linearisierbarkeit: Jeder Lesezugriff liefert den letzten Schreibzugriff, als gäbe es nur eine einzige Kopie der Daten. Das ist nicht das „C“ aus ACID. Gleicher Buchstabe, anderes Universum.
  • Verfügbarkeit bedeutet, dass jede Anfrage an einen nicht-ausgefallenen Knoten eine (fehlerfreie) Antwort bekommt. Nicht „schnell“, nicht „meistens erreichbar“ — eine echte Antwort, jedes Mal.
  • Partitionstoleranz bedeutet, dass das System weiterarbeitet, selbst wenn das Netzwerk Nachrichten zwischen Knoten verwirft oder verzögert.

Lies das noch einmal, und der Mythos zerfällt von selbst. Eine verteilte Datenbank läuft über ein Netzwerk. Netzwerke partitionieren — ein Switch stirbt, ein Kabel wird gekappt, eine Cloud-AZ geht dunkel. Du kannst das nicht nicht tolerieren. P steht nicht zur Wahl.

Die einzige Wahl, zu der CAP wirklich zwingt

Wenn Partitionstoleranz also Pflicht ist — worum geht es im Theorem dann wirklich? Um einen einzigen, scharfen Moment.

Wenn eine Partition deinen Cluster in zwei Gruppen spaltet, die nicht mehr miteinander reden können, steht jede Seite vor einer Frage zu einem Datum, das sie nicht vollständig verifizieren kann:

  • Konsistent bleiben (CP): nicht antworten, solange nicht sicher ist, dass der letzte Stand vorliegt. Die Minderheitsseite lehnt Schreibzugriffe ab, vielleicht auch Lesezugriffe, und wartet, bis das Netz heilt. Korrekt, aber vorübergehend nicht verfügbar.
  • Verfügbar bleiben (AP): trotzdem antworten, mit dem, was dieses Replikat weiß, und die Divergenz später abgleichen. Immer ansprechbar, aber möglicherweise mit veralteten Daten.

Das ist das ganze Theorem. Nicht „zwei von drei“ — C oder A, und nur, solange eine Partition dauert. Ist das Netz gesund, hast du beides. CAP beschreibt das Verhalten eines Systems unter einem Fehler, nicht seine dauerhafte Persönlichkeit.

Während einer Partition muss eine Seite wählen: blockieren, um korrekt zu bleiben (CP), oder mit veralteten Daten antworten, um verfügbar zu bleiben (AP).

Eine Bank, die Geld bewegt, wählt CP: ein Double-Spend ist schlimmer als eine Fehlermeldung. Ein Social-Feed wählt AP: ein leicht veralteter Like-Zähler ist unsichtbar, ein Spinner nicht.

Der Teil, den CAP auslässt: die anderen 99 % der Zeit

Hier ist die Falle, die „zwei von drei“ komplett verdeckt. Partitionen sind selten. Ein gut betriebener Cluster verbringt den überwältigenden Teil seines Lebens voll verbunden. CAP sagt über diese Zeit nichts — und in dieser Zeit lebst du tatsächlich.

Deshalb ist PACELC so wichtig. Es erweitert CAP um den Normalfall:

Gibt es eine Partition, wähle Availability oder Consistency — Else (L), wenn alles gesund ist, wähle Latenz oder Consistency.

Diese zweite Klausel ist die Entscheidung, die du bei jeder Anfrage triffst. Starke Konsistenz ist nicht gratis, selbst wenn das Netz perfekt ist: Zu bestätigen, dass ein Lesezugriff den letzten Schreibzugriff widerspiegelt, heißt über Replikate hinweg zu koordinieren, und Koordination kostet Millisekunden. Lockere die Konsistenz, und Lesezugriffe werden schneller; ziehe sie an, und sie werden langsamer, aber wahrer.

Der echte, tägliche Trade-off ist also nicht das dramatische Ausfallszenario. Er lautet: Wie viel Latenz zahlst du auf dem Happy Path, um sicher zu sein, dass deine Daten aktuell sind? Diese Frage feuert millionenfach am Tag. Die Partitionsfrage feuert einmal im Quartal.

Es ist pro Operation, nicht pro Datenbank

Das andere, was das Dreieck falsch macht: Konsistenz und Verfügbarkeit sind keine festen Eigenschaften, die einer Datenbank aufgeprägt sind. Es sind Entscheidungen, die du pro Operation triffst.

Die meisten modernen verteilten Stores machen das direkt über Quoren zugänglich. Bei N Replikaten wartet ein Lesezugriff auf R Antworten und ein Schreibzugriff auf W Bestätigungen. Setze R + W > N, und jeder Lesezugriff sieht garantiert den letzten bestätigten Schreibzugriff — starke Konsistenz, höhere Latenz. Setze sie niedriger, und du tauschst Aktualität gegen Tempo.

-- Cassandra: den Trade-off pro Statement wählen.
-- Stark: Lese- und Schreibquoren überlappen (R + W > N).
CONSISTENCY QUORUM;
INSERT INTO ledger (acct, delta) VALUES ('A42', -100);
-- Schnell und verfügbar: vom nächsten Replikat antworten, Veraltung akzeptieren.
CONSISTENCY ONE;
SELECT likes FROM post WHERE id = 'p_9f3';

Derselbe Cluster ist CP für den Ledger-Schreibzugriff und AP für den Like-Zähler. Du wählst nicht die Philosophie einer Datenbank; du wählst die Garantie, die diese konkrete Anfrage braucht. DynamoDB hat sein ConsistentRead-Flag, Cosmos DB liefert fünf Konsistenzstufen, MongoDB kennt Read/Write Concerns. Das Label auf der Verpackung ist ein Default, kein Schicksal.

Wo landen die Datenbanken also wirklich?

Defaults zählen trotzdem, denn sie sind das, was du bekommst, bevor du irgendetwas justierst. Grob:

  • Tendenz CP — Google Spanner, HBase, etcd, ZooKeeper, MongoDB (Default Majority). Sie lehnen während einer Partition ab oder blockieren, um Korrektheit zu schützen. Spanner ist der interessante Fall: CP by Design, steckt aber enorme Ingenieursarbeit — TrueTime, redundante private Vernetzung — hinein, um Partitionen so selten zu machen, dass es sich hochverfügbar anfühlt.
  • Tendenz AP — Cassandra, DynamoDB, Riak, CouchDB. Sie antworten während eines Splits weiter und gleichen danach ab, mit Mechanismen wie Last-Write-Wins oder CRDTs.

Eine grobe Karte: CP-Stores blockieren, um korrekt zu bleiben, AP-Stores antworten, um verfügbar zu bleiben, und PACELC ergänzt die alltägliche Latenzachse.

Und der Mythos, der begraben gehört: Es gibt keine sinnvolle „CA“-Datenbank. „CA“ beschreibt nur einen einzelnen Knoten ohne Netzwerk, das partitionieren könnte — eine einsame Postgres-Instanz. In dem Moment, in dem du sie replizierst oder shardest, steht Postgres vor genau derselben CP-gegen-AP-Wahl wie alles andere. Wenn ein Design-Dokument etwas „CA“ nennt, liest da jemand das Dreieck, nicht das System.

Wie man tatsächlich wählt

Lass das Dreieck weg. Stell drei Fragen, in dieser Reihenfolge.

  1. Welche Invariante darf niemals brechen? Wenn zwei Nutzer denselben Kontostand ausgeben können oder zwei Bestellungen die letzte Einheit im Lager beanspruchen, brauchst du auf diesem Pfad CP. Korrektheit zuerst; eine abgelehnte Anfrage ist wiederholbar, eine korrumpierte Invariante oft nicht.
  2. Was verträgt es, leicht veraltet zu sein? Warenkörbe, Feeds, Aufrufzähler, Empfehlungen, Sessions, Telemetrie — ein paar Sekunden Rückstand sind für Nutzer unsichtbar und die Verfügbarkeit und das Tempo wert. Das ist AP, und das ist der Großteil deines Traffics.
  3. Welche Latenz verträgt der Happy Path? Das ist die PACELC-Frage. Wenn ein Lesezugriff stark konsistent und p99 unter 10 ms sein muss, verlangst du Koordination unter Zeitdruck — plane sie ein oder lockere eine der beiden Anforderungen.

Dann entwirf die Partition explizit, statt zu hoffen, dass sie nie kommt. Mach Schreibzugriffe idempotent, damit ein Retry nach dem Heilen sicher ist. Nutze Fencing-Tokens, damit ein veralteter Leader nicht handeln kann. Setze Geld und Identität hinter Quorum-Lesezugriffe; lass den Feed vom nächsten Replikat bedienen. Derselbe Cluster, unterschiedliche Garantien, mit Absicht gewählt.

Die Wahl des Stores ist die eine Entscheidung; den Traffic dorthin gesund zu halten die andere. Zur Messaging-Seite eines resilienten Systems siehe Pub/Sub oder Eventarc? Event-Driven auf GCP ohne Spaghetti und Eine Million Benachrichtigungen versenden, ohne abzustürzen.

Die Regel fürs Feld

Das CAP-Theorem ist kein Dreieck, aus dem du zwei Ecken aussuchst. Partitionen sind garantiert, also ist Partitionstoleranz fix. Die echte Wahl ist ein Moment — blockierst du während eines Splits, um korrekt zu bleiben (CP), oder antwortest du, um verfügbar zu bleiben (AP)? — und PACELC deckt die anderen 99 % der Zeit ab, in denen du bei jeder Anfrage Latenz gegen Konsistenz tauschst. Entscheide es pro Operation, nicht pro Datenbank: schütze die Invarianten, die nicht brechen dürfen, lockere alles, was ein bisschen Veraltung verträgt, und entwirf die Partition mit Absicht. Tu das, und „welche Datenbank“ hört auf, ein Glaubenskrieg zu sein, und wird das, was es sein sollte — ein Trade-off, den du mit offenen Augen getroffen hast.

Häufig gestellte Fragen

Was ist das CAP-Theorem einfach erklärt?

Das CAP-Theorem besagt: Wenn eine Netzwerkpartition ein verteiltes System in zwei Hälften spaltet, kannst du nicht gleichzeitig Konsistenz (jeder Lesezugriff sieht den letzten Schreibzugriff) und Verfügbarkeit (jeder Knoten antwortet weiter) haben. Eines musst du opfern. Es bedeutet nicht 'zwei von drei aussuchen' — Partitionstoleranz ist nicht optional, weil Netzwerke nach eigenem Fahrplan ausfallen. Die einzige echte Wahl ist Konsistenz gegen Verfügbarkeit, während eine Partition andauert.

Heißt CAP, dass ich nur zwei der drei Eigenschaften wählen kann?

Nein — diese Deutung ist das häufigste Missverständnis. Ein verteiltes System, das über ein Netzwerk kommuniziert, muss Partitionen tolerieren, also ist P fix. Das Theorem beschreibt in Wahrheit einen einzigen Moment: Antwortest du während einer Partition weiter mit womöglich veralteten Daten (AP) oder verweigerst du die Antwort, um korrekt zu bleiben (CP)? Die übrige Zeit, wenn das Netz gesund ist, hast du beides — C und A.

Was ist der Unterschied zwischen einer CP- und einer AP-Datenbank?

Während einer Netzwerkpartition wählt ein CP-System Korrektheit: Knoten, die den letzten Stand nicht bestätigen können, lehnen Lese- oder Schreibzugriffe ab, statt veraltete Daten zu liefern. Ein AP-System entscheidet sich, weiter zu antworten, und nimmt in Kauf, dass manche Replikate hinterherhinken und später abgeglichen werden. HBase, Spanner und etcd tendieren zu CP; Cassandra und DynamoDB zu AP. Viele moderne Datenbanken lassen das per Operation über Quorum-Einstellungen justieren.

Was ist PACELC und wie erweitert es CAP?

PACELC erweitert CAP um den Normalfall. Es liest sich: Gibt es eine Partition (P), wähle Verfügbarkeit oder Konsistenz (A/C); sonst (Else, L), wenn das System gesund läuft, wähle Latenz oder Konsistenz (L/C). Das ist wichtig, weil Partitionen selten sind, der Latenz-gegen-Konsistenz-Trade-off aber bei jeder einzelnen Anfrage anfällt. PACELC beschreibt die Entscheidung, die du tatsächlich den ganzen Tag triffst, nicht nur beim Ausfall.

Ist PostgreSQL eine CA-Datenbank?

In keinem sinnvollen Sinn. Das Label 'CA' beschreibt nur ein Single-Node-System ohne Netzwerk zwischen Replikaten — und ein einzelner Knoten hat nichts zu partitionieren, also greift CAP schlicht nicht. Sobald du Replikation oder Sharding hinzufügst, steht Postgres vor derselben CP-gegen-AP-Wahl wie alle anderen. Behandle 'CA' als Zeichen dafür, dass jemand das Theorem falsch liest, nicht als Kategorie, für die man entwirft.

Aus der Community

Diskussion im Fediverse

Antworten von Mastodon und Bluesky — direkt aus dem offenen Netz, ohne Tracking.

Antworten werden geladen …

ENDE