हमेशा उपयोग में रहने वाली साइट पर रखरखाव चलाने के बारे में कोई विचार?


18

मैं ऑस्ट्रेलिया में एक बड़ी गेमिंग साइट के साथ मदद करता हूं। हम सप्ताह के प्रत्येक दिन सुबह 7 बजे स्थानीय समय से अगले दिन 1 बजे तक प्रतियोगिताओं को चलाते हैं। साइट जारी होने के बाद हमने एक दिन भी नहीं छोड़ा है। स्वाभाविक रूप से, यह रखरखाव को चलाने के लिए बहुत कठिन बनाता है, और हम पाते हैं कि हमारे मंचन सर्वर हमारी उत्पादन शाखा से 50 से अधिक ऊपर है। आमतौर पर, मुख्य देव को शाखाओं को विलय करने के लिए बहुत जल्दी जागना पड़ता है और यह सुनिश्चित करना होता है कि सब कुछ ठीक से काम कर रहा है।

हम अपनी स्टेजिंग साइट को उसी तरह बनाने की कोशिश कर रहे हैं जैसे हम उत्पादन साइट पर कर सकते हैं, लेकिन हम इसे केवल इसी तरह बना सकते हैं।

हमारी साइट रीयलटाइम के लिए Node.JS सर्वर के साथ लारवेल पर आधारित है। हम लारवेल फोर्ज का उपयोग कर रहे हैं।

क्या किसी के पास कोई सुझाव है कि हम अपडेट को अधिक बार कैसे आगे बढ़ा सकते हैं? हम किसी भी कार्य के लिए तैयार हैं।


एक तैनाती में इतना समय क्यों लगता है?
माइकल हैम्पटन

@ मिचेल हैम्पटन हमारे डिप्लॉयज को अधिक समय नहीं लगता है, यह सिर्फ इतना है कि अगर कुछ गलत हो जाता है तो हम डाउनटाइम बर्दाश्त नहीं कर सकते।
चीज़ ५५०५

1
मैं इस सवाल का अनुमान लगाता हूं, यह है: रोलबैक में इतना समय क्यों लगता है?
माइकल हैम्पटन

@Michael Hampton हमने ठीक से रोलबैक पर ध्यान नहीं दिया है, हालांकि कई बार हम बड़े अपडेट करते हैं जो साइट को बहुत देर तक नीचे ले जाएगा।
चीज ५५०५

5
जो भी समय के बड़े ब्लॉक ले रहा है, वही आपको देखने की जरूरत है।
माइकल हैम्पटन

जवाबों:


22

बहुत सारी चीजें हैं जो आप अपनी तैनाती प्रक्रिया को बेहतर बनाने के लिए कर सकते हैं। उनमें से कुछ हैं:

  • सुनिश्चित करें कि आपके कोड का अच्छी तरह से परीक्षण किया गया है।

    आदर्श रूप से आपके पास 100% यूनिट टेस्ट कवरेज होना चाहिए, साथ ही साथ प्रत्येक बोधगम्य परिदृश्य के लिए एकीकरण परीक्षण भी होना चाहिए।

    यदि आपको यह नहीं मिला है, तो आपको शायद सब कुछ छोड़ देना चाहिए और इस बात का ध्यान रखना चाहिए।

    व्यवहार चालित विकास में देखें।

    एक पूर्ण परीक्षण सूट होने से आप ...

  • निरंतर एकीकरण चलाएं।

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

    किसी समस्या के मामले में, CI आपको एक-क्लिक रोलबैक भी दे सकता है।

    यदि आपका परीक्षण सूट पूर्ण और सही नहीं है, तो सीआई बहुत कम उपयोगी है, क्योंकि पूरा आधार आपके कोड को स्वचालित तरीके से मान्य करने में सक्षम होता है।

  • परमाणु अद्यतन करें।

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

    यह भी देखें कि क्या डॉकर जैसे कंटेनर आपकी मदद कर सकते हैं।

  • छोटे, अधिक लगातार परिवर्तन करें।

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

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

  • किसी भी चीज का लंबे समय तक विश्लेषण करें।

    आपने उल्लेख किया कि आपकी तैनाती के कुछ हिस्सों में लंबा समय लगता है। यह संभवतः डेटाबेस स्कीमा परिवर्तन है। यह देखने के लिए कि क्या बेहतर प्रदर्शन किया जा सकता है, प्रत्येक स्कीमा परिवर्तन के साथ-साथ आपके डेटाबेस पर डीबीए देखने लायक है।

    एक विषय वस्तु विशेषज्ञ की तैनाती के किसी अन्य भाग पर नज़र डालें जो समय के बड़े ब्लॉक लेता है।

  • अजीब घंटे काम करते हैं।

    आप पहले से ही ऐसा कर रहे होंगे, लेकिन यह उल्लेख करने वाला है। डेवलपर्स (और sysadmins!) को अब "9 से 5" काम करने की उम्मीद नहीं की जानी चाहिए, खासकर 24x7 ऑपरेशन के लिए। यदि किसी को रात भर घंटों बिताने, किसी समस्या को ठीक करने, और फिर एक दिन का समय निर्धारित करने की उम्मीद है, तो आपकी उम्मीदें अवास्तविक हैं, और आप उस व्यक्ति को जलाने के लिए तैयार कर रहे हैं।


यहां सबसे सरल उपाय कैपिस्ट्रानो जैसे उपकरण में तैनाती स्क्रिप्टिंग का उपयोग करना है और शायद लोड संतुलन भी कर रहा है।
जेकगॉल्ड

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

1
@ cheese5505 मुझे पता है कि यह निराशाजनक है और यह आपकी समस्या का समाधान नहीं होता है, लेकिन जब आप यह कहते हैं, "... इतनी बड़ी है कि यह एक सप्ताह से अधिक लेने के एक बनाने के लिए होता है।" साफ़ तौर पर हास्यास्पद लगता है कि। किसी भी सानी के विकास और परिनियोजन की प्रक्रिया एक सर्वर को एक दिन से भी कम समय में या शायद कुछ घंटों से एक घंटे के भीतर बनाने की अनुमति देती है। आपको वास्तव में समीक्षा करनी चाहिए कि आपने इससे बचने के लिए असहनीय सामान के ढेर का निर्माण क्या किया। समस्या जटिलता नहीं है, लेकिन नियोजन में बुनियादी दूरदर्शिता है।
जेकगोल्ड

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

6

ऐसा लगता है कि आप क्या कहते हैं कि आपके पास हर दिन 1 बजे से सुबह 7 बजे तक रखरखाव खिड़की है, मुद्दा समय नहीं बल्कि सुविधा है। यह सामान्य है और बहुत से लोग इसे व्यवसाय के हिस्से के रूप में देखते हैं।

आपके पास सामने के छोर के साथ 2 (या अधिक बैकएंड) सिस्टम हो सकता है जो वर्तमान में लाइव होने के लिए ट्रैफ़िक को निर्देशित करता है। एक बार जब आप खुश होते हैं कि एक रिलीज काम करने जा रही है तो आप सामने वाले को नई प्रणाली पर स्विच करने के लिए कहेंगे। यह एक कम समय स्क्रिप्ट के लिए आसान होना चाहिए।

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


जब आप बैकएंड से बैकएंड को अलग करते हैं, तो क्या आपका मतलब पूरी तरह से मॉड्यूलर सॉफ्टवेयर आर्किटेक्चर से है? या सर्वर आर्किटेक्चर जैसे लोड बैलेंसर?
जेकगोल्ड

2
बस कुछ ऐसा है जो कनेक्शन स्वीकार करता है और उन्हें वर्तमान प्राथमिक बैकएंड पर वितरित करता है।
user9517 supportGoFundMonica

5

अन्य उत्तरों को संशोधित करना: आपको नीले-हरे रंग की परिनियोजन मॉडल का पालन करना चाहिए । जब आप एक नया संस्करण जारी करना चाहते हैं तो आप इसे आंतरिक स्टेजिंग वेबसाइट पर तैनात करते हैं। फिर, आप अगले संस्करण उत्पादन साइट पर स्वचालित परीक्षण चला सकते हैं। जब परीक्षण आपके माध्यम से जाते हैं तो नई वेबसाइट का उपयोग करने के लिए लोड बैलेंसर को इंगित करते हैं।

यह निम्नलिखित तरीके से मदद करता है:

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

अन्य सभी समस्याएं जो आपने और दूसरों ने बताई हैं, वे कम गंभीर हो जाती हैं जब आप किसी भी समय तनाव-मुक्त तरीके से तैनात कर सकते हैं। नीला-हरा परिनियोजन मॉडल परिनियोजन समस्याओं के लिए एक पूर्ण समाधान है।


हमारे पास पहले से ही एक स्टेजिंग सर्वर है जिसे हम परीक्षण करने के लिए उपयोग करते हैं, लेकिन फिलहाल उत्पादन और स्टेजिंग अलग-अलग स्थानों में अलग-अलग सर्वर प्रदाताओं पर हैं। हम उत्पादन को उस स्थान पर ले जाने की कोशिश कर रहे हैं जहां मंचन करना हमारे लिए बेहतर प्रदर्शन प्रदान करता है।
पनीर5505

1
कुंजी बस लोड बैलेंसर को एक सिद्ध कार्य संस्करण पर स्विच करना है। उस मौजूदा मॉडल के साथ आपके पास ऐसा नहीं है।
usr

1
मॉडल कितना अच्छा है यह इस बात पर बहुत निर्भर करता है कि साइट क्या कर रही है। यदि साइट स्टेटलेस है, तो बढ़िया है, लेकिन यदि यह स्टेटलेस नहीं है, तो आपको वर्क आउट करना होगा कि आप स्विचओवर पर उस स्थिति को कैसे स्थानांतरित कर सकते हैं।
पीटर ग्रीन

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

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

3

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


2

पिछले उत्तरों में जोड़ने के लिए:

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

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

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

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

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

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


0

मैं विश्व स्तर पर माइकल की हर बात ( /server//a/739449/309477 ) से सहमत हूं ।

मेरी राय में, आपको जो पहला सुधार करना चाहिए, वह एक परिनियोजन टूल (Capistrano) का उपयोग कर रहा है।

यह आपको शांति से तैनात करने की अनुमति देगा, फिर तुरंत नए संस्करण पर स्विच करें। यदि कुछ भी गलत होता है, तो आप वर्तमान वर्जन को वर्तमान वर्जन को वर्तमान वर्किग वर्जन में बदलकर वापस काम कर सकते हैं।

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

दूसरे, अगर पैसा आपका मुख्य मुद्दा नहीं है, तो आपके पास उत्पादन में तैनात करने से पहले अपने ऐप का परीक्षण करने के लिए एक आईएसओ-ठेस विकास सर्वर होना चाहिए। VPS उदाहरणों का प्रबंधन करने के लिए एक औद्योगिक समाधान (Ansible, शेफ, कठपुतली) का उपयोग करें ।

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