नए कोड को लाइव करना


29

लाइव (ई-कॉमर्स) साइट पर नए कोड को तैनात करने के लिए सबसे अच्छा अभ्यास क्या है?

अभी के लिए मैंने +/- 10 सेकंड के लिए अपाचे को रोक दिया है जब निर्देशिका public_html_newका नाम बदलकर public_htmlऔर पुराने से public_html_old। इससे पहले कि मैं अपाचे को फिर से शुरू करूँ, यह एक छोटा डाउन-टाइम बनाता है।

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

लाइव साइट के टार (बैकअप उद्देश्य) संपीड़न के दौरान मैंने देखा कि मीडिया निर्देशिका में परिवर्तन हुए। इससे मुझे संकेत मिला कि फाइलें समय-समय पर बदलती रहती हैं। और अगर अपाचे को तैनाती के दौरान रोका नहीं गया तो ये बदलाव हस्तक्षेप कर सकते हैं।

जवाबों:


13

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

एक तरफ, अगर यह एक यूनिक्स प्रणाली पर है तो आप अपाचे को नाम बदलने के दौरान होल्ड पर रख सकते हैं (या सिमलिंक अपडेट, आदि):

killall -STOP httpd  # Pause all httpd processes
mv public_html public_html_orig
mv public_html_new public_html
killall -CONT httpd  # Resume all httpd processes

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

killall -STOP httpd  # Pause all httpd processes
rm /var/www/html
ln -s /var/www/version/03 /var/www/html
killall -CONT httpd  # Resume all httpd processes

ध्यान दें कि कोई भी लंबित कनेक्शन या पैकेट OS में कतारबद्ध हो जाएगा। एक अत्यधिक व्यस्त साइट के लिए, अपने httpd कार्यकर्ता प्रकार के लिए उपयुक्त अगर ListenBacklog को ट्यून करने पर विचार करें, और टीसीपी श्रवण रोक से संबंधित अपनी ओएस सेटिंग्स की जांच करें।

आप DocumentRoot को httpd.conf में भी बदल सकते हैं और एक शानदार रीस्टार्ट ( apachectl graceful) कर सकते हैं। यहां खामी त्रुटियों का बढ़ा जोखिम है, क्योंकि आपको किसी भी Directoryकॉन्फ़िगरेशन को भी अपडेट करना होगा ।


क्या इस विराम सत्र में अभी भी साइट चल रही है?
nicoX

4
यह अपाचे को सीपीयू समय देना बंद कर देता है। यदि आपने अपाचे को रोका गया है तो ब्राउज़र में साइट तक पहुंचने का प्रयास किया है, जब तक अपाचे को फिर से शुरू नहीं किया जाता है, तब तक अपाचे के फिर से शुरू होने तक ब्राउज़र कनेक्ट होने का इंतजार कर रहा होगा (या यदि ब्राउजर समय से बाहर हो तो)। यदि कोई फ़ाइल डाउनलोड करने की प्रक्रिया में है, तो Apache रुके हुए समय पर डेटा भेजना बंद कर देगी, क्योंकि इसमें CPU समय नहीं मिल रहा है। यदि Apache को इतने लंबे समय के लिए रोक दिया जाता है तो फिर से यह समस्या पैदा करेगा।
गार्गुनच्यूट

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

1
कृपया ध्यान दें कि किसी भी उच्च यातायात वेबसाइट में, यह आपकी अपाचे सेवा को आसानी से मार सकता है। 200 rq / s बहुत आसानी से आपके कनेक्शन पूल को कचरा कर देगा जैसे ही आप इस कदम के बाद अपनी अपाचे प्रक्रिया को 'अनलॉक' करेंगे (यदि चाल थोड़ी देर
चली

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

32

सबसे तेज़ और आसान संस्करण निर्देशिका जैसे कि उपयोग करना है

/var/www/version/01
/var/www/version/02

और अपने html_root के रूप में एक वर्तमान प्रतीकात्मक लिंक का उपयोग करें:

/var/www/html -> /var/www/version/02

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

यह अधिक जटिल तैनाती प्रणाली जैसे RPM संकुल, या कॉन्फ़िगरेशन परिवर्तन प्रबंधन (शेफ, कठपुतली, आदि) के बुनियादी ढांचे के साथ अच्छी तरह से एकीकृत करता है।


4
सबसे सरल समाधान हमेशा सबसे अच्छा होता है ... :-) निश्चित रूप से उल्लेख करना न भूलें, कि कुछ फॉलोस्माइल्लिंक और कॉन्फिग में इस तरह के एपाचे झंडे की आवश्यकता हो सकती है।
पीटर ने कहा कि मोनिका

@PeterHorvath ने जो कहा उसमें विशेष ध्यान रखें। सिम्प्लाइड डॉक्यूमेंटरूट्स के साथ काम करने पर अपाचे को बहुत ग्रम्पी मिल सकती है। ध्यान से परीक्षण करना सुनिश्चित करें!
mhutter

धन्यवाद @mhutter :-) क्या वास्तव में समस्याग्रस्त कि अपाचे पर FollowSymlinks सक्रिय करने के सुरक्षा समस्याएं पैदा कर सकता है ...
peterh को फिर से बहाल मोनिका का कहना है कि

सिम्लिंक को अपडेट करना एक परमाणु ऑपरेशन नहीं है। यहां तक कि कुछ का उपयोग कर की तरह ln -snfमूल सिमलिंक मार करने के लिए, अंतर्निहित आपरेशन एक है unlinkऔर symlink। अपडेट के दौरान उपयोगकर्ताओं को 404 मिलने की संभावना है। यह केवल मूल निर्देशिका को रास्ते से हटाने और किसी नए को जगह में बदलने से बेहतर नहीं है (यह मानते हुए कि आप फाइल सिस्टम को पार नहीं कर रहे हैं)। ऊपर दिए गए उत्तर को चेक मार्क के साथ देखें, जो इस चिंता का समाधान करता है।
गर्गीन्यूचेट

14

अपाचे को बंद किए बिना निर्देशिकाओं का नाम बदलने के साथ ही काम करना चाहिए। यह विंडो को काफी छोटा कर देगा। mv public_html public_html_old && mv public_html_new public_htmlएक सेकंड के एक अंश में खत्म करना चाहिए।

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

निर्देशिका के साथ इसे परमाणु रूप से करना समर्थन नहीं है। लेकिन आप इसे सहानुभूति के साथ कर सकते थे। नाम की एक निर्देशिका होने के बजाय public_html, एक निर्देशिका नाम है public_html.version-numberऔर public_htmlउस निर्देशिका को इंगित करने के लिए एक सिम्कलिन कहा जाता है । अब आप एक निर्देशिका नाम बना सकते हैं public_html.new-version-numberऔर एक नया सिमलिंक कहलाता है public_html.new

फिर आप परमाणु स्विच public_html.newकरने के public_htmlलिए नाम बदल सकते हैं । ध्यान दें कि mvउस नाम को निष्पादित करने के लिए "बहुत बुद्धिमान" है, लेकिन यह os.renameअजगर या किसी अन्य चीज से उपयोग किया जा सकता है जो renameस्मार्ट होने की कोशिश किए बिना सिस्टम कॉल को कॉल करेगा ।

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


1
मेरे डेबियन सिस्टम पर, mvएक -Tविकल्प है जो इसे सिमलिंक का पालन करने से रखता है। यह आपको atomically नाम बदलने दूँगी public_html.newसे अधिक public_html, यह मानते हुए दोनों सॉफ्ट लिंक कर रहे हैं।
गर्गीन्यूचेट

11

सिम्बलिंक और एमवी आपके मित्र हैं, हालांकि, अगर आपको वास्तव में नए संस्करण को तैनात करते समय एक त्रुटि पृष्ठ प्राप्त करने वाले उपयोगकर्ताओं से बचने की आवश्यकता है, तो आपके पास कम से कम 2 बैकएंड सर्वर (अपाचे) के सामने रिवर्स-प्रॉक्सी या लोड-बैलेंसर होना चाहिए आपके मामले में)।

तैनाती के दौरान, आपको एक बार में एक बैकएंड को रोकने की जरूरत है, नए कोड को तैनात करें, इसे पुनरारंभ करें और फिर शेष बैकेंड पर पुनरावृति करें।

अंतिम-उपयोगकर्ताओं को हमेशा प्रॉक्सी द्वारा अच्छे बैकेंड के लिए निर्देशित किया जाएगा।


4
मैं इस जवाब पर काम कर रहा था जब मैंने देखा कि आप पहले से ही इसे पोस्ट कर चुके हैं। बैलेन्सर + 2 सर्वर इस प्रक्रिया को अदृश्य और खराब अपग्रेड से उबरने में आसान बनाता है ...
बार्ट सिल्वरस्ट्रिम

9

यदि आप एक उत्पादन प्रणाली पर नियमित रूप से परिवर्तन लागू कर रहे हैं, तो मैं एक संरचित जीवन चक्र का ध्यान रखूंगा। एक अच्छा अभ्यास है Capistrano http://capistranorb.com/ । यह एक खुला स्रोत समाधान है जो कई प्लेटफार्मों और कॉन्फ़िगरेशन पर एक या एक से अधिक सर्वर पर सॉफ्टवेयर को तैनात करता है।

Magento के लिए भी एक प्लगइन है: https://github.com/augustash/capistrano-ash/wiki/Magento.Example

एकल सर्वर और लगभग निर्बाध बदलाव के लिए, मैं सिमिलिंक का उपयोग करने की सलाह देता हूं।


4

जिस तरह से मैं कर रहा हूं वह मेरे स्थानीय देव परिवेश से गिथब जैसे ऑनलाइन गिट रिपॉजिटरी में मेरे बदलावों के लिए प्रतिबद्ध है। मेरे उत्पादन का वातावरण एक रिमोट रिपॉजिटरी से चलता है, इसलिए मुझे बस इतना करना होगा कि मैं सर्वर पर चला जाऊं और git pullनवीनतम बदलाव लाऊं। अपने वेबसर्वर को रोकने की आवश्यकता नहीं है।

यदि आपके पास अपनी परियोजना की फाइलें हैं जिनकी सेटिंग्स और / या सामग्री आपके स्थानीय संस्करण (जैसे कॉन्फ़िगरेशन फ़ाइलें और मीडिया अपलोड) से भिन्न होती है, तो आप .gitignoreरिपॉजिटरी के साथ सिंक करने से रोकने के लिए पर्यावरण चर और / या इन फ़ाइलों / निर्देशिकाओं को एक फ़ाइल में जोड़ सकते हैं ।


3

मेरा पहला विचार है:

# deploy into public_html_new, and then:
rsync -vaH --delete public_html_new/ public_html/

एक अच्छा समाधान rsync का उपयोग करना था। यह केवल वास्तव में परिवर्तित फ़ाइलों को बदल दिया है। खबरदार, अंत ओ.टी. रास्ते में स्लैश यहाँ महत्वपूर्ण हैं।

आम तौर पर अपाचे को पुनरारंभ की आवश्यकता नहीं होती है, यह जावा दुनिया नहीं है। यह अनुरोध पर हर php फ़ाइल के परिवर्तन के लिए जाँच करता है, और स्वचालित रूप से परिवर्तन पर rereads (और फिर से tokenizes)।

गिट पुल समान कुशल थे, हालांकि यह स्क्रिप्ट के लिए थोड़ा कठिन था। बेशक इसने विभिन्न विलय / परिवर्तन का पता लगाने की संभावनाओं का एक व्यापक स्पेक्ट्रम सक्षम किया।

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

यदि बड़े बदलाव हैं, तो मेरा सुझाव आपका प्रारंभिक समाधान (दो नाम) था।


यहाँ थोड़ा कट्टर है, लेकिन 100% परमाणु समाधान:

(1) अपने फाइल सिस्टम में से कुछ को वैकल्पिक रूप से माउंट करें, जहां आपका मैगनेटो लगे:

mount /dev/sdXY /mnt/tmp

(2) --bindअपने public_html_new से public_html का माउंट करें:

mount --bind /path/to/public_html_new /path/to/public_html

इस बिंदु से, अपाचे आपकी नई तैनाती को देखेगा। 404 का कोई भी बदलाव असंभव है।

(3) rsync के साथ सिन्क्रोनट्रिशन करें, लेकिन वैकल्पिक आरोह बिंदु पर):

rsync -vaH --delete /mnt/tmp/path/to/public_html_new/ /mnt/tmp/path/to/public_html/

(4) बाइंड माउंट को हटा दें

umount /path/to/public_html

क्या कमांड public_html को हटा देगी और उसमें public_html_new को तैनात कर देगी?
nicoX

@nicoX नहीं, यह केवल परिवर्तनों की प्रतिलिपि बनाएगा ।
पीटर का कहना है कि मोनिका

@nicoX यह दोनों निर्देशिका संरचनाओं पर गुजरता है , और यदि यह एक अंतर पाता है (नई फ़ाइल, संशोधित फ़ाइल, हटाई गई फ़ाइल), तो यह दूसरी निर्देशिका को पहले से मेल करने के लिए संशोधित करता है, जैसा कि इसकी आवश्यकता है। परिणाम यदि आपने public_html हटा दिया और फिर public_html_new को उसके स्थान पर स्थानांतरित कर दिया, लेकिन बिना किसी अस्थायी 404 समस्या की संभावना के।
पीटर का कहना है कि मोनिका

1
नहीं, यह अच्छा विचार नहीं है। परिवर्तनों के आधार पर, आपके पास उस समय की छोटी अवधि हो सकती है जहां कोड public_htmlअसंगत स्थिति में है, और आप यह मौका नहीं लेना चाहते हैं।
स्वेन

@SvW आप सही हैं, मेरा विचार केवल ठीक है अगर केवल मामूली बदलाव हैं। मैंने उसी हिसाब से अपना जवाब बढ़ाया।
पीटर ने मोनिका

1

http_publicफ़ोल्डर को ले जाना / बदलना सरल mvया ln -sकमांड या समकक्ष के साथ प्राप्त किया जा सकता है जबकि आपका http सर्वर चालू रहता है। आप डाउनटाइम को कम करने के लिए कुछ स्क्रिप्टिंग कर सकते हैं, लेकिन यदि आप प्रक्रिया को स्वचालित करते हैं तो स्क्रिप्ट में अपने कमांड के रिटर्न कोड को ध्यान से देखें।

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

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

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