हमारे पास एक एप्लिकेशन है जिसमें तेज (<1 सेकंड) और धीमी डेटाबेस माइग्रेशन (> 30 सेकंड) दोनों का मिश्रण है। अभी, हम CI के एक भाग के रूप में डेटाबेस माइग्रेशन चला रहे हैं, लेकिन तब हमारे CI टूल को हमारे ऐप के लिए डेटाबेस कनेक्शन के सभी तार (कई वातावरणों में) को जानना होगा जो आदर्श नहीं है। हम इस प्रक्रिया को बदलना चाहते हैं ताकि आवेदन शुरू होने पर अपना डेटाबेस माइग्रेशन चलाए।
यहाँ स्थिति है:
हमारे पास इस एप्लिकेशन के कई उदाहरण हैं - उत्पादन में लगभग 5। चलो उन्हें बुलाते हैं node1, ..., node5
। प्रत्येक ऐप एक एकल SQL सर्वर इंस्टेंस से जुड़ता है, और हम रोलिंग परिनियोजन का उपयोग नहीं कर रहे हैं (जहां तक मुझे पता है सभी एप्लिकेशन एक साथ तैनात हैं)
समस्या: कहते हैं कि हमारे पास एक लंबा चलने वाला प्रवास है। इस मामले में, node1
शुरू होता है, फिर प्रवास को निष्पादित करना शुरू करता है। अब, node4
शुरू होता है, और लंबे समय से चल रहा माइग्रेशन अभी समाप्त नहीं हुआ है, इसलिए node4
माइग्रेशन को चलाना भी शुरू कर देता है -> संभव डेटा भ्रष्टाचार? आप इस समस्या से कैसे बचेंगे या क्या यह समस्या इतनी महत्वपूर्ण है कि यह चिंता का विषय है?
मैं इस समस्या को एए वितरित लॉक ( etcd
उन पंक्तियों के साथ या कुछ का उपयोग करके ) के साथ हल करने के बारे में सोच रहा था । असल में, सभी ऐप लॉक हासिल करने की कोशिश करते हैं, उनमें से केवल एक ही इसे प्राप्त करता है और माइग्रेशन चलाता है, फिर अनलॉक होता है। जब बाकी ऐप्स शुरू हो जाते हैं और महत्वपूर्ण खंड में प्रवेश करते हैं, तो सभी माइग्रेशन पहले ही चलाए जा चुके होते हैं, इसलिए माइग्रेशन स्क्रिप्ट बस बाहर निकल जाती है।
हालांकि, मेरी आंत कह रही है "यह ओवरकिल है, एक सरल समाधान होना चाहिए," इसलिए मुझे लगा कि मैं यहां यह देखने के लिए पूछूंगा कि क्या किसी और के पास कोई बेहतर विचार है।