कई ऐप इंस्टेंस के साथ डेटाबेस माइग्रेशन को सुरक्षित रूप से कैसे चलाएं?


10

हमारे पास एक एप्लिकेशन है जिसमें तेज (<1 सेकंड) और धीमी डेटाबेस माइग्रेशन (> 30 सेकंड) दोनों का मिश्रण है। अभी, हम CI के एक भाग के रूप में डेटाबेस माइग्रेशन चला रहे हैं, लेकिन तब हमारे CI टूल को हमारे ऐप के लिए डेटाबेस कनेक्शन के सभी तार (कई वातावरणों में) को जानना होगा जो आदर्श नहीं है। हम इस प्रक्रिया को बदलना चाहते हैं ताकि आवेदन शुरू होने पर अपना डेटाबेस माइग्रेशन चलाए।

यहाँ स्थिति है:

हमारे पास इस एप्लिकेशन के कई उदाहरण हैं - उत्पादन में लगभग 5। चलो उन्हें बुलाते हैं node1, ..., node5। प्रत्येक ऐप एक एकल SQL सर्वर इंस्टेंस से जुड़ता है, और हम रोलिंग परिनियोजन का उपयोग नहीं कर रहे हैं (जहां तक ​​मुझे पता है सभी एप्लिकेशन एक साथ तैनात हैं)

समस्या: कहते हैं कि हमारे पास एक लंबा चलने वाला प्रवास है। इस मामले में, node1शुरू होता है, फिर प्रवास को निष्पादित करना शुरू करता है। अब, node4शुरू होता है, और लंबे समय से चल रहा माइग्रेशन अभी समाप्त नहीं हुआ है, इसलिए node4माइग्रेशन को चलाना भी शुरू कर देता है -> संभव डेटा भ्रष्टाचार? आप इस समस्या से कैसे बचेंगे या क्या यह समस्या इतनी महत्वपूर्ण है कि यह चिंता का विषय है?

मैं इस समस्या को एए वितरित लॉक ( etcdउन पंक्तियों के साथ या कुछ का उपयोग करके ) के साथ हल करने के बारे में सोच रहा था । असल में, सभी ऐप लॉक हासिल करने की कोशिश करते हैं, उनमें से केवल एक ही इसे प्राप्त करता है और माइग्रेशन चलाता है, फिर अनलॉक होता है। जब बाकी ऐप्स शुरू हो जाते हैं और महत्वपूर्ण खंड में प्रवेश करते हैं, तो सभी माइग्रेशन पहले ही चलाए जा चुके होते हैं, इसलिए माइग्रेशन स्क्रिप्ट बस बाहर निकल जाती है।

हालांकि, मेरी आंत कह रही है "यह ओवरकिल है, एक सरल समाधान होना चाहिए," इसलिए मुझे लगा कि मैं यहां यह देखने के लिए पूछूंगा कि क्या किसी और के पास कोई बेहतर विचार है।


1
अपने वैश्विक / वितरित लॉक के रूप में "माइग्रेशन स्थिति" तालिका का उपयोग करने के बारे में कैसे? एकल पंक्ति इंगित करती है कि क्या कोई माइग्रेशन वर्तमान में सक्रिय है और संभवत: वह माइग्रेशन अंतिम रूप से निष्पादित किया गया था या नहीं।
बार्ट वैन इनगेन शेनौ

क्या आपको अपने ऐप्स को अतुल्यकालिक रूप से तैनात करने की आवश्यकता है?
बेन

जवाबों:


4

चूँकि आपने SQL सर्वर का उल्लेख किया है: इस DBA.SE पोस्ट के अनुसार , स्कीमा परिवर्तन लेनदेन में डाले जा सकते हैं (और चाहिए)। इससे आपको अपने माइग्रेशन को डिजाइन करने की सुविधा मिलती है, जैसे कि आपके डीबी को लिखे जाने वाले समवर्ती किसी अन्य रूप में - आप एक लेनदेन शुरू करते हैं, और जब यह विफल हो जाता है, तो आप इसे वापस रोल करते हैं। यह कम से कम कुछ सबसे खराब डेटाबेस भ्रष्टाचार परिदृश्यों को रोकता है (हालांकि अकेले लेन-देन डेटा हानि से नहीं रोकेगा जब एक स्तंभ या तालिका को हटाने जैसे विनाशकारी प्रवासन चरण होते हैं)।

अब तक, मुझे यकीन है कि आपको कुछ migrationsतालिका की भी आवश्यकता होगी जहां पहले से ही लागू किए गए माइग्रेशन पंजीकृत हैं, इसलिए एक विशिष्ट माइग्रेशन पहले से ही लागू है या नहीं, एक आवेदन प्रक्रिया जांच सकती है। फिर इस तरह से अपने माइग्रेशन (छद्म कोड) को लागू करने के लिए "Select for UPDATE" का उपयोग करें:

  • एक लेनदेन शुरू करें
  • SELECT FROM Migrations FOR UPDATE WHERE MigrationLabel='MyMigration42'
  • यदि पूर्व विवरण एक मान लौटाता है, तो लेनदेन समाप्त करें
  • माइग्रेशन लागू करें (विफल होने पर वापस रोल करें, विफलता लॉग करें और लेनदेन समाप्त करें)
  • INSERT 'MyMigration42' INTO Migrations(MigrationLabel)
  • लेन-देन समाप्त करें

यह लॉकिंग मैकेनिज्म को सीधे "पहले से लागू माइग्रेशन था" टेस्ट बनाता है ।

इस डिजाइन पर ध्यान दें - सिद्धांत रूप में - अपने माइग्रेशन चरणों को इस बात से अनजान रहने दें कि कौन सा एप्लिकेशन वास्तव में इसे लागू करता है - यह संभव हो सकता है कि चरण 1 को ऐप 1, ऐप 2 द्वारा चरण 2, ऐप 3 द्वारा चरण 3, ऐप 4 द्वारा चरण 4 द्वारा लागू किया जाए। फिर से, और इतने पर। हालांकि, यह भी एक अच्छा विचार है कि जब तक अन्य ऐप इंस्टेंसेस उपयोग में हैं, माइग्रेशन लागू न करें। समानांतर तैनाती, जैसा कि आपके प्रश्न में वर्णित है, पहले से ही इस बाधा की देखभाल कर सकता है।


1

हो सकता है कि आप एक पुस्तकालय पा सकते हैं जो कई नोड्स के साथ डेटाबेस प्रवास का समर्थन करता है।

मुझे जावा दुनिया में दो पुस्तकालयों के बारे में पता है, ये दोनों ही आपकी जरूरत का समर्थन करते हैं:

  • लिक्विबेस : उनके अक्सर पूछे जाने वाले प्रश्न से : लिक्विबेस एक वितरित लॉकिंग सिस्टम का उपयोग करता है, जो एक समय में डेटाबेस को अपडेट करने के लिए केवल एक प्रक्रिया की अनुमति देता है। अन्य प्रक्रियाएं केवल तब तक प्रतीक्षा करेंगी जब तक कि लॉक जारी नहीं किया गया हो।
  • फ्लाईवे : उनके डाउनलोड पेज से : समानांतर n में कई नोड्स के लिए सुरक्षित

जावा और अन्य भाषाओं के लिए संभवतः अन्य उपकरण भी हैं।


यदि आप इस तरह के टूल का उपयोग करने में असमर्थ हैं (या नहीं चाहते हैं), टेबल को लॉक के रूप में या माइग्रेशन लॉग के रूप में भी इस्तेमाल किया जा सकता है, उदाहरण के लिए डॉक्टर ब्राउन्स का जवाब देखें ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.