- Multi-AZ-Cluster von Amazon RDS for PostgreSQL unterstützen laut offizieller Aussage Snapshot Isolation, verletzen diese in der Praxis jedoch häufig durch G-nonadjacent-Zyklen und das Long-Fork-Phänomen
- Die Tests basierten auf einer selbst aufgebauten PostgreSQL-Transaktions-Workload; von PostgreSQL 13.15 bis 17.4 traten in allen Versionen Konsistenzfehler auf
- Diese Fehler treten hauptsächlich auf schreibgeschützten sekundären Knoten auf, und selbst auf dem Niveau "Repeatable Read" wird Snapshot Isolation verletzt
- RDS-Cluster könnten Konsistenz auf dem Niveau von Parallel Snapshot Isolation bieten, was ein schwächeres Modell als bei einem einzelnen PostgreSQL-Standardknoten ist
- Schreibgeschützte Transaktionen können unterschiedliche Transaktionsreihenfolgen beobachten; solche Inkonsistenzen können zu Fehlern bei der Datenintegrität führen
Hintergrund
- PostgreSQL ist eine Open-Source-SQL-Datenbank auf MVCC-Basis und bietet verschiedene Transaktionsisolationsstufen. Repeatable Read entspricht dabei tatsächlich Snapshot Isolation
- Amazon RDS bietet PostgreSQL als gemanagten Cluster an; die Multi-AZ-Konfiguration ist eine Architektur für Replikation und Fehlertoleranz
- Der primäre Endpoint erlaubt Lesen und Schreiben, sekundäre Knoten sind schreibgeschützt und unterstützen das Serializable-Niveau nicht
Testdesign
- Das Jepsen-Testwerkzeug für PostgreSQL wurde für RDS angepasst, um automatisierte Transaktionstests durchzuführen
- Die Transaktionen wurden so entworfen, dass sie Listen bestimmter Schlüssel lesen oder eindeutige Ganzzahlen anhängen; der Elle-Checker erkannte dabei Zyklen
- Bei einer Last von 150 TPS Schreiben und 1600 TPS Lesen wurden Long Fork und G-nonadjacent innerhalb von 2 Minuten bestätigt
Ergebnisse
- Ein G-nonadjacent-Zyklus aus 4 Transaktionen belegt die Verletzung von Snapshot Isolation
- T₂ beobachtete die Änderungen von T₁, sah aber T₃ nicht; T₄ sah T₃, aber nicht T₁ → ein gegenseitiger Widerspruch in der zeitlichen Reihenfolge entsteht
- Dies ist ein Fall des Long-Fork-Phänomens und
- Da kein Write Skew gefunden wurde, stützt dies die Möglichkeit von Parallel Snapshot Isolation
Diskussion
- Multi-AZ-RDS bietet ein niedrigeres Konsistenzniveau als ein einzelner PostgreSQL-Knoten
- Da bei der Nutzung schreibgeschützter Knoten Konsistenzfehler möglich sind, sollte erwogen werden, ausschließlich den Schreibknoten zu verwenden oder in jede Transaktion mindestens einen Schreibvorgang einzubauen
- Diese Analyse befindet sich noch auf dem Niveau früher Tests; sie beweist das Vorhandensein des Problems, garantiert aber nicht seine Abwesenheit
1 Kommentare
Hacker-News-Kommentare
Im Artikeltitel wird es nicht klar erwähnt, aber es geht um das neue RDS-Feature Multi-AZ Cluster
In einem früheren Unternehmen traten beim Wiederherstellen von Backups Konsistenzprobleme auf (Duplicate-Key-Fehler und FK-Constraint-Fehler), als der
pg_dump-Befehl im Backup-Skript auf parallele Worker (-j-Flag) umgestellt wurdeJepsen hat diese Arbeit unabhängig durchgeführt und wurde nicht dafür bezahlt
Die praktische Bedeutung dieses Problems ist, dass Lesezugriffe, die kurz nach einem Schreibzugriff auf dieselbe Zeile erfolgen, veraltete Daten zurückgeben können
Es ist nicht klar, ob es in vorgelagerten Postgres-Clustern mit mehreren Instanzen dieses Problem nicht gibt
Der eingereichte Titel verschleiert den Kernpunkt: RDS für PostgreSQL 17.4 implementiert Snapshot Isolation nicht korrekt
Ich frage mich, welche Sicherheits- oder Anwendungsfehler auf Anwendungsebene auftreten könnten, wenn Entwickler Snapshot Isolation voraussetzen, Amazon RDS for PostgreSQL aber tatsächlich nur Parallel Snapshot Isolation bietet, insbesondere in Multi-AZ-Konfigurationen mit Read-Replica-Endpunkten
Dieses Verhalten trat in allen getesteten Versionen von 13.15 bis 17.4 auf
Es wäre gut, alle Versionen von Amazon RDS mit Jepsen zu testen
AWS sollte die Dokumentation aktualisieren, um darauf hinzuweisen