8 Min

Distributed SQL: Wann Sie Spanner, CockroachDB und YugabyteDB einsetzen sollten

Erfahren Sie, wann Distributed SQL seinen Aufwand rechtfertigt, wie sich Spanner, CockroachDB und YugabyteDB unterscheiden und wie Sie Multi-Region-Workloads sicher planen.

Distributed SQL: Wann Sie Spanner, CockroachDB und YugabyteDB einsetzen sollten

Was Distributed SQL bedeutet

Distributed SQL ist eine relationale Datenbankarchitektur, die Daten und Transaktionsverarbeitung auf mehrere Maschinen verteilt, Anwendungen aber eine logische SQL-Datenbank bietet. Sie behält Tabellen, Joins, Indizes, Constraints und ACID-Transaktionen bei und ergänzt automatische Partitionierung, Replikation und Fehlerbehebung.

Ein System gehört in der Regel zu dieser Kategorie, wenn es diese Eigenschaften vereint:

  • Relationales Schema und SQL-Abfrageschnittstelle
  • Horizontale Skalierung über Datenbankknoten
  • Transaktionale Konsistenz über Partitionen hinweg
  • Automatische Replikation und Failover
  • Koordinierter Betrieb als eine logische Datenbank

Die Definition ist wichtig, denn eine Datenbank wird nicht allein dadurch zu Distributed SQL, dass PostgreSQL oder MySQL Read Replicas erhält. Ein Primary mit Replikaten leitet Writes weiterhin über einen Hauptserver. Sharding in der Anwendung verteilt Writes, zwingt die Anwendung aber dazu, den Speicherort von Datensätzen und das Verhalten über Shards hinweg zu bestimmen. Distributed SQL verlagert einen großen Teil dieser Verantwortung in die Datenbank.

Die Position zwischen klassischem RDBMS und NoSQL

Distributed SQL verbindet das relationale Programmiermodell eines klassischen RDBMS mit dem Scale-out-Design verteilter Datenspeicher. Herkömmliche PostgreSQL- und MySQL-Deployments funktionieren gut, solange eine Primary-Instanz die Write-Last bewältigt und ein regionaler Ausfall keine fortlaufenden Writes an einem anderen Ort verlangt. Read Replicas, Caching, Connection Pooling und bessere Indizes können dieses Modell über Jahre tragen.

Viele NoSQL-Datenbanken vereinfachen die Verteilung, indem sie Joins, Transaktionen oder Konsistenzgarantien begrenzen. Das bleibt sinnvoll für Workloads wie große Event-Streams, entbehrliche Caches und Datensätze, die selten an Transaktionen mit mehreren Zeilen beteiligt sind. Ein relationaler Cluster übernimmt mehr Koordination, weil Anwendungen erwarten, dass Constraints und Transaktionen auch nach der Aufteilung von Daten auf Knoten gültig bleiben.

Der praktische Unterschied liegt darin, wer die Komplexität trägt. Beim manuellen Sharding implementieren Anwendungsteams Routing, verteilen Daten neu, koordinieren Schemaänderungen und behandeln Vorgänge über mehrere Shards. Bei Distributed SQL liefert die Datenbank diese Mechanismen, auch wenn Entwickler Schemas und Abfragen weiterhin für ein vernetztes System gestalten müssen.

Die Probleme, für die es gedacht ist

Distributed SQL ist für Anwendungen gedacht, deren Anforderungen an Verfügbarkeit, geografische Platzierung oder wachsende Write-Last über eine Architektur mit einem Primary hinausgehen. Typische Beispiele sind ein globaler SaaS-Dienst, ein Reservierungssystem, das nicht überbuchen darf, und ein Finanz-Ledger, dessen Invarianten Knotenausfälle überstehen müssen.

Es kann Sharding auf Anwendungsebene überflüssig machen und die Abhängigkeit von einem einzigen Write-Standort verringern. Außerdem kann es Daten nahe bei Nutzern oder in zugelassenen Rechtsräumen platzieren. Diese Vorteile haben ihren Preis: mehr Replikate, mehr Netzwerkverkehr, mehr Koordination und Fehlerbilder, die es auf einem Server nicht gibt.

Eine klassische verwaltete relationale Datenbank bleibt die bessere Standardwahl, wenn der Workload bequem in eine Region passt. Distributed SQL rechtfertigt seinen Aufwand, wenn eigenes Sharding, regionales Failover oder geografische Datenkontrollen sonst zu einem großen eigenständigen Engineering-System würden.

Wie Distributed SQL intern funktioniert

Distributed SQL teilt Daten in replizierte Partitionen auf und stimmt Änderungen über Konsens- und verteilte Transaktionsprotokolle ab. Die Datenbank verbirgt viel davon hinter SQL, doch das Verhalten prägt weiterhin Latenz, Durchsatz, Schemadesign und Reaktion auf Incidents.

Partitionen bestimmen den Speicherort von Datensätzen

Ein Cluster teilt seine logischen Tabellen in kleinere Einheiten auf, die sich unabhängig zwischen Knoten bewegen können. Spanner bezeichnet diese Einheiten meist als Splits, CockroachDB verwendet Ranges und YugabyteDB Tablets. Jede Einheit deckt einen Teil des Schlüsselraums einer Tabelle oder eines Index ab.

Partitionsgrenzen können Bereichen, Hashes oder ausdrücklichen geografischen Regeln folgen. Ein nach Kundenkennung geordneter Bereich erleichtert das Scannen zusammengehöriger Datensätze, doch eine monoton steigende Kennung kann neue Writes auf eine Partition lenken. Hash-Verteilung verteilt Writes gleichmäßiger, erschwert aber geordnete Scans oder die Platzierung von Mandanten. Viele Produktionsschemas verbinden eine Mandantenkennung mit einem weiteren Wert, damit zusammengehörige Daten erreichbar bleiben, ohne jeden Write an einem Ort zu bündeln.

Sekundärindizes benötigen eigenen verteilten Speicher. Ein Write in eine Zeile kann daher die Basistabelle und mehrere Indexeinträge auf unterschiedlichen Partitionen aktualisieren. Ein Index, der auf einem einzelnen Server günstig war, kann in einem Cluster zusätzliche Konsensarbeit und Netzwerkverkehr verursachen.

Replikation und Konsens schützen jede Partition

Jede Partition besitzt normalerweise mehrere Replikate, und eine Konsensgruppe entscheidet über die akzeptierte Reihenfolge von Änderungen. CockroachDB und YugabyteDB verwenden Raft-basierte Replikation. Spanner verwendet Paxos-basierte Replikation zusammen mit seiner Zeitinfrastruktur.

Ein Leader oder Leaseholder koordiniert Writes für eine Replikatgruppe. Das System zeichnet eine Änderung auf genügend Replikaten auf, um ein Quorum zu bilden, bevor es sie als committed behandelt. Fällt ein Knoten aus, können die verbleibenden Mitglieder einen anderen Koordinator wählen oder bestimmen, solange ein Quorum verfügbar bleibt.

Ein Quorum ist eine mathematische Voraussetzung, keine Zusage, dass jeder Ausfall folgenlos bleibt. Eine Gruppe mit drei Replikaten kann normalerweise ein nicht verfügbares Replikat verkraften. Fallen zwei Mitglieder aus, kann die verbleibende Kopie Writes nicht sicher akzeptieren, weil sie nicht beweisen kann, dass nicht anderswo eine andere Mehrheit fortgeschritten ist. Die Verteilung über Fehlerdomänen ist ebenso wichtig wie die Anzahl der Replikate.

Verteilte Transaktionen koordinieren mehrere Partitionen

Eine Transaktion, die nur eine Partition berührt, kann oft mit wenig Koordination enden. Eine Transaktion über mehrere Partitionen braucht eine gemeinsame Commit-Entscheidung, damit jeder Beteiligte entweder seine Writes anwendet oder sie verwirft.

Das genaue Protokoll unterscheidet sich je nach Produkt, umfasst aber meist das Lesen oder Sperren relevanter Versionen, die Validierung paralleler Änderungen, die Replikation von Intents oder vorläufigen Datensätzen und den Abschluss des Commits. Lange Transaktionen vergrößern das Zeitfenster für Konflikte. Große Batches können viele Konsensgruppen einbeziehen und Latenzspitzen erzeugen, auch wenn einzelne Statements einfach wirken.

Darum ist netzwerkbewusstes Transaktionsdesign wichtig. Gruppieren Sie zusammengehörige Zeilen unter passenden Partitionspräfixen, wenn die Datenbank diese Strategie unterstützt. Halten Sie Transaktionen kurz, warten Sie nicht auf externe Dienste, solange eine Transaktion offen ist, und laden Sie nicht Tausende unabhängige Datensätze in eine atomare Einheit, ohne die Auswirkungen zu messen.

Zeit und Reihenfolge brauchen ausdrückliche Mechanismen

Verteilte Knoten haben keine perfekt synchronisierte Wanduhr. Deshalb braucht jedes Produkt eine Methode, um Transaktionen zu ordnen. Spanner verwendet TrueTime-Unsicherheitsgrenzen und Commit-Wait für externe Konsistenz. Andere Systeme können physische Uhren mit logischen Komponenten, Abhängigkeitsverfolgung und Transaktionsprotokollen kombinieren.

Die Taktkoordination beeinflusst serialisierbare Ausführung, Follower Reads und Snapshots. Anwendungen sollten Transaktionszeitstempel der Datenbank nutzen, statt anzunehmen, dass Zeitstempel getrennter Anwendungsserver eine verlässliche globale Reihenfolge schaffen.

Lokalität steuert den Netzwerkpfad

Die Lokalitätskonfiguration entscheidet, wo Replikate liegen und welche Region die Writes eines Datensatzes koordiniert. Reads können schnell sein, wenn sich ein geeignetes Replikat in der Nähe des Aufrufers befindet. Ein stark geordneter Write muss dennoch die für ein Quorum nötigen Replikate erreichen, daher spiegelt seine Latenz die gewählte Topologie wider.

Gute Platzierung folgt dem Workload, nicht einem Unternehmensdiagramm. Kommen die meisten Writes eines EU-Mandanten aus Europa, vermeidet ein dortiger Write-Koordinator bereits zu Beginn jeder Transaktion einen interkontinentalen Weg. Ein global geteilter Datensatz, etwa ein Zähler, den alle Regionen aktualisieren, kann nicht für jeden Writer lokal sein und kann zum Konfliktpunkt werden.

Wann Distributed SQL die richtige Wahl ist

Distributed SQL ist sinnvoll, wenn geografische Resilienz, horizontale Write-Kapazität oder Korrektheit über Partitionen hinweg die dauerhaften Koordinationskosten rechtfertigen. Ein großes Unternehmen braucht es nicht automatisch, und ein kleines Produkt kann es benötigen, wenn sein Geschäftsversprechen strenge regionale Verfügbarkeit einschließt.

Bedingungen, die eine Bewertung rechtfertigen

Eine ernsthafte Bewertung ist angebracht, wenn mehrere dieser Bedingungen erfüllt sind:

  • Der Dienst muss einen Zonen- oder Regionsausfall überstehen
  • Die Write-Nachfrage nähert sich der praktischen Grenze einer Primary-Datenbank
  • Manuelles Sharding würde viel Entwicklungszeit in der Anwendung binden
  • Transaktionen müssen über Knoten oder Standorte hinweg korrekt bleiben
  • Datensätze brauchen durchsetzbare geografische Platzierung

Diese Bedingungen sollten mit Zahlen belegt sein. Definieren Sie erforderliches Recovery Time Objective, Recovery Point Objective, Transaktionslatenz, maximale Write-Rate und Fehlerdomänen. Ein vager Wunsch nach globaler Skalierung reicht nicht für die Wahl einer Architektur.

Regionale Nutzer allein sind kein entscheidender Grund. Eine inhaltslastige Anwendung kann Webserver und Caches nahe bei Nutzern platzieren und die Datenbank in einer Region behalten. Read Replicas können regionales Browsen ermöglichen, wenn leicht veraltete Ergebnisse akzeptabel sind. Der Fall wird stärker, wenn Nutzer an mehreren Standorten latenzarme Writes auf zusammenhängende Daten ausführen müssen.

Bedingungen, die für eine einfachere Datenbank sprechen

Ein klassischer relationaler Dienst ist meist vorzuziehen, wenn der Traffic moderat ist, Writes aus einer Region kommen und die Wiederherstellung eine geplante Datenbank-Promotion erlauben kann. Er bietet ausgereifte Tools, breite Kompatibilität mit Erweiterungen, vertrautes Debugging und geringere Infrastrukturkosten.

Auch enge Latenzanforderungen können für einen regionalen Primary sprechen. Ein lokaler dauerhafter Write kann deutlich schneller enden als ein Quorum-Write über weit entfernte Regionen. Analyselastige Systeme sollten operative Transaktionen meist von langen Scans trennen, statt zu erwarten, dass derselbe Cluster beides hervorragend erledigt.

Die Teamkapazität zählt. Verwaltete Dienste reduzieren Arbeit an Hardware, Patches und Control-Plane-Betrieb, beseitigen aber keine Schema-Konflikte, Transaktionswiederholungen, Abfrageplanung, Kapazitätsmanagement oder Incident-Behandlung in der Anwendung. Hat ein Team keine Zeit, Ausfallverhalten zu testen, kann eine verteilte Datenbank das Risiko erhöhen.

Eine Entscheidungsschwelle anhand der Alternativen

Die überzeugendste Begründung entsteht, wenn die Alternative bereits kompliziert ist. Wenn Entwickler Mandantenrouting, Shard-Maps, Regeln für Transaktionen über Shards, regionale Promotion-Abläufe und eigene Migrationstools bauen müssten, verdient eine Datenbank mit diesen Funktionen eine genaue Bewertung.

Besteht die Alternative aus einer verwalteten PostgreSQL-Instanz mit Read Replica und getesteten Backups, braucht eine Migration klare Belege. Benchmarken Sie zunächst das bestehende System. CPU-Sättigung kann in Wahrheit aus einer ineffizienten Abfrage, schlechtem Connection Management, zu vielen Indizes oder einem fehlenden Cache entstehen, nicht aus dem Bedarf an horizontalen Writes.

Konsistenz, Verfügbarkeit und Latenz

Distributed SQL bewahrt bei Ausfällen meist transaktionale Konsistenz, indem es Vorgänge verweigert, die das erforderliche Quorum nicht erreichen können. Das schützt den committed Zustand, bedeutet aber, dass manche Anfragen während einer Netzwerkpartition fehlschlagen oder warten können.

CAP beschreibt Verhalten bei Ausfällen

Das CAP-Theorem gilt, wenn die Kommunikation zwischen Teilen des Clusters unterbrochen ist. Für die betroffenen Daten kann ein System nicht gleichzeitig linearisierbare Konsistenz und erfolgreiche Antworten von jeder isolierten Seite garantieren. Eine konsistenzorientierte Datenbank lässt die Seite mit Quorum weiterarbeiten und verweigert unsichere Writes anderswo.

CAP erklärt nicht die Latenz im Normalbetrieb. Auch wenn jede Verbindung funktioniert, müssen Replikate kommunizieren. Die umfassendere technische Entscheidung umfasst das Verhalten während einer Partition und das Maß an Koordination, das die Anwendung im gesunden Betrieb akzeptiert.

Eine Anwendung muss nicht verfügbare Ergebnisse ausdrücklich behandeln. Timeouts, wiederholbare Transaktionsfehler und der vorübergehende Verlust einer Write-Region sind normale Möglichkeiten. Erfolg aus beiden isolierten Regionen wäre für einen Saldo oder eine Reservierung schlimmer, weil die spätere Abstimmung möglicherweise keine gültige automatische Lösung hätte.

Starke Reads und bewusst veraltete Reads unterscheiden sich

Ein starker Read sieht einen Datenbankzustand, der mit der angeforderten Ordnungszusage übereinstimmt. Manche Produkte bieten außerdem Follower Reads oder Reads mit begrenzter Veraltung an. Sie tauschen Aktualität gegen geringere Latenz und weniger Arbeit beim Write-Koordinator.

Diese Entscheidung sollte vom gelesenen Feld abhängen. Eine Produktbeschreibung kann oft ein leicht älteres Replikat tolerieren. Ein gerade geändertes Passwort, der aktuelle Kontostand oder der verbleibende Bestand sollte einen passenden starken oder sitzungskonsistenten Pfad nutzen. Anwendungen sollten nicht aus Geschwindigkeitsgründen jeden Read als veraltet markieren und Korrektheit dann im Service-Code nachbauen.

Read-your-writes-Verhalten muss mit dem tatsächlichen Treiber und der Routing-Schicht getestet werden. Nach einem Update kann die nächste Anfrage einen anderen Anwendungsserver oder Datenbankendpunkt erreichen. Sitzungstoken, Transaktionsgrenzen oder eine Einstellung für starke Reads können nötig sein, damit der Nutzer die akzeptierte Änderung sieht.

Isolation steuert parallele Ergebnisse

Die Transaktionsisolation bestimmt, welche Anomalien parallele Transaktionen erzeugen können. Serialisierbare Isolation soll abgeschlossene Transaktionen so erscheinen lassen, als wären sie nacheinander gelaufen, auch wenn die Datenbank sie parallel ausführt.

Bei serialisierbarer Ausführung kann ein Beteiligter abgebrochen werden, wenn parallele Vorgänge nicht sicher geordnet werden können. Dieser Abbruch schützt vor einem falschen Ergebnis und ist kein Zeichen für Datenbankkorruption. Anwendungen brauchen begrenzte Wiederholungen um die gesamte Transaktion, einschließlich aller Reads, die ihre Writes beeinflusst haben.

Wiederholungen müssen außerhalb der Datenbank idempotent sein. Sendet Code eine E-Mail oder ruft einen Zahlungsanbieter auf, bevor die Transaktion sicher committed ist, kann eine Wiederholung den Nebeneffekt wiederholen. Speichern Sie ein Outbox-Ereignis in der Datenbanktransaktion, committen Sie es und lassen Sie eine getrennte Worker-Komponente die externe Aktion ausführen.

Distanz setzt eine Untergrenze für Write-Latenz

Eine regionsübergreifende Transaktion kann nicht schneller enden als die Nachrichten ihres Protokolls. Ein Round Trip von 80 Millisekunden zwischen Quorum-Mitgliedern kostet echte Zeit, bevor Abfrageausführung, Indexpflege, Anwendungsarbeit und Warteschlangen berücksichtigt werden.

Teuer sind oft mehrere aufeinanderfolgende Transaktionen innerhalb einer Nutzeraktion. Führt ein Checkout einen Order-Insert, eine Bestandsreservierung, ein Update des Zahlungsstatus und einen Audit-Write als vier blockierende Commits aus, summieren sich die Netzwerkkosten. Das Kombinieren von Datenbankänderungen mit demselben atomaren Ergebnis kann unnötige Round Trips vermeiden. Externe Zahlungsaufrufe sollten außerhalb einer offenen Transaktion bleiben.

Messen Sie Perzentil-Latenzen statt Durchschnittswerte. Leader-Wechsel, Konflikte, Speicherverzögerungen und Wiederholungen erscheinen am Rand der Verteilung. Ein Design, das sein Medianziel erreicht, aber beim 99. Perzentil während gewöhnlichen Rebalancings scheitert, kann dennoch sichtbare Nutzerfehler erzeugen.

Spanner, CockroachDB und YugabyteDB im Vergleich

Spanner, CockroachDB und YugabyteDB lösen ähnliche Verteilungsprobleme, unterscheiden sich aber bei Betriebsmodell, Kompatibilität, Transaktionsumsetzung und operativen Annahmen. Die Wahl sollte auf Tests des Anwendungsverhaltens beruhen, nicht auf dem gemeinsamen SQL-Label.

BereichGoogle SpannerCockroachDBYugabyteDB
Primäre SQL-SchnittstelleGoogleSQL oder PostgreSQL-DialektPostgreSQL-kompatibles SQL über das PostgreSQL-Wire-ProtocolYSQL für PostgreSQL-kompatibles SQL sowie YCQL für Cassandra-ähnlichen Zugriff
Grundlage der ReplikationPaxos-Gruppen mit TrueTime-basierter OrdnungRaft-Replikation über RangesRaft-Replikation über Tablets
Typische BereitstellungVerwaltete Google-Cloud-DatenbankVerwalteter Cloud-Dienst oder selbst verwaltetVerwalteter Cloud-Dienst oder selbst verwaltet
PortabilitätsrisikoDialekt- und plattformspezifisches VerhaltenLücken bei PostgreSQL-Funktionen, Erweiterungen und SemantikVersions- und Funktionsunterschiede zwischen YSQL und PostgreSQL
Natürlicher EvaluierungsfallGoogle-Cloud-Systeme mit globaler transaktionaler PlatzierungTeams, die PostgreSQL-orientiert und verteilt entwickeln wollenTeams, die PostgreSQL-orientierten Zugriff oder SQL- und Cassandra-ähnliche APIs benötigen

Spanner passt zu einer verwalteten Google-Cloud-Strategie

Spanner passt zu Organisationen, die eine verwaltete Google-Cloud-Datenbank nutzen und ihr Design an Dialekt, Topologie und Betriebsmodell ausrichten möchten. TrueTime unterstützt extern konsistente Transaktionen. Committete Transaktionen beachten damit innerhalb der dokumentierten Semantik die Echtzeitreihenfolge.

Der PostgreSQL-Dialekt kann Unterschiede in der SQL-Syntax verringern, bedeutet aber keine vollständige PostgreSQL-Gleichwertigkeit. Erweiterungen, Verwaltungsfunktionen, Systemkataloge, Datentypen, Treiber und ORM-Annahmen müssen weiterhin geprüft werden. Teams sollten jede Datenbankabhängigkeit erfassen, bevor sie eine bestehende Anwendung als portabel behandeln.

Spanner verdient besondere Aufmerksamkeit, wenn das gewünschte System bereits von Google-Cloud-Identität, Networking, Observability und regionalen Kontrollen abhängt. Das verwaltete Modell nimmt die Verwaltung von Datenbankknoten ab. Schemadesign, Abfrageoptimierung, Quotas, Kostenmanagement und die Wiederherstellung in der Anwendung bleiben jedoch Verantwortung des Kunden.

CockroachDB passt zu PostgreSQL-orientierten verteilten Anwendungen

CockroachDB passt zu Teams, die PostgreSQL-ähnlichen Anwendungszugriff wünschen und transaktionale Daten über Ranges verteilen. Standardmäßig verwendet es serialisierbare Isolation. Anwendungen müssen daher Transaktionen korrekt wiederholen, die wegen Konflikten oder Ordnungsproblemen abgelehnt werden.

Die Kompatibilität sollte auf Ebene von Migration, Treiber und ORM getestet werden. PostgreSQL-Erweiterungen und Spezialverhalten können fehlen oder anders sein. Abfragen, die auf Ausführungsplänen eines einzelnen Knotens beruhen, können sich ebenfalls anders verhalten, nachdem Tabellen und Indizes über Ranges verteilt wurden.

Range-Verschiebung und automatisches Rebalancing erleichtern Kapazitätsänderungen, doch eine ungeeignete Wahl des Primary Keys kann weiterhin Hot Ranges erzeugen. Multi-Region-Abstraktionen helfen, Tabellenlokalität auszudrücken. Entwickler müssen trotzdem entscheiden, welche Datensätze regional oder global sind und wo Writes koordiniert werden sollen.

YugabyteDB passt zu YSQL- und gemischten API-Anforderungen

YugabyteDB passt zu Anwendungen, die eine PostgreSQL-kompatible relationale Schnittstelle schätzen und von der getrennten Cassandra-kompatiblen API profitieren können. YSQL bietet relationale Tabellen und verteilte Transaktionen. YCQL folgt einem anderen Datenmodell und sollte nicht als weiterer Weg für jede YSQL-Operation betrachtet werden.

Die Speicherschicht verteilt Daten über Tablets. Tabellendesign, Tablet-Splitting, Indexplatzierung und Transaktionsumfang beeinflussen, wie sich die Arbeit über den Cluster verteilt. PostgreSQL-Anwendungen benötigen weiterhin Kompatibilitätstests für Erweiterungen, Funktionen, Tools und Planner-Verhalten.

Unterschiedliche Bereitstellungsoptionen können zu Infrastrukturvorgaben passen, die Kontrolle über die Platzierung verlangen. Bei Selbstverwaltung geht diese Kontrolle mit operativer Verantwortung auf den Kunden über: Upgrades, Reparaturabläufe, Kapazität, Observability, Zertifikate, Backups und Ausfalltests brauchen klare Verantwortliche.

Ein hilfreicher Produkttest nutzt Anwendungsdaten

Ein guter Vergleich führt denselben repräsentativen Workload mit jedem infrage kommenden Produkt aus. Testen Sie Schemaerstellung, Migrationen, vom ORM erzeugtes SQL, Transaktionswiederholungen, Backup-Wiederherstellung, Failover, Skalierungsereignisse und die Abfragen mit dem höchsten Volumen.

Vergleichen Sie nicht nur maximale Transaktionen pro Sekunde. Erfassen Sie p50-, p95- und p99-Latenz, Konflikt- und Wiederholungsraten, zwischen Regionen übertragene Bytes, Speicherverstärkung, Wiederherstellungszeit und den Aufwand für Operatoren während eines simulierten Incidents. Die beste Wahl erfüllt Korrektheits- und Wiederherstellungsziele mit akzeptablen Kosten und Betriebsaufwand.

Globales SaaS mit regionalen Nutzern

Echte Workloads testen
Prototypisieren Sie Checkout-, Buchungs- oder Ledger-Abläufe und testen Sie Ihre Transaktionsmuster Ende zu Ende.

Eine globale SaaS-Anwendung profitiert von Distributed SQL, wenn Mandanten regionale Datenplatzierung und transaktionalen Zugriff brauchen, ohne für jede Geografie getrennte Datenbankstacks zu betreiben. Das Design funktioniert am besten, wenn Mandantschaft im Schema klar abgebildet ist und die meisten Transaktionen innerhalb eines Mandanten bleiben.

Mandantenlokalität sollte Verträgen und Traffic folgen

Eine Mandantenkennung kann die Platzierung steuern, sodass europäische Datensätze in zugelassenen europäischen Standorten bleiben, während die Daten anderer Kunden im vertraglich vereinbarten Land oder in der vereinbarten Region liegen. So bleibt ein logisches Schema erhalten und unterschiedliche physische Richtlinien sind möglich.

Platzierungsregeln müssen mehr als die Basistabelle abdecken. Indexeinträge, Change Streams, temporäre Daten, Backups und exportierte Datensätze können regulierte Informationen enthalten. Eine Richtlinie, die Zeilen festlegt, aber einen globalen Sekundärindex anderswo speichert, kann die beabsichtigte Grenze verletzen.

Die Mandantenisolation beeinflusst auch die Performance. Ein großer Mandant kann eine gemeinsame Partition überlasten oder einen Knoten dominieren. Hashing oder Unterpartitionierung innerhalb dieses Mandanten kann nötig sein, sollte aber effizienten Zugriff auf mandantenbezogene Transaktionen erhalten.

Regionale Reads brauchen eine klare Richtlinie zur Aktualität

Read-lastige Dashboards können nahe Replikate nutzen, wenn leicht verzögerte Daten akzeptabel sind. Kontoänderungen, Autorisierungsentscheidungen und Bestätigungsseiten nach Transaktionen brauchen stärkere Garantien. Klassifizieren Sie Abfragepfade nach ihrem Bedarf an Aktualität, statt eine globale Einstellung zu verwenden.

Die Write-Platzierung sollte dem normalen Writer eines Mandanten folgen. Arbeitet das Personal eines Kunden überwiegend in Singapur, erzeugt die Koordination der Writes auf einem anderen Kontinent vermeidbare Latenz. Ein Verfahren zur Mandantenmigration muss die Platzierung aktualisieren, ohne Writes zu verlieren, Residenzvorgaben zu verletzen oder Anwendungscaches auf alte Standorte zeigen zu lassen.

Globaler Anwendungscode muss Bewegungen verkraften

Leader wechseln, Knoten starten neu und Routing ändert sich während der Wartung. Treiber brauchen sinnvolle Timeouts, Wiederholungsrichtlinien, Verbindungserneuerung und Logik für Neustarts von Transaktionen. Wiederholungen sollten Jitter und eine Obergrenze nutzen, damit ein überlasteter Cluster nicht sofort eine synchronisierte Welle wiederholter Anfragen erhält.

Monitoring sollte Nutzerlatenz nach Region und Mandantenklasse trennen. Ein globaler Durchschnitt kann verdecken, dass eine entfernte Kundengruppe mehrere zusätzliche Netzwerkwege bezahlt. Trace-IDs, die API-Spans mit Datenbankstatements verbinden, erleichtern das Auffinden von Fehlern bei der Lokalität.

Finanzabläufe und Ledger

Finanzabläufe profitieren, wenn Datenbank-Constraints und Transaktionen Ledger-Invarianten über Ausfälle und parallele Anfragen hinweg durchsetzen. Verteilung schafft nicht von selbst korrekte Buchhaltung. Das Schema muss die Regeln abbilden, die nicht verletzt werden dürfen.

Ein Ledger sollte eine prüfbare Folge von Buchungen bewahren

Ein append-orientiertes Ledger erfasst jede Bewegung als Buchung, statt einen Saldo ohne Historie wiederholt zu ersetzen. Jede Buchung sollte eine stabile Transaktionskennung, Konten, Beträge, Währung, Geschäftszeitstempel und Metadaten zur Erstellung besitzen. Regeln der doppelten Buchführung sollten vor dem Commit geprüft werden, damit Soll und Haben für die Buchungseinheit ausgeglichen sind.

Ein zwischengespeicherter Saldo kann Reads beschleunigen, muss sich aber in derselben Transaktion wie die Buchungen ändern oder klar als abgeleitete Daten gelten. Abstimmungsjobs sollten abgeleitete Summen mit den Quellbuchungen vergleichen und Unterschiede melden, ohne die Historie stillschweigend umzuschreiben.

Eine globale Reihenfolge ist selten für jedes Konto nötig. Transaktionen für ein einzelnes Konto oder ein Transferpaar brauchen eine konsistente Reihenfolge, während nicht zusammenhängende Konten parallel weiterlaufen können. Ein Design entlang dieser Grenze senkt Konflikte gegenüber einer globalen Sequenz oder einer einzigen Settlement-Zeile.

Idempotenz macht Wiederholungen sicher

Zahlungs-APIs, Queues und Webhooks wiederholen Vorgänge nach Timeouts. Daher braucht jeder Geschäftsvorgang einen stabilen Idempotenzschlüssel. Erzwingen Sie Eindeutigkeit im richtigen Bereich, etwa pro Händler oder Konto, und erstellen Sie Zahlungsdatensatz und Ledger-Buchungen in einer Datenbanktransaktion.

CREATE TABLE payment_attempts (
    account_id UUID NOT NULL,
    idempotency_key TEXT NOT NULL,
    provider_reference TEXT,
    status TEXT NOT NULL,
    created_at TIMESTAMPTZ NOT NULL,
    PRIMARY KEY (account_id, idempotency_key)
);

Senden zwei Worker denselben Vorgang, entscheidet der Unique Constraint, welcher Insert erfolgreich ist. Der unterlegene Worker sollte den bestehenden Datensatz lesen und dessen festgelegtes Ergebnis zurückgeben. Er darf keine zweite Belastung beim Anbieter erzeugen, nur weil eine Datenbanktransaktion wiederholt wurde.

Externe Aufrufe brauchen eine Transaktionsgrenze

Eine Datenbank kann nicht atomar mit einem unabhängigen Zahlungsanbieter committen, außer beide nehmen an einem speziellen Koordinationsprotokoll teil, was bei öffentlichen APIs meist nicht der Fall ist. Halten Sie den Netzwerkaufruf außerhalb der Datenbanktransaktion und modellieren Sie den Ablauf mit klaren Zuständen wie pending, authorized, captured, failed und reversed.

Eine transaktionale Outbox kann committete Änderungen an nachgelagerte Worker veröffentlichen. Consumer sollten nach Ereigniskennung deduplizieren, da eine Nachricht mehr als einmal zugestellt werden kann. So entsteht wiederherstellbare Verarbeitung, ohne eine unmögliche einzelne Transaktion über alle Dienste zu behaupten.

Hot Accounts brauchen ein workload-spezifisches Design

Lohnläufe, Marketplace-Abrechnungen und große Händler können Writes auf einem Konto bündeln. Zusätzliche Datenbankknoten teilen eine einzelne konfliktbehaftete Zeile nicht auf. Möglichkeiten sind unveränderliche Buchungspartitionen, Akkumulatoren pro Zeitraum, das Einreihen von Buchungen für ein Konto oder eine sorgfältig definierte Hierarchie von Unterkonten.

Testen Sie die tatsächliche Verteilung der Schieflast. Gleichmäßiger synthetischer Traffic kann einen Cluster bereit erscheinen lassen, während ein Produktionshändler wiederholt serialisierbare Konflikte erzeugt. Korrektheit kommt zuerst, doch das Datenmodell sollte sichere Parallelität dort ermöglichen, wo die Buchhaltungsregeln es zulassen.

Bestand, Buchungen und Reservierungen

Bestands- und Buchungssysteme brauchen eine maßgebliche Zuweisungstransaktion, wenn mehrere Nutzer denselben knappen Artikel beanspruchen können. Schnelle Verfügbarkeits-Reads verbessern das Browsen, doch nur der Commit-Pfad entscheidet, wer die letzte Einheit erhält.

Bedingte Writes verhindern Überverkäufe

Ein bedingtes Update kann Bestand nur reservieren, wenn genug verfügbar ist. Die Zahl der betroffenen Zeilen zeigt der Anwendung, ob die Zuweisung gelang.

UPDATE inventory
SET available = available - 1
WHERE sku = $1
  AND available > 0;

Dieses Statement sollte dieselbe Transaktion wie der Reservierungsdatensatz verwenden. Verfügbarkeit zuerst zu lesen und später zu verringern erzeugt einen Wettlauf, sofern Isolationsebene und Prädikatbehandlung die Entscheidung nicht schützen. Datenbank-Constraints sollten negative Mengen als zusätzliche Sicherheitsschicht ablehnen.

Bei zugewiesenen Sitzplätzen sorgt ein Unique Constraint auf Aufführung und Sitzkennung für genau eine erfolgreiche Reservierung. Hotelbestand wird oft nach Zimmernacht oder Bestandspool-Datum modelliert, damit sich überlappende Aufenthalte nicht dieselbe Kapazität sichern. Die richtige Konflikteinheit ergibt sich aus der Geschäftsregel.

Holds trennen Zuweisung und Zahlung

Ein temporärer Hold reserviert Bestand, während Zahlung oder Nutzerbestätigung läuft. Speichern Sie Ablaufzeit und Status und wandeln Sie ihn dann über eine bedingte Transaktion in eine bestätigte Reservierung um. Ein Ablauf-Worker darf nur Holds freigeben, die weiterhin aktiv sind, weil Bestätigung und Ablauf gleichzeitig eintreten können.

Eine Verzögerung nach Wanduhrzeit garantiert keine Freigabe. Worker können stehen bleiben, Queues nachhängen und Regionen ausfallen. Abfragen zum verkaufbaren Bestand sollten abgelaufene Status konsistent berücksichtigen, während Reparaturjobs übersehene Holds zurückholen.

Die Dauer eines Holds ist eine Produkt- und Kapazitätsentscheidung. Zehn Minuten können für einen Checkout sinnvoll sein, aber während eines Ansturms einen erheblichen Teil knappen Bestands blockieren. Messen Sie Abbrüche und die Dauer bis zum Zahlungsabschluss, bevor Sie sie festlegen.

Extreme Konflikte skalieren nicht linear

Tausende Käufer, die um eine Zeile konkurrieren, werden nicht durch zusätzliche Replikate parallel. Jedes erfolgreiche Verringern muss gegen die anderen geordnet werden. Admission Controls, eine Queue, Bestands-Buckets oder vorab zugeteilte regionale Quoten können die Datenbank während eines Verkaufsstarts schützen.

Regionale Quoten verringern Koordination, verändern aber die Semantik. Hat Europa ungenutzte Einheiten, während eine andere Region ausverkauft ist, braucht das System eine sichere Übertragung der Quote oder muss vorübergehende Ungleichgewichte akzeptieren. Nutzen Sie dieses Muster nur, wenn das Geschäft klar definieren kann, wie regionale Kapazität abgestimmt wird.

Hochverfügbarkeit und Disaster Recovery

Basis-App bereitstellen
Lassen Sie API und UI im Chat generieren und konzentrieren Sie sich auf Datenbankentscheidungen statt auf Boilerplate.

Distributed SQL kann den Dienst durch ausgewählte Infrastrukturausfälle aufrechterhalten, wenn Replikatplatzierung, Reservekapazität und Anwendungsverhalten zu einem definierten Serviceziel passen. Replikation allein garantiert dieses Ergebnis nicht.

SLOs sollten Fehlerdomänen benennen

Ein Verfügbarkeitsziel braucht einen Workload und ein Ausfallszenario. Definieren Sie, ob der Dienst einen Knoten, eine Availability Zone oder eine ganze Region überstehen muss. Geben Sie akzeptable Fehlerrate und Latenz während des Ereignisses an, nicht nur nach der Wiederherstellung.

Ein Cluster mit drei Replikaten in einem Gebäude hat ein anderes Risikoprofil als drei Replikate in unabhängigen Zonen. Eine Multi-Region-Topologie schützt vor einem größeren Ereignis, schafft aber längere Quorum-Pfade und braucht genug Restkapazität, um Traffic nach dem Verlust eines Standorts aufzunehmen.

Das Recovery Time Objective beschreibt, wie schnell der Dienst zurückkehren muss. Das Recovery Point Objective beschreibt, wie viele committete Daten verloren gehen dürfen. Synchrone Quorum-Replikation kann für abgedeckte Ausfälle ein Ziel ohne Verlust commit­teter Daten unterstützen, allerdings nur, solange die erforderlichen Replikate und der Anwendungspfad wie vorgesehen funktionieren.

Failover erzeugt sichtbare Ereignisse in der Anwendung

Leader-Wechsel können laufende Transaktionen unterbrechen, Verbindungen schließen und Latenz erhöhen. Anwendungen müssen wiederholbare Datenbankergebnisse von dauerhaften Geschäftsfehlern unterscheiden. Eine fehlgeschlagene Transaktion sollte als Einheit neu starten, statt nur ihr letztes Statement abzuspielen.

Connection Pools können nach einem Ausfall tote Endpunkte behalten. Health Checks, DNS-Verhalten, Load Balancer, Zertifikatsprüfung und Topologieerkennung des Treibers gehören in den Testplan. Die Datenbank kann gesund sein, während die Anwendung sie dennoch nicht findet.

Kapazität nach einem Ausfall verlangt eine ausdrückliche Berechnung. Laufen drei Regionen normalerweise nahe 70 Prozent Auslastung, bleibt nach dem Verlust einer Region zu wenig Raum für deren Arbeitsanteil. Reservekapazität kostet Geld, doch eine Topologie ohne Failover-Kapazität erfüllt ihr genanntes Ziel nicht.

Game Days prüfen das Design

Ausfallübungen sollten einen Knoten deaktivieren, eine Zone isolieren, regionale Konnektivität unterbrechen und einen Anwendungsendpunkt entfernen. Messen Sie Fehlerdauer, Transaktionswiederholungsrate, Latenzperzentile, Queue-Wachstum und Reaktion der Operatoren.

Führen Sie diese Übungen nach wesentlichen Änderungen an Topologie, Treiber oder Schema durch. Ein Verfahren, das beim Traffic des letzten Jahres funktioniert hat, kann scheitern, wenn sich das Datenvolumen verdoppelt oder ein Mandant dominant wird. Automatisieren Sie sichere Teile der Übung, damit Belege nicht von einem jährlichen manuellen Ereignis abhängen.

Replikation ist kein Backup

Replikate kopieren versehentliche Löschungen, fehlerhafte Migrationen und schädliche Writes der Anwendung zuverlässig mit. Backups und Point-in-Time Recovery schützen vor logischen Schäden, die Replikation nicht erkennen kann.

Restore-Übungen sollten eine getrennte saubere Umgebung aufbauen, Prüfsummen oder Anwendungsinvarianten prüfen und die gesamte Wiederherstellungszeit messen. Beziehen Sie Verschlüsselungsschlüssel, Zugriffsrichtlinien, Schemaversionen und abhängige Konfiguration ein. Ein vorhandenes Backup, das nicht innerhalb des Ziels wiederhergestellt werden kann, ist kein ausreichendes Wiederherstellungssystem.

Datenresidenz und compliance-getriebene Architektur

Distributed SQL kann Mandanten oder Datensatzgruppen in zugelassenen Regionen platzieren. Compliance hängt jedoch von jeder Kopie, jedem Zugriffspfad und jedem Betriebsprozess ab. Datenbanklokalität ist eine Kontrolle innerhalb eines umfassenderen Programms.

Residenzregeln brauchen genaue Definitionen

Die Vorgabe, Daten müssten in einem Land bleiben, kann Speicherung, Verarbeitung, Supportzugriff, Backups, Verschlüsselungsschlüssel oder alles zusammen meinen. Diese Auslegungen führen zu unterschiedlichen Topologien. Rechtsberatung und Auditoren sollten Regulierung und Verträge in testbare technische Kontrollen übersetzen.

Teams brauchen ein Inventar regulierter Felder und abgeleiteter Daten. Logs, Traces, Suchindizes, Analyseexporte, Supportanhänge und Message Queues können dieselben personenbezogenen Informationen wie die Primärtabelle enthalten. Die Datenbank zu beschränken und Roh-Payloads global zu exportieren erfüllt die beabsichtigte Richtlinie nicht.

Datenminimierung kann das Design vereinfachen. Benötigt ein globaler Dienst nur eine Kontokennung und aggregierten Status, bleiben sensible Details in der zugelassenen Region, während anderswo nur die kleinste erlaubte Darstellung verfügbar ist.

Platzierungsrichtlinien müssen Lebenszyklusvorgänge einschließen

Richtlinien sollten festlegen, wo Live-Replikate, temporäre Replikate, Backups, Snapshots, Änderungsdatensätze und Wiederherstellungsumgebungen existieren dürfen. Rebalancing und Wartung müssen dieselbe Grenze einhalten. Ein Notfallverfahren darf regulierte Daten nicht aus Bequemlichkeit in eine nicht zugelassene Region kopieren.

Zugriffskontrolle braucht geografische und organisatorische Grenzen. Dienstidentitäten sollten nur die Tabellen und Operationen erhalten, die sie benötigen. Menschlicher Produktionszugriff sollte protokolliert, wenn praktikabel zeitlich begrenzt und überprüft werden. Regionsgebundene Verschlüsselungsschlüssel können zusätzliche Kontrolle schaffen, doch ihre Verfügbarkeit und Disaster Recovery benötigen dann ein eigenes Design.

Die Verlagerung eines Mandanten braucht einen dokumentierten Ablauf. Vertragsänderungen, Kundenmigration oder Umstrukturierung können das Verschieben von Datensätzen zwischen Rechtsräumen verlangen. Der Prozess sollte festhalten, wann alte Kopien verschwinden, wie Backups auslaufen und welche Belege den Abschluss nachweisen.

Globales Reporting benötigt möglicherweise abgeleitete Datensätze

Ein globales Dashboard kann mit strenger Platzierung kollidieren, wenn es rohe Kundendaten über Regionen hinweg scannt. Regionale Verarbeitung kann zugelassene Aggregate lokal berechnen und nicht sensible Ergebnisse an einen zentralen Reporting-Store veröffentlichen.

Die Aggregationsregeln sollten die Rekonstruktion eingeschränkter Datensätze verhindern. Kleine Gruppen, Freitextfelder und detaillierte Dimensionen können personenbezogene Informationen offenlegen, auch wenn direkte Kennungen entfernt sind. Analytics Governance gehört daher in die Architekturprüfung, nicht in ein späteres Reporting-Projekt.

Operative und analytische Workloads verdienen oft getrennte Systeme. Die Transaktionsdatenbank schützt den aktuellen Produktzustand, während regional abgegrenzte Pipelines gesteuerte Datensätze für Berichte erzeugen. Diese Trennung hält lange Analysescans von latenzkritischen Transaktionen fern.

Kosten- und Performanceplanung

Failover früh üben
Stellen Sie eine Testumgebung bereit und führen Sie Ausfalltests mit realistischem Traffic durch.

Distributed SQL kostet mehr als eine einfache Datenbank in einer Region, weil redundante Kapazität vorgehalten und Arbeit über ein Netzwerk koordiniert wird. Die Investition kann sich dennoch lohnen, wenn sie aufwendiges Sharding ersetzt oder Verluste verhindert, die höher als der Betriebsaufschlag sind.

Compute und Storage enthalten Replikationsaufwand

Ein logischer Datensatz von 2 TB mit drei vollständigen Replikaten beginnt bei etwa 6 TB replizierter Daten, bevor Sekundärindizes, temporärer Platz für Kompaktierung, Backups und Metadaten hinzukommen. Tatsächliche Abrechnung und Kompression unterscheiden sich je nach Produkt. Schätzungen sollten daher gemessenen physischen Speicher nutzen, nicht nur die logische Tabellengröße.

Compute muss normale Arbeit, Konsensverarbeitung, Rebalancing, Backup-Aktivität und Reservekapazität für Ausfälle abdecken. Knoten sind keine austauschbaren Durchsatzeinheiten, wenn eine Partition heiß ist. Zusätzliche Kapazität hilft nur, wenn sich der Workload darauf verteilen kann.

Indizes vervielfachen Write-Arbeit und Speicher. Prüfen Sie jeden Sekundärindex nach Abfragewert, Update-Häufigkeit und geografischer Platzierung. Ein ungenutzter Index verschwendet in einem verteilten Cluster Speicher und verteuert jeden betroffenen Write.

Netzwerkkosten können erheblich werden

Replikation sendet Writes zwischen Replikatstandorten. Regionsübergreifende Abfragen, Change Feeds, Backups und Anwendungstraffic erzeugen weitere Übertragungen. Aktiver Traffic in mehreren Regionen kann eine Rechnung verursachen, die ein Benchmark in einer Region nie sichtbar macht.

Schätzen Sie Bytes pro Transaktion, Replikationsfaktor, Write-Rate, Indexverstärkung und Richtung der Übertragungen. Testen Sie dann bei einem repräsentativen Lastlauf mit Abrechnungsdaten des Anbieters. Die Anzahl der Anfragen allein übersieht große Payloads und Hintergrundbewegungen.

Fehler bei der Lokalität erhöhen Kosten und Latenz. Ein Dienst in einer Region kann wiederholt einen Koordinator in einer anderen abfragen, weil Endpunktauswahl oder Mandantenplatzierung falsch sind. Verteiltes Tracing und Kostenaufschlüsselungen nach Regionen können dieses Muster sichtbar machen.

Nutzerabläufe zeigen kumulierte Latenz

Modellieren Sie vollständige Nutzeraktionen statt einzelner Statements. Zählen Sie beim Checkout jeden aufeinanderfolgenden Datenbank-Commit, starken Read, externen API-Aufruf und Queue-Handoff. Wenden Sie gemessene regionale Round-Trip-Zeiten und Abfrageperzentile auf den kritischen Pfad an.

Enthält ein Ablauf zwei aufeinanderfolgende Quorum-Writes, die jeweils 90 Millisekunden Netzwerkkoordination hinzufügen, kommen etwa 180 Millisekunden vor der Anwendungsverarbeitung hinzu. Das Zusammenfassen von Änderungen mit einer atomaren Entscheidung kann einen Commit einsparen, während die Parallelisierung unabhängiger Reads den Pfad verkürzen kann.

Lasttests sollten realistische Konflikte und Payload-Größen umfassen. Ein Benchmark mit zufälligen Kennungen kann perfekt verteilen, obwohl Produktions-Writes auf einige beliebte Mandanten zielen. Beziehen Sie Leader-Wechsel und Rebalancing ein, damit die Tail-Latenz den gewöhnlichen Clusterbetrieb widerspiegelt.

Vergleichen Sie die Gesamtverantwortung mit realistischen Alternativen

Der relevante Vergleich lautet nicht Distributed SQL gegen eine imaginäre Datenbank ohne Betriebskosten. Vergleichen Sie mit einer konkreten Alternative: verwaltetes PostgreSQL, Replikate, Sharding-Dienste, regionale Wiederherstellung, Anwendungsrouting und die Entwickler, die das betreiben.

Berücksichtigen Sie Migrationsarbeit, Schulung, Observability, Incident Response, Supportpläne und Exit-Kosten. Verwalteter Betrieb kann Infrastrukturarbeit senken, während Selbstverwaltung Kontrollanforderungen erfüllt, aber tieferes Personal erfordert.

Ein einfaches Finanzmodell kann jährlichen Plattformaufschlag mit erwartetem Ausfallverlust, verzögerter Entwicklungsarbeit, Compliance-Risiko und Umsatz vergleichen, der von regionaler Latenz betroffen ist. Verwenden Sie Bandbreiten für unsichere Eingaben und benennen Sie die Annahme, die die Entscheidung verändert. Hängt das Ergebnis von einer unrealistisch großen Ausfallschätzung ab, bleibt das einfachere System vermutlich passend.

Muster für Schema- und Anwendungsdesign

Ein Distributed-SQL-Schema arbeitet gut, wenn seine Zugriffspfade unabhängige Arbeit verteilen und zusammengehörige Transaktionen nahe beieinander halten. Ein unverändertes Portieren eines Single-Node-Schemas kann Korrektheit bewahren, aber schlechte Latenz oder starke Konflikte erzeugen.

Primary Keys beeinflussen die Verteilung

Ein monoton steigender Primary Key kann neue Zeilen an das Ende einer Range lenken. Zufällige Kennungen verteilen Inserts, doch völlig zufällige Verteilung kann Mandantenscans oder regionale Platzierung verteuern. Zusammengesetzte Schlüssel schaffen oft einen Ausgleich, indem sie mit einer Mandanten- oder Bucket-Kennung beginnen und innerhalb dieser Gruppe einen sortierbaren Wert behalten.

Wählen Sie das Präfix nach Transaktionsgrenzen. Ist fast jede Operation mandantenbezogen, kann die Gruppierung nach Mandant verteilte Arbeit verringern. Ein sehr großer Mandant braucht eventuell Buckets innerhalb seines Namensraums, damit mehrere Partitionen Writes gleichzeitig annehmen können.

Eine Änderung des Primary Keys nach starkem Tabellenwachstum kann eine große Datenumschreibung erfordern. Testen Sie mögliche Layouts mit realistischer Schieflast vor der Migration. Prüfen Sie Partitionshitze, Transaktions-Fan-out, Indexlokalität und Scan-Verhalten statt nur Gesamtdurchsatz.

Konflikte brauchen vor Kapazität ein neues Design

Ein globaler Zähler, eine Singleton-Konfigurationszeile oder ein Händlerkonto können sonst unabhängige Anfragen serialisieren. Mehr Knoten können eine logische Vorgabe nicht entfernen, nach der jede Transaktion denselben Wert aktualisieren muss.

Ersetzen Sie exakte globale Zähler durch partitionierte Zähler, wenn vorübergehende Aggregation akzeptabel ist. Versionieren Sie Konfiguration, statt eine Zeile häufig zu aktualisieren. Beim Geldzustand bewahren Sie die Buchhaltungsinvariante und suchen Parallelität in append-only Buchungen oder unabhängigen Unterkonten, statt die Korrektheit zu schwächen.

Lange Read-Modify-Write-Transaktionen verschärfen Konflikte. Lesen Sie nur die kleinste nötige Menge, vermeiden Sie Nutzerinteraktion innerhalb einer Transaktion und committen Sie zügig. Dauert Geschäftsarbeit Minuten, modellieren Sie sie als Zustandsmaschine über mehrere kurze Transaktionen.

Wiederholungsverhalten gehört zum Anwendungsvertrag

Treiber können einzelne Statements wiederholen oder einen wiederholbaren Fehler an Anwendungscode weitergeben. Verstehen Sie, welche Schicht das erneute Ausführen der vollständigen Transaktion übernimmt. Eine teilweise Wiederholung kann veraltete Entscheidungen nutzen oder frühere Reads auslassen.

Eine Wiederholungsschleife sollte eine maximale Zahl an Versuchen, zufälligen Backoff und Instrumentierung besitzen. Erfassen Sie Konflikttyp, betroffene Operation, Versuchsanzahl und endgültiges Ergebnis. Unbegrenzte Wiederholungen verwandeln Konflikte in versteckte Latenz und können den Cluster überlasten.

Geschäftsanfragen brauchen stabile Kennungen, damit sich eine ungewisse Client-Antwort sicher prüfen lässt. Wenn die Datenbank committet, aber die Antwort verloren geht, sollte der Client den festgelegten Vorgang abfragen, statt einen semantisch neuen zu senden.

Schemaänderungen brauchen Proben in Produktionsgröße

Verteilte Schemaänderungen können Metadaten schnell aktualisieren, während Backfills und Indexerstellung im Hintergrund weiterlaufen. Diese Jobs nutzen Speicher, Netzwerk und CPU und können mit Live-Writes konkurrieren.

Verwenden Sie Expand-and-Contract-Migrationen. Fügen Sie zuerst kompatible Felder oder Tabellen hinzu, stellen Sie Code bereit, der mit beiden Formen arbeitet, führen Sie Backfills in kontrollierten Batches aus, schalten Sie Reads um und entfernen Sie die alte Form nach der Prüfung. Die Rollback-Planung sollte Daten berücksichtigen, die die neue Version bereits geschrieben hat.

Testen Sie große Migrationen mit produktionsähnlichem Volumen und regionaler Topologie. Eine Änderung, die auf einem kleinen Staging-Cluster schnell endet, kann in Produktion Stunden dauern und mit Kundentraffic konkurrieren. Überwachen Sie Fortschritt, Pausensteuerungen, freien Speicher und Wiederholungsverhalten, bevor Sie beginnen.

Checkliste für Einführung und Proof of Concept

Ein hilfreicher Proof of Concept testet einen repräsentativen Workload gegen ausdrückliche Ziele für Korrektheit, Latenz, Resilienz und Kosten. Allgemeine Benchmarks können nicht bestimmen, ob ein konkretes Schema und eine Anwendung sich gut verhalten.

Wählen Sie einen Workload mit echten Einschränkungen

Wählen Sie einen Ablauf wie die Buchung eines knappen Artikels, das Buchen eines Ledger-Transfers oder die Bereitstellung eines Mandanten in einer vorgeschriebenen Region. Nutzen Sie dessen produktionsähnliches Schema, Abfragen, Transaktionsgrenzen, Payload-Größen und Traffic-Schieflast.

Definieren Sie Erfolg vor dem Test:

  • Korrekte Ergebnisse bei Parallelität und Wiederholungen
  • p50-, p95- und p99-Latenz nach Region
  • Nachhaltiger Spitzendurchsatz mit Reserve für Ausfälle
  • Wiederherstellungsverhalten bei Knoten- und Regionsfehlern
  • Gemessene Kosten für Compute, Storage und Netzwerk

Eine Sicherheitsreserve sollte aus erwartetem Wachstum und Ausfallkapazität entstehen, nicht aus einem willkürlichen Multiplikator. Gehört der Verlust einer Region zum Umfang, müssen die verbleibenden Standorte die umgeleitete Last während des Tests bewältigen.

Bauen Sie eine realistische Anwendungsoberfläche

Eine API und eine kleine Benutzeroberfläche zeigen Transaktionsreihenfolge, Treiberverhalten und wahrgenommene Nutzerlatenz, die ein reines Datenbanktool übersehen kann. Koder.ai kann per Chat eine React-Oberfläche, ein Go-Backend und eine PostgreSQL-Basis erstellen. Der Planungsmodus kann den Ablauf vor der Generierung definieren, und der Export des Quellcodes erlaubt Entwicklern, die Datenschicht für eine Kandidatendatenbank anzupassen.

Verwenden Sie die erzeugte Anwendung als Testgerüst, nicht als Beweis für Datenbankkompatibilität. Führen Sie Migrationen aus, prüfen Sie das erzeugte SQL, konfigurieren Sie den offiziellen Treiber und implementieren Sie Transaktionswiederholungen bewusst. Koder.ai-Snapshots und Rollback können Anwendungsiterationen schützen, ersetzen aber keine Datenbankbackups oder Restore-Übungen.

Koder.ai unterstützt auch Deployment und Hosting, sodass sich Testinstanzen der Anwendung nahe bei den Datenbankregionen platzieren lassen. Dadurch kann der gesamte Anfragepfad gemessen werden, statt jeden Benchmark von einem Standort aus zu senden. Nutzen Sie synthetische Testdaten, sofern die Umgebung nicht die für Produktionsdatensätze erforderlichen Kontrollen besitzt.

Testen Sie Normalbetrieb und Ausfälle

Der Test sollte gleichmäßigen Traffic, Spitzen, heiße Partitionen, lang laufende Abfragen, Schemaänderungen, Backup-Arbeit und Knotenersatz abdecken. Unterbrechen Sie dann Konnektivität und entfernen Sie innerhalb der freigegebenen Testumgebung eine Fehlerdomäne.

Erfassen Sie Transaktionsabbrüche, Wiederholungsversuche, nicht verfügbare Antworten, Leader-Bewegungen, Queue-Tiefe, Speicherverbrauch und regionalen Transfer. Dokumentieren Sie, was ein Operator tun musste. Automatische Wiederherstellung, die einen nicht dokumentierten manuellen Schritt verlangt, ist noch nicht produktionsreif.

Stellen Sie ein Backup in einer separaten Umgebung wieder her und prüfen Sie Anwendungsinvarianten. Bestätigen Sie bei Bestand, dass Zuweisungen den Vorrat nicht überschreiten. Berechnen Sie bei einem Ledger Salden neu und prüfen Sie ausgeglichene Buchungen. Prüfen Sie bei SaaS-Mandanten, dass Platzierungs- und Zugriffsrichtlinien die Wiederherstellung überstanden haben.

Prüfen Sie Kompatibilität vor der Migration

Erfassen Sie Datenbankerweiterungen, Stored Procedures, Trigger, Datentypen, Isolationsannahmen, ORM-Funktionen, Reporting-Abfragen, Backuptools und Verwaltungsskripte. Ordnen Sie jeden Punkt als kompatibel, ersetzbar oder blockierend ein.

Führen Sie repräsentative Migrationen auf einer Kopie in voller Größe oder mit einem generierten Datensatz aus. Messen Sie Dauer des Backfills, Verzögerung bei Change Data Capture, Kosten des Parallelbetriebs und Cutover-Zeit. Verwendet die Migration Dual Writes, legen Sie fest, wie Abweichungen erkannt werden und welches System in jeder Phase maßgeblich bleibt.

Shadow Reads können Ergebnisse vergleichen, ohne den Produktionszustand zu verändern. Berücksichtigen Sie Zeitunterschiede und bewusst veraltete Abfragen, damit der Vergleich erwartete Abweichungen nicht als Korruption meldet. Jede unerklärte Differenz in Transaktionsdaten muss vor dem Cutover geklärt werden.

Produktionsreife prüfen

Eine Produktionsprüfung sollte Verantwortliche für Datenbankbetrieb, Wiederholungen in der Anwendung, Sicherheit, Residenzrichtlinie, Kosten und Incident Response benennen. Sie sollte Dashboards, Alarme, Runbooks, Kapazitätsschwellen, Restore-Belege und einen Entscheidungspunkt für Rollback enthalten.

Die endgültige Entscheidung kann weiterhin lauten, bei PostgreSQL oder MySQL zu bleiben. Ein Proof of Concept ist gelungen, wenn er zuverlässige Belege liefert, auch wenn diese zeigen, dass die verteilte Option mehr kostet als die aktuellen Anforderungen rechtfertigen. Wenn die Anforderungen eine Einführung tragen, migrieren Sie schrittweise, messen Sie jede Etappe und bewahren Sie einen getesteten Rückweg, bis das neue System sich unter realer Last bewährt hat.

FAQ

Was ist eine Distributed-SQL-Datenbank einfach erklärt?

Eine Distributed-SQL-Datenbank bietet eine relationale SQL-Oberfläche mit Tabellen, Joins, Constraints und Transaktionen, läuft aber als Cluster auf mehreren Maschinen, oft über Regionen hinweg, und verhält sich wie eine logische Datenbank.

In der Praxis verbindet sie:

  • Vertrautes SQL- und ACID-Verhalten
  • Horizontale Skalierung durch zusätzliche Knoten
  • Hohe Verfügbarkeit und Fehlertoleranz ohne manuelles Sharding
Worin unterscheidet sich Distributed SQL von einem klassischen PostgreSQL- oder MySQL-Setup?

Ein RDBMS mit einem einzelnen Knoten oder Primary und Replikaten ist für OLTP in einer Region oft einfacher, günstiger und schneller.

Distributed SQL wird interessant, wenn die Alternative Folgendes wäre:

  • Sharding in der Anwendung
  • Komplexes Multi-Region-Failover
  • Strenge Konsistenz über Zonen oder Regionen hinweg
  • Anforderungen an die Datenresidenz bei einem einheitlichen Betriebsmodell
Warum verwenden Distributed-SQL-Systeme Konsensprotokolle wie Raft oder Paxos?

Die meisten Systeme beruhen auf zwei Kernideen:

  • Replikation: Jeder Datenshard oder jede Partition liegt auf mehreren Knoten.
  • Konsens wie Raft oder Paxos: Replikate einigen sich auf die Reihenfolge der Writes. Für einen Commit muss meist eine Mehrheit zustimmen.

So bleibt starke Konsistenz auch bei Knotenausfällen erhalten. Dafür ist zusätzliche Netzwerkkoordination nötig.

Wie werden Daten auf Knoten und Regionen verteilt?

Sie teilen Tabellen in kleinere Einheiten auf, oft Partitionen/Shards genannt oder mit produktspezifischen Namen wie Ranges, Tablets oder Splits. Jede Partition:

  • Hat ihre eigene Replikatgruppe
  • Kann auf bestimmte Knoten oder Regionen verteilt werden
  • Kann beim Rebalancing verschoben werden

Mit Richtlinien beeinflussen Sie meist die Platzierung, damit stark genutzte Daten und primäre Writer nahe beieinander liegen und weniger Netzwerkwege anfallen.

Warum können Transaktionen in Distributed SQL langsamer sein, besonders über Regionen hinweg?

Verteilte Transaktionen betreffen oft mehrere Partitionen auf unterschiedlichen Knoten oder in unterschiedlichen Regionen. Ein sicherer Commit kann Folgendes erfordern:

  • Sperren oder Validierung bei allen Beteiligten
  • Replikationsbestätigungen durch ein Quorum
  • Eine abgestimmte Commit-Entscheidung

Diese zusätzlichen Netzwerk-Round-Trips erhöhen vor allem die Write-Latenz, insbesondere wenn sich der Konsens über Regionen erstreckt.

Woran erkenne ich am deutlichsten, dass ich wirklich Distributed SQL brauche?

Prüfen Sie Distributed SQL, wenn mindestens zwei Punkte zutreffen:

  • Sie haben relevante Nutzer in mehreren Regionen und benötigen konsistente Daten
  • Sie brauchen automatisches Failover über Zonen oder Regionen hinweg, mit engen RTO/RPO-Zielen
  • Vertikale Skalierung reicht für Writes nicht mehr aus
  • Kerntransaktionen wie Geld, Bestand oder Reservierungen brauchen starke Konsistenz
  • Compliance verlangt eine geografische Datenplatzierung

Passt der Workload mit Replikaten und Caching in eine Region, ist ein klassisches RDBMS meist die bessere Standardwahl.

Was bringt starke Konsistenz, und was kostet sie?

Starke Konsistenz bedeutet: Nach dem Commit einer Transaktion liefern Reads keine älteren Daten mehr.

Für das Produkt hilft das, Folgendes zu verhindern:

  • Doppelte Abbuchungen oder falsche Salden
  • Verkauf des letzten Artikels an mehrere Personen
  • Buchungen desselben Sitzplatzes durch zwei Nutzer

Der Kompromiss: Bei Netzwerkpartitionen kann ein stark konsistentes System manche Vorgänge blockieren oder ablehnen, statt unterschiedliche Wahrheiten zuzulassen.

Wie behandle ich Wiederholungen mit Distributed SQL sicher und idempotent?

Verlassen Sie sich auf Datenbank-Constraints und Transaktionen:

  • Speichern Sie pro Anfrage oder Versuch einen idempotency_key oder Ähnliches
  • Fügen Sie einen Unique Constraint wie (account_id, idempotency_key) hinzu
  • Schreiben Sie in einer Transaktion den Geschäftsvorgang und alle Ledger- oder Outbox-Zeilen

Dadurch werden Wiederholungen zu folgenlosen Vorgängen statt zu Duplikaten. Das ist wichtig für Zahlungen, Bereitstellung und die erneute Verarbeitung von Hintergrundjobs.

Wie wähle ich zwischen Spanner, CockroachDB und YugabyteDB?

Eine praktische Einordnung:

  • Spanner: meist als verwalteter Dienst auf GCP, mit langjähriger Erfahrung bei Multi-Region-Designs. Die Wahl des SQL-Dialekts beeinflusst die Portabilität.
  • CockroachDB: PostgreSQL-ähnliche Nutzung und Wire Protocol, verwaltet oder selbst betrieben, aber nicht vollständig PostgreSQL-kompatibel.
  • YugabyteDB: PostgreSQL-kompatible SQL-API mit YSQL plus optionaler Cassandra-ähnlicher API mit YCQL, verwaltet oder selbst betrieben.

Testen Sie vor der Entscheidung Ihr tatsächliches ORM, Ihre Migrationen und alle benötigten PostgreSQL-Erweiterungen. Gehen Sie nicht von einem nahtlosen Ersatz aus.

Wie sieht ein guter Proof of Concept aus, bevor ich mich für Distributed SQL entscheide?

Beginnen Sie mit einem fokussierten PoC für einen kritischen Ablauf, etwa Checkout, Buchung oder Ledger-Buchung. Prüfen Sie:

  • Korrektheit, also keine Doppelbuchungen oder verlorenen Updates
  • p50- und p95-Latenz der wichtigsten Abfragen, einschließlich Zielen über Regionen hinweg
  • Verhalten bei Ausfällen von Knoten, Zonen und gegebenenfalls Regionen
  • Betriebsgrundlagen wie Monitoring, Backups und Restore-Übungen

Wenn Sie Hilfe bei Kosten und Tarifen brauchen, lesen Sie pricing. Für verwandte Implementierungshinweise lesen Sie blog.

Related posts