शून्य डाउनटाइम परिनियोजन - संक्रमणकालीन डीबी स्कीमा


14

जीरो डाउनटाइम परिनियोजन प्राप्त करने से एक ही मुद्दे पर संपर्क हुआ, लेकिन मुझे एक रणनीति पर कुछ सलाह की आवश्यकता है, जिस पर मैं विचार कर रहा हूं।

प्रसंग

सर्वर-साइड प्रोसेसिंग के लिए Apache / PHP के साथ एक वेब-आधारित एप्लिकेशन और दृढ़ता के लिए MySQL DB / filesystem।

वर्तमान में हम आधारभूत संरचना का निर्माण कर रहे हैं। सभी नेटवर्किंग हार्डवेयर में अतिरेक होगा और सभी मुख्य नेटवर्क केबलों का उपयोग दोष-सहिष्णुता के लिए बंधुआ जोड़े में किया जाएगा। सर्वर को हार्डवेयर फॉल्ट-टॉलरेंस के लिए उच्च-उपलब्धता जोड़े के रूप में कॉन्फ़िगर किया जा रहा है और वर्चुअल-मशीन फॉल्ट-टॉलरेंस और सामान्य प्रदर्शन दोनों के लिए लोड-संतुलित होगा।

यह मेरा इरादा है कि हम बिना किसी डाउन-टाइम के एप्लिकेशन को अपडेट करने में सक्षम हैं। मैंने यह सुनिश्चित करने के लिए बुनियादी ढांचे को तैयार करते समय बहुत दर्द उठाया है कि मैं 100% समय प्रदान कर सकता हूं; हर बार अपडेट लागू होने के बाद 10-15 मिनट डाउन होना बेहद निराशाजनक होगा। यह विशेष रूप से महत्वपूर्ण है क्योंकि हम एक बहुत तेजी से रिलीज चक्र का इरादा रखते हैं (कभी-कभी यह प्रति दिन एक या अधिक रिलीज तक पहुंच सकता है।

नेटवर्क टोपोलॉजी

यह नेटवर्क का सारांश है:

                      Load Balancer
             |----------------------------|
              /       /         \       \  
             /       /           \       \ 
 | Web Server |  DB Server | Web Server |  DB Server |
 |-------------------------|-------------------------|
 |   Host-1   |   Host-2   |   Host-1   |   Host-2   |
 |-------------------------|-------------------------|
            Node A        \ /        Node B
              |            /            |
              |           / \           |
   |---------------------|   |---------------------|
           Switch 1                  Switch 2

   And onward to VRRP enabled routers and the internet

नोट: DB सर्वर मास्टर-मास्टर प्रतिकृति का उपयोग करते हैं

सुझाई गई रणनीति

इसे प्राप्त करने के लिए, मैं वर्तमान में DB स्कीमा उन्नयन स्क्रिप्ट को दो भागों में तोड़ने के बारे में सोच रहा हूं। अपग्रेड इस तरह दिखेगा:

  1. नोड ए पर वेब-सर्वर को ऑफ-लाइन लिया जाता है; नोड बी पर वेब-सर्वर द्वारा ट्रैफ़िक को संसाधित किया जाना जारी है
  2. संक्रमणकालीन स्कीमा परिवर्तन DB सर्वरों पर लागू होते हैं
  3. वेब-सर्वर एक कोड-आधार अपडेट किया गया है, कैश को मंजूरी दे दी गई है, और किसी भी अन्य अपग्रेड कार्रवाई की जाती है।
  4. वेब-सर्वर ए को ऑनलाइन लाया जाता है और वेब-सर्वर बी को ऑफलाइन लिया जाता है।
  5. वेब-सर्वर बी कोड-बेस अपडेट किया गया है, कैश को मंजूरी दे दी गई है, और किसी भी अन्य अपग्रेड कार्रवाई की जाती है।
  6. वेब-सर्वर बी को ऑनलाइन लाया जाता है।
  7. अंतिम स्कीमा परिवर्तन DB पर लागू होते हैं

'संक्रमणकालीन योजनाएं' को एक क्रॉस-संस्करण संगत डीबी स्थापित करने के लिए डिज़ाइन किया जाएगा। यह ज्यादातर तालिका विचारों का उपयोग करता है जो पुराने संस्करण स्कीमा का अनुकरण करते हैं जबकि तालिका खुद नए स्कीमा में बदल जाएगी। यह पुराने संस्करण को डीबी के साथ सामान्य रूप से बातचीत करने की अनुमति देता है। तालिका के नामों में यह सुनिश्चित करने के लिए स्कीमा संस्करण संख्या शामिल होगी कि यह लिखने के लिए किस तालिका के बारे में कोई भ्रम नहीं होगा।

'अंतिम स्कीमा' पीछे की संगतता को हटा देगा और स्कीमा को साफ करेगा।

सवाल

संक्षेप में, यह काम करेगा?

अधिक विशेष रूप से:

  1. क्या संक्रमणकालीन स्कीमा परिवर्तन के विशिष्ट बिंदु पर समवर्ती लिखने की क्षमता के कारण समस्याएं होंगी? क्या यह सुनिश्चित करने का एक तरीका है कि प्रश्नों का समूह जो तालिका को संशोधित करता है और पीछे की ओर-संगत दृश्य बनाता है, को लगातार निष्पादित किया जाता है? अर्थात जब तक स्कीमा परिवर्तन पूरा नहीं हो जाता है, तब तक बफर में आयोजित होने वाले किसी भी अन्य प्रश्नों के साथ, जो आमतौर पर केवल मिलीसेकंड होगा।

  2. क्या ऐसे सरल तरीके हैं जो इस डिग्री को स्थिरता प्रदान करते हैं जबकि डाउन-टाइम के बिना भी अपडेट की अनुमति देते हैं? यह 'विकासवादी' स्कीमा रणनीति से बचने के लिए भी पसंद किया जाता है क्योंकि मैं बैकवर्ड स्कीमा संगतता में बंद नहीं होना चाहता।

जवाबों:


4

ऐसा लगता है कि आप वास्तव में जिस चीज की तलाश कर रहे हैं वह इतनी उच्च उपलब्धता नहीं है क्योंकि आपको निरंतर उपलब्धता की आवश्यकता होगी ।

अनिवार्य रूप से आपकी योजना काम करेगी लेकिन आपने देखा है कि आपके सेटअप में प्रमुख दोष यह है कि एक रिलीज में डेटाबेस स्कीमा में परिवर्तन या तो डाउनटाइम या फिर भी उपलब्ध नोड की विफलता के परिणामस्वरूप सही ढंग से संचालित हो सकता है। निरंतर उपलब्धता दृष्टिकोण अनिवार्य रूप से कई उत्पादन वातावरण बनाकर इसे हल करता है।

उत्पादन एक

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

उत्पादन दो

यह मूल रूप से स्टेजिंग वातावरण जारी करता है जो उत्पादन वन के समान है। आप यहां अपनी रिलीज़ अपग्रेड कर सकते हैं और अपने गो लाइव इवेंट से पहले अपने विवेक परीक्षण कर सकते हैं। यह आपको इस वातावरण पर आपके डेटाबेस परिवर्तनों को सुरक्षित रूप से करने के लिए भी पुष्टि करता है। लोड बैलेंसर वर्तमान में इस वातावरण की ओर इशारा नहीं करता है।

उत्पादन DR

यह एक अलग डेटा सेंटर पर एक और डुप्लिकेट है जो दुनिया के एक अलग क्षेत्र में स्थित है। यह आपको लोड बैलेंसर पर डीएनएस स्विच करके आपत्तिजनक घटना की स्थिति में विफल होने की अनुमति देता है।

प्रत्यक्ष जाना

यह घटना अनिवार्य रूप से उत्पादन दो से उत्पादन एक या इसके विपरीत चक्र के लिए DNS रिकॉर्ड को अपडेट कर रही है। दुनिया भर के DNS सर्वरों में प्रचार करने में थोड़ा समय लगता है इसलिए आप दोनों वातावरण को कुछ समय के लिए छोड़ देते हैं। कुछ उपयोगकर्ता आपके सॉफ़्टवेयर के पुराने संस्करण पर मौजूदा सत्रों में काम कर रहे हैं। अधिकांश उपयोगकर्ता आपके सॉफ़्टवेयर के उन्नत संस्करण पर नए सत्र स्थापित कर रहे होंगे।

आंकड़ों का विस्थापन

यहाँ एकमात्र दोष यह है कि उस विंडो के दौरान सभी डेटा उस समय सभी उपयोगकर्ताओं के लिए उपलब्ध नहीं होते हैं। पिछले संस्करण डेटाबेस में स्पष्ट रूप से महत्वपूर्ण उपयोगकर्ता डेटा है जिसे अब नए डेटाबेस स्कीमा में सुरक्षित रूप से माइग्रेट करने की आवश्यकता है। यह एक अच्छी तरह से परीक्षण किए गए डेटा निर्यात और माइग्रेशन स्क्रिप्ट या बैच नौकरी या इसी तरह की ईटीएल प्रक्रिया के साथ पूरा किया जा सकता है।

निष्कर्ष

एक बार जब आप अपनी रिलीज़ की घटना को पूरी तरह से पूरा कर लेते हैं, तो प्रोडक्शन टू अब आपका प्राथमिक है और आप अगली रिलीज़ को प्रोडक्शन वन में अगले तैनाती चक्र के लिए स्थापित करने पर काम करना शुरू करते हैं।

कमियां

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


इसलिए, अगर मैं सही तरीके से समझ गया हूं, तो आप सुझाव देते हैं कि एक 'संक्रमणकालीन' डीबी स्कीमा परिवर्तन के बजाय जिसे डीबी उपयोग में है, डीबी-ए को पुराने स्कीमा के साथ ऑनलाइन रखा जाता है, जबकि डीबी-बी नए में अपडेट किया जाता है। स्कीमा। जब अद्यतन रिलीज़ के लिए तैयार हो जाता है, तो वेब सर्वर को बदल दिया जाता है और डेटा जो Db A को लिखा गया था, जबकि अद्यतन तैयार किया जा रहा था, Db B में स्थानांतरित हो जाता है (संभवतः एक विशिष्ट समय-मोहर के बाद सभी परिवर्तन लागू करके)।
मार्विन

@PeterScott आपको मिल गया। बस यह ध्यान रखें कि आप स्क्रिप्ट को तब तक नहीं चलाना चाहते जब तक कि आप सुनिश्चित न हों कि सभी सक्रिय सत्र पुराने सिस्टम में खत्म हो चुके हैं और यह काफी लंबा समय है कि सभी DNS कैश को नए CNAME या IP पते पर अपडेट कर दिया गया है।
maple_shaft

1
मुझे उन दोनों बिंदुओं पर ठीक होना चाहिए; सत्रों को विशिष्ट वर्चुअल-मशीनों से बंधे रहने से बचने के लिए सर्वर स्टोरेज के बजाय Db में बनाए रखा जा रहा है और मेरा वर्तमान में गैर-डीएनएस आधारित लोड-बैलेंसर को आजमाने और उपयोग करने का इरादा है। मेरे पास डेटा-केंद्र स्तर अतिरेक नहीं होगा, लेकिन वह अनुप्रयोग लॉन्च के बाद एक वर्ष तक प्रतीक्षा कर सकता है।
मार्विन

2

आपकी रणनीति ध्वनि है। मैं केवल "लेन-देन तालिकाओं" के एक पूरे सेट में "संक्रमणकालीन स्कीमा" के विस्तार पर विचार करने की पेशकश करूंगा।

लेन-देन तालिकाओं के साथ, शुद्धता का आश्वासन देने के लिए सामान्यीकृत तालिकाओं के विरुद्ध चयन (प्रश्न) किए जाते हैं। लेकिन सभी डेटाबेस INSERTs, UPDATEs, और DELETEs को हमेशा अपभ्रंश लेनदेन तालिका में लिखा जाता है।

फिर एक अलग, समवर्ती प्रक्रिया उन परिवर्तनों को लागू करती है (शायद संग्रहीत प्रक्रियाओं का उपयोग करके) व्यापार नियमों और स्थापित आवश्यकताओं के अनुसार सामान्यीकृत तालिकाओं के लिए।

ज्यादातर समय, यह लगभग तात्कालिक होगा। लेकिन क्रियाओं को अलग करने से सिस्टम अत्यधिक गतिविधि और स्कीमा अपडेट देरी को समायोजित करने की अनुमति देता है।

डेटाबेस (बी) पर स्कीमा परिवर्तन के दौरान, सक्रिय डेटाबेस (ए) पर डेटा अपडेट इसके लेनदेन तालिकाओं में जाएंगे और तुरंत इसके सामान्यीकृत तालिकाओं पर लागू होंगे।

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

लेन-देन तालिका पंक्ति कुछ इस तरह दिख सकती है ...

| ROWID | TRANSNR | DB | TABLE | SQL STATEMENT
    0        0       A    Name   INSERT INTO Name ...
    1        0       A    Addr   INSERT INTO Addr ...
    2        0       A    Phone  INSERT INTO Phone ...
    3        1       A    Stats   UPDATE Stats SET NrOfUsers=...

लेनदेन "टेबल" वास्तव में प्रदर्शन आवश्यकताओं के आधार पर एक अलग NoSQL डेटाबेस या यहां तक ​​कि अनुक्रमिक फ़ाइलों में पंक्तियाँ हो सकती हैं। एक बोनस यह है कि आवेदन (इस मामले में वेबसाइट) कोडिंग थोड़ा सरल हो जाता है क्योंकि यह केवल लेनदेन तालिकाओं को लिखता है।

यह विचार दोहरे-प्रविष्टि बहीखाता पद्धति और समान कारणों से समान सिद्धांतों का पालन करता है।

लेन-देन टेबल एक बहीखाता पद्धति "पत्रिका" के अनुरूप हैं। पूरी तरह से सामान्यीकृत टेबल एक बहीखाता "बहीखाता" के अनुरूप होती हैं, जिसमें प्रत्येक मेज़ एक बहीखाता "खाता" जैसा होता है।

बहीखाता पद्धति में, प्रत्येक लेनदेन को जर्नल में दो प्रविष्टियां मिलती हैं। एक "डेबिट" खाता बही खाते के लिए, और दूसरा "क्रेडिट" खाते के लिए।

RDBMS में, एक "पत्रिका" (लेन-देन तालिका) को उस लेन-देन द्वारा परिवर्तित की जाने वाली प्रत्येक सामान्यीकृत तालिका के लिए एक प्रविष्टि मिलती है।

उपरोक्त तालिका चित्रण में DB कॉलम इंगित करता है कि लेन-देन किस डेटाबेस से हुआ है, इस प्रकार दूसरे डेटाबेस से पंक्तिबद्ध पंक्तियों को फ़िल्टर किया जा सकता है और दूसरा डेटाबेस वापस लाए जाने पर फिर से लागू नहीं किया जाता है।


1
मुझे बुक-कीपिंग से तुलना पसंद है। इसलिए, अगर मुझे समझ में आ गया है, तो लेन-देन की तालिकाओं ने मुझे डेटा को किसी विशेष सामान्यीकृत तालिका में लिखने में बहुत कम देरी करने की अनुमति दी है ताकि मैं बदलावों के माध्यम से बीच-बीच में रुकावट के जोखिम के बिना सभी स्कीमा परिवर्तनों को लागू कर सकूं? फिर, तालिका के स्कीमा अप-टू-डेट के साथ, मैं उस प्रक्रिया को फिर से शुरू कर सकता हूं जो सामान्यीकृत तालिकाओं में असामान्य लेनदेन को लागू करता है (यह प्रक्रिया नए स्कीमा के लिए पुराने स्कीमा डेटा प्रश्नों को मैप करने में सक्षम है)?
मार्विन

1
हाँ। आप पुराने और नए दोनों डेटा को समायोजित करने के लिए मैपिंग संग्रहीत प्रक्रियाओं (या जो भी) को संशोधित करेंगे। नए NOT-NULL कॉलम को पुराने डेटा से एक कोड के साथ भरा जा सकता है, जिसका अर्थ है "उपयोगकर्ता अपडेट पर इसके लिए संकेत।" विभाजन को विभाजित किया जाना चाहिए (यानी FIRST और LAST में FULLNAME) को कुछ एल्गोरिथ्म की आवश्यकता होगी। मैं नई बिज़ आवश्यकताओं के लिए तालिकाओं में 1 या अधिक "टिप्पणी जैसी" कॉलम जोड़ने की सलाह देता हूं। यदि आप नहीं करते हैं, तो मैं गारंटी देता हूं कि उपयोगकर्ता उस उद्देश्य के लिए अन्य कॉलमों को उपयुक्त करेंगे और डेटा को ठीक करना लगभग असंभव होगा।
DocSalvager

पुराने स्कीमा को नए स्कीमा पर लागू करने के लिए संरचित प्रश्नों को आप कैसे रोकेंगे? मैं एक तालिका दृश्य बना सकता हूं और स्कीमा तालिका (स्कीमा संस्करण संख्या के साथ) का नाम बदल सकता हूं, लेकिन यह तब भी समस्याग्रस्त होगा जब स्कीमा परिवर्तन सामान्यीकृत तालिका में सीधे लागू होने के बाद लागू हो रहे हों।
मार्विन

1
जब आप एक तालिका, स्तंभ, या किसी अन्य चीज़ को RDBMS में जोड़ते हैं, तो आप वास्तव में केवल आंतरिक तालिकाओं के एक सेट में पंक्तियों को जोड़ रहे हैं जो केवल RDBMS इंजन द्वारा लिखा जा सकता है। DBA, VIEW के माध्यम से क्वेरी करके डेटाबेस का प्रबंधन करते हैं। चूंकि ओरेकल, आईबीएम, एमएस, आदि विशेषज्ञ हैं और कहते हैं कि यह सबसे अच्छा तरीका है, ऐसा लगता है कि हमें उनके नेतृत्व का पालन करना चाहिए। एप्लिकेशन के प्रत्येक संस्करण के लिए VIEWs का एक सेट बनाएं। आप उन्हें (आमतौर पर काफी असमान्य) तालिकाओं के बाद मॉडल कर सकते हैं, डेवलपर्स चाहते हैं कि आप बनाएं ताकि आप दूषित डेटा को रोकने के लिए ठीक से सामान्य कर सकें।
DocSalvager

धन्यवाद। मुझे इस बारे में सोचने की आवश्यकता होगी। मैं आवेदन में एक ORM परत बना रहा हूँ जो मुख्य डोमेन से सभी राज्य दृढ़ता तर्क को पूरी तरह से हटा देता है; सर्वर-साइड प्रोग्रामिंग में अधिक आधारित होने के कारण मैं उस तरफ की समस्याओं को डीबी प्रशासन की ओर से अधिक हल करता हूं। मेरी वर्तमान रणनीति का उपयोग करते हुए, डीबी ओआरएम के साथ कच्चे तालिकाओं को सक्रिय रूप से प्रबंधित करने के लिए काफी सपाट होगा। तालिका दृश्य जोड़ने और, संभवतः, लेन-देन लॉग ORM में अधिक जटिलता जोड़ता है, लेकिन यह कई स्कीमा संस्करणों को डेटा स्प्लिन्टरिंग के बिना समर्थित होने की भी पुष्टि करता है।
मार्विन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.