Aurora RDS में race condition मिलने का मामला
(hightouch.com)- AWS Aurora RDS में हुई race condition bug की एक ऐसी घटना, जिसे प्रयोग के जरिए सत्यापित किया गया और AWS से उसके कारण की पुष्टि भी मिली
- Hightouch ने event processing system को scale करते समय Aurora के failover के दौरान write instance switch fail होने की समस्या देखी
- लॉग विश्लेषण से पता चला कि दो instances ने एक साथ write operations किए, जिससे storage layer conflict और process termination हुआ
- AWS ने आधिकारिक रूप से पुष्टि की कि internal signal processing issue के कारण पुराने writer का demotion पूरा होने से पहले ही नए writer को promote कर दिया गया
- यह मामला बड़े distributed systems में concurrency control के महत्व और failover के समय write pause प्रक्रिया की आवश्यकता को रेखांकित करता है
पृष्ठभूमि
- 20 अक्टूबर 2025 को AWS के
us-east-1region में DNS management system के race condition bug के कारण outage हुआ - इसकी वजह से Hightouch में event processing backlog तेज़ी से बढ़ा और सिस्टम अपनी सीमा तक पहुँच गया
- throughput सुनिश्चित करने के लिए 23 अक्टूबर को Aurora RDS instance upgrade किया गया, और इसी प्रक्रिया में एक नया race condition bug मिला
Hightouch event system की संरचना
- event collection और delivery संभालने वाला सिस्टम Kubernetes, Kafka, Postgres(Aurora) से बना है
- Postgres का उपयोग batch metadata queue के रूप में होता है, और यह प्रति सेकंड 5 लाख events को 1 सेकंड के भीतर process करता है
- Aurora PostgreSQL में write-only(primary) instance, read-only(replica) instances, और एक shared storage layer शामिल है
upgrade योजना
- read instance जोड़ना → मौजूदा reader को upgrade करना और failover priority देना → failover चलाना → मौजूदा writer को upgrade करना → अस्थायी reader हटाना
- यह प्रक्रिया AWS documentation में बताई गई है, और staging environment में load test के जरिए सत्यापित प्रक्रिया थी
upgrade प्रयास और समस्या
- 23 अक्टूबर को 16:39 EDT पर failover चलाने के बाद पुराना writer फिर से primary बनकर लौट आया
- दोनों प्रयासों में यही परिणाम मिला, और कुछ services में write failure error (
DatabaseError: cannot execute UPDATE in a read-only transaction) आया - लॉग विश्लेषण से ऐसे logs मिले जिनसे पता चला कि दो instances एक साथ write operations कर रहे थे और storage conflict के कारण terminate हो गए
race condition का कारण
- Aurora के failover process के step 3 (पुराने writer का demotion) और step 4 (नए writer का promotion) के बीच race condition हुई
- इसके कारण दोनों instances को एक साथ write permission मिल गई और conflict हुआ
- write traffic हटाकर दोबारा प्रयास करने पर failover सामान्य रूप से पूरा हुआ, जिससे race condition वाली परिकल्पना सिद्ध हुई
AWS की पुष्टि और प्रतिक्रिया
- AWS ने internal review के बाद पुष्टि की कि कारण writer demotion signal processing error था, और इसका Hightouch की configuration या traffic pattern से कोई संबंध नहीं था
- fix roadmap में शामिल है, और अस्थायी उपाय के तौर पर failover के दौरान writes रोकने की सिफारिश की गई
अंतिम कदम
- Hightouch ने cluster upgrade पूरा किया, और
- planned failover से पहले write pause प्रक्रिया जोड़ी
- writer role change monitoring को मज़बूत किया
- operations manual (playbook) को update किया
मुख्य सीख
- migration के दौरान अप्रत्याशित state transitions के लिए recovery तैयारी ज़रूरी है
- observability सुनिश्चित करना समस्या पहचानने की कुंजी है
- distributed system components के बीच प्रभाव को न्यूनतम रखने वाली design महत्वपूर्ण है
- test environment और production environment के अंतर को समझना चाहिए
मूल लेख में इससे अतिरिक्त जानकारी नहीं है
1 टिप्पणियां
Hacker News टिप्पणियाँ
इस लेख को देखकर लगता है कि manual failover के दौरान भी अगर application सामान्य रूप से write traffic बनाए रखने की कोशिश करे, तो वह हमेशा fail हो जाता है
लेकिन इससे कुछ सवाल उठते हैं। दूसरे Aurora users को यह समस्या हमेशा क्यों नहीं होती, AWS को इसका पता न हो ऐसा कैसे हो सकता है, और अगर पता है तो इसे P0-स्तर के emergency issue की तरह क्यों नहीं लिया जाता
यह भी लग सकता है कि शायद in-flight transaction state या timeout जैसी सूक्ष्म conditions काम कर रही हों
SELECT ... FOR UPDATEचुपचाप fail हो जाता था और transaction autocommit mode में switch हो जाता था। किसी ने ध्यान नहीं दिया, तो मैं अकेला ही इसकी बात करता रहा, फिर कुछ महीनों बाद किसी और ने संपर्क किया कि उसे भी यही समस्या हुई। आखिरकार यह fix हुआ, लेकिन तब तक मेरी दिलचस्पी खत्म हो चुकी थीसंबंधित लिंक: Stack Overflow प्रश्न
Aurora PostgreSQL में मैंने कई बार unexpected behavior देखा है
खासकर Zero Downtime Patching (ZDP) के दौरान session state गलत तरीके से बनी रही, जिसके कारण साधारण query भी
statement_timeoutसे बहुत पहले cancel हो जाती थीमेरा अंदाज़ा है कि client के reconnect होने पर Aurora पिछले session की पुरानी timer state को ही carry forward कर देता है, और इस वजह से query तुरंत cancel हो जाती है
हम भी बहुत high write traffic वाले environment में नियमित रूप से failover करते हैं, लेकिन AWS JDBC wrapper का उपयोग करके automated process के ज़रिए इसे स्थिर रूप से चला रहे हैं
हम पैसे इसलिए देते हैं कि Aurora ऐसी बुनियादी invariants बनाए रखेगा, इसलिए ऐसी समस्या देखकर हैरानी होती है
logs और AWS की व्याख्या देखकर लगता है कि मूल लेखक की hypothesis गलत है
ऐसा प्रतीत होता है कि promotion failure के बाद किसी external watchdog process ने cluster state mismatch पकड़ लिया और forcefully terminate (
kill -9) कर दिया। storage subsystem से जुड़े messages उसके बाद आएमैं Aurora और RDS Postgres की performance comparison के बारे में पूछना चाहता हूँ।
अगर multi-AZ या fast failover की ज़रूरत न हो, तो क्या RDS में gp3 64k IOPS configuration के साथ बेहतर performance मिल सकती है? Aurora खासकर insert performance में धीमा और costlier लगता है। benchmarks भी RDS settings साफ़ नहीं बताते, इसलिए उन पर भरोसा करना मुश्किल है
साथ ही IOPS को सीधे provision करने की ज़रूरत नहीं पड़ती और लगभग 80k IOPS मिल जाता है।
IO billing के भी दो तरीके हैं, जहाँ pay-per-IO कम load वाले environment के लिए ठीक है, और fixed pricing mode ज़्यादा IO वाले workload के लिए बेहतर है।
और Serverless लगभग हमेशा गैर-आर्थिक साबित हुआ। यह सिर्फ़ तब उपयोगी है जब छोटे peak time हों
AWS engineers जिस “Lego block model” की बात करते हैं, वह यहाँ साफ़ दिखता है
storage layer को पूरी तरह independent डिज़ाइन किया गया, ताकि upper service fail होने पर भी data consistency बनी रहे। मुझे यह AWS engineering का अच्छा उदाहरण लगता है
कहा गया कि AWS ने “failover के दौरान writes रोक दो” जैसी recommendation दी थी, तो जानना चाहता हूँ कि क्या संबंधित case number साझा किया जा सकता है
यह जानकर राहत है कि ऐसी समस्या सिर्फ़ मेरे साथ नहीं हुई
Aurora की compute-storage separation architecture दिलचस्प लगती है
MSSQL का Hyperscale भी इसी तरह की संरचना है, और Azure services में यह लगभग अकेला ऐसा product है जिसे मैं वास्तव में इस्तेमाल करने लायक मानता हूँ