- Amazon RDS for PostgreSQL का multi-AZ क्लस्टर आधिकारिक रूप से Snapshot Isolation को सपोर्ट करता है, लेकिन व्यवहार में इसका उल्लंघन करने वाले G-nonadjacent cycles और Long Fork phenomenon बार-बार दिखाई देते हैं
- परीक्षण स्वयं तैयार किए गए PostgreSQL transaction workload के आधार पर किया गया, और PostgreSQL 13.15 से 17.4 तक सभी versions में consistency errors पाए गए
- ये त्रुटियाँ मुख्य रूप से read-only secondary nodes पर होती हैं, और "Repeatable Read" स्तर पर भी Snapshot Isolation टूट जाता है
- संभव है कि RDS cluster Parallel Snapshot Isolation स्तर की consistency देता हो, जो मूल PostgreSQL single node से भी कमजोर model है
- read-only transactions अलग-अलग transaction order देख सकते हैं, और ऐसी असंगतियाँ data integrity errors तक ले जा सकती हैं
Background
- PostgreSQL, MVCC-आधारित open source SQL DB है, जो कई transaction isolation levels प्रदान करता है। Repeatable Read वास्तव में Snapshot Isolation को दर्शाता है
- Amazon RDS, PostgreSQL को managed cluster के रूप में उपलब्ध कराता है, और Multi-AZ configuration replication तथा fault tolerance के लिए बनाई गई architecture है
- primary endpoint पर read/write दोनों संभव हैं, secondary nodes read-only हैं और Serializable स्तर को सपोर्ट नहीं करते
Test Design
- Jepsen PostgreSQL test tool को RDS के अनुरूप wrap करके automated transaction testing की गई
- transactions को इस तरह डिजाइन किया गया कि वे specific keys पर lists पढ़ें या unique integers append करें, और cycle detection के लिए Elle checker का उपयोग किया गया
- 150 TPS write और 1600 TPS read load पर 2 मिनट के भीतर Long Fork और G-nonadjacent की पुष्टि हुई
Results
- 4 transactions से बने G-nonadjacent cycle के जरिए Snapshot Isolation violation को साबित किया गया
- T₂ ने T₁ के बदलाव देखे, लेकिन T₃ को नहीं देखा; T₄ ने T₃ को देखा, लेकिन T₁ को नहीं देखा → समय क्रम में परस्पर विरोधी स्थिति उत्पन्न हुई
- यह Long Fork phenomenon भी है और Snapshot Isolation violation का मजबूत प्रमाण भी
- Write Skew नहीं मिला, जो Parallel Snapshot Isolation की संभावना को समर्थन देता है
Discussion
- Multi-AZ RDS की consistency, single-node PostgreSQL से कमज़ोर है
- read-only nodes का उपयोग करने पर consistency errors की संभावना रहती है, इसलिए केवल write node का उपयोग करने या हर transaction में कम-से-कम एक write शामिल करने पर विचार करना चाहिए
- यह विश्लेषण शुरुआती परीक्षण स्तर का है, और समस्या की मौजूदगी सिद्ध करता है, लेकिन उसकी अनुपस्थिति की गारंटी नहीं देता
1 टिप्पणियां
Hacker News राय
लेख के शीर्षक में यह स्पष्ट रूप से नहीं कहा गया है, लेकिन यह RDS की नई सुविधा Multi-AZ cluster के बारे में है
पिछली कंपनी में जब बैकअप script के
pg_dumpcommand को parallel workers (-jflag) इस्तेमाल करने के लिए बदला गया, तो backup restore के दौरान consistency problems (duplicate key errors और fk constraint errors) हुईंJepsen ने यह काम स्वतंत्र रूप से किया था, और इसके लिए उसे कोई भुगतान नहीं मिला था
इस समस्या का व्यावहारिक मतलब यह है कि उसी row पर write के तुरंत बाद होने वाला read पुराना data लौटा सकता है
यह स्पष्ट नहीं है कि multi-instance upstream Postgres cluster में भी यह समस्या नहीं है या नहीं
जमा किया गया शीर्षक असली मुद्दे को छिपा रहा है: PostgreSQL 17.4 के लिए RDS snapshot isolation को सही ढंग से implement नहीं करता
यह जानने की उत्सुकता है कि यदि developers snapshot isolation मानकर चलते हैं, लेकिन Amazon RDS for PostgreSQL वास्तव में केवल parallel snapshot isolation देता है, तो विशेष रूप से read replica endpoint का उपयोग करने वाले Multi-AZ configuration में किस तरह की safety या application-level bugs पैदा हो सकती हैं
13.15 से 17.4 तक test की गई सभी versions में यह घटना हुई
Amazon RDS की सभी versions पर Jepsen test किया जाना अच्छा होगा
AWS को documentation update करके यह बात बतानी चाहिए