परिचय
तकनीकी कार्य अप्रत्याशित रूप से सभी परियोजनाओं और साइटों पर होता है - इससे बचना असंभव है, आप केवल तैयारी कर सकते हैं। यह समीक्षा सामने के खेत को ऑफ़लाइन मोड में स्थानांतरित करने के हमारे अनुभव को एकत्र करती है - बिना भंडारण और बैकएंड के।
- टोपी
- proxy_store
- छद्म_काछे_से_स्तले + संस्मरण ttl = ०
1. ठूंठ
यह सबसे आसान तरीका है - पूरे खेत में एक स्थानीय डिस्क पर एक स्थैतिक पृष्ठ डालना और इसे सभी अनुरोधों को फिर से लिखना कॉन्फ़िगर करना।
server { listen 80; location / { rewrite ^.*$ /maintance.html; } location /maintance.html { alias .../maintance.html; expires -1; } }
लाभ
- प्रशिक्षण की गति
- काम के दौरान कोई आश्चर्य नहीं
- यह सर्वर से जुड़ने में असमर्थता के बारे में ब्राउज़र संदेशों से बेहतर है
समस्याओं
- उपयोगकर्ता को वह नहीं मिलेगा जो वह चाहेगा
- परियोजनाएँ तकनीकी कार्य के दौरान पैसे खो देती हैं
अपडेट: टिप्पणियों में, उन्होंने
try_files निर्देश का उपयोग करने का भी सुझाव दिया, जो इस समस्या को फिर से लिखने और विभिन्न स्थानों के बिना हल करता है। और स्पष्ट रूप से अतीत में समाप्त हो जाते हैं, ताकि ब्राउज़र स्टब को कैश न करे।
1.5
बेशक, यह लंबे समय तक नहीं चल सकता था और, 8 घंटे के लिए अगले निर्धारित समय से पहले, हमें कार्य दिया गया था
हर कीमत पर अनचाहे विज्ञापन
पैमाने को समझने के लिए, हमारे पास दो सौ समाचार परियोजनाओं पर प्रतिदिन लगभग डेढ़ मिलियन अनूठे पाठक हैं, सामने वाले खेत पर अलग-अलग सामग्री के लिए दसियों (एक सौ के करीब) मिलियन हिट हैं, अधिकांश ग्राफिक्स और वीडियो सीडीएन पर हैं। फ्रंट फ़ार्म में तीन नगीन नोड होते हैं, जिसके ऊपर एक हार्डवेयर बैलेंसर होता है।
2. प्रॉक्सी_स्टोर
काम के समय, नगीनेक्स-रात को निम्नलिखित सेटिंग्स के साथ खेत में सक्षम किया गया था
- बैलेंसर ने इसके लिए एक चौथाई उपयोगकर्ता अनुरोध भेजे
- तीन मुख्य फार्म नोड्स ने सभी परियोजनाओं के लिए अपस्ट्रीम के रूप में काम किया।
- सभी उत्तीर्ण उत्तर nginx प्रॉक्सी_स्टोर निर्देश के उपयोग से SSD सरणी को लिखे गए थे
location / { proxy_pass http://nginx-farm; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; proxy_pass_header X-Accel-Redirect; proxy_pass_header X-Accel-Expires; proxy_ignore_headers X-Accel-Redirect; set $store_path ---$request_uri---$query_string; if ($store_path ~ "(.*)(.{1})(.{2})"){ set $new_store_path $3/$2/$store_path; } proxy_store /data/cache/store/$host/$new_store_path; } location ~ \.(flv|asf|mp4)$ { proxy_pass http://nginx-farm; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; }
घंटे X पर, मुख्य नोड्स को संतुलन से बाहर ले जाया गया, nginx-night config को कुछ इस तरह से बदल दिया गया
location / { root /data/cache/store/$host/; set $store_path ---$request_uri---$query_string; if ($store_path ~ "(.*)(.{1})(.{2})"){ set $new_store_path $3/$2/$store_path; } rewrite ^.*$ /$new_store_path break; expires 1m; } location ~ css { default_type text/css; root /data/cache/store/$host/; set $store_path ---$request_uri---$query_string; if ($store_path ~ "(.*)(.{1})(.{2})"){ set $new_store_path $3/$2/$store_path; } rewrite ^.*$ /$new_store_path break; expires 1m; }
स्टब की तुलना में, यह एक बड़ा कदम था, लेकिन
- 700 एमबी / सेकंड - यह डेटा स्टोरेज मोड में सरणी के लिए लिखने की गति बिल्कुल थी
- प्रतिक्रिया स्थितियों और हेडर को बचाने का कोई तरीका नहीं
- उपयोगकर्ता के अनुकूल यूआरएल, सबडायरेक्ट पृष्ठों को संसाधित करने के लिए, मुझे नियमित रूप से uri को विभाजित करना और query_string जोड़ना था - यह अधिकांश सहेजी गई फ़ाइलों के लिए सामग्री प्रकार निर्धारित करने की संभावना को बाहर करता है (इसके लिए हमें युद्ध मोड में css के लिए एक अतिरिक्त स्थान दर्ज करना था)
- कोई भी गारंटी नहीं देता है कि 1 url = 1 पृष्ठ (व्यक्तिगत ब्लॉक, pjax)
- 200GB से अधिक जमा होने पर, SSD सरणी अपने आप में जाने लगी
अपडेट: वास्तव में, यह प्रॉक्सी_केच का उपयोग करने के लिए अधिक सही था, लेकिन हमारे पास "शो विज्ञापनों" से "सर्किट ब्रेकर को बंद करने" के लिए केवल एक सप्ताह था और हमने एक त्रुटिपूर्ण, लेकिन गारंटीकृत समाधान के पक्ष में चुनाव किया।
2.5
परिणामों के अनुसार, हमारे पास एक स्व-लिखित समाधान द्वारा पाई गई समस्याओं को हल करने की भी इच्छा थी, लेकिन वैश्विक कार्यों के लिए कोई प्राथमिकता नहीं थी, और साइट थोड़ा बदलने में कामयाब रही
- स्थानीय कैश रैमडिस्क में चले गए, इस वजह से प्रोजेक्ट कैश का आकार परिमाण के एक आदेश से अधिक बढ़ गया, दस बजे निष्क्रिय सेट
- रिपॉजिटरी से रीडिंग स्टैटिक्स को प्रत्येक नोड पर नेगनेक्स प्रक्रियाओं के एक अलग पूल में ले जाया जाता है, वितरक इसके लिए अनुरोध करता है, छोटे स्टैटिक्स के लिए एक स्थानीय कैश रैमडिस्क पर कॉन्फ़िगर किया गया है
- अनुप्रयोग-प्रबंधित वैश्विक कैश कई मेमेचेस नोड्स पर होस्ट किया गया
और यहां वे फिर से नेटवर्क उपकरणों के परिवहन सहित आठ घंटों के लिए साइटों की आंतरिक दुनिया को डिस्कनेक्ट करना चाहते हैं। Proxy_store का उपयोग करने की कोई इच्छा नहीं थी और हमने अगले स्तर पर जाने की कोशिश की।
3. प्रॉक्सी_चेचे_से_स्टेल
सभी परियोजनाओं पर प्रदर्शित
proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
निर्देश त्रुटियों के मामले में कैश से डेटा भेजने के लिए nginx को बताता है, भले ही यह कैश तत्व पहले से ही अप्रचलित माना जाता हो।
इसके अतिरिक्त
- मेम्नेच को नगनेक्स नोड्स पर उठाया गया था, मेकचे को डेटा लिखने वाली सभी परियोजनाएं अतिरिक्त रूप से ttl = 0 (अनंत जीवनकाल) के साथ इन उदाहरणों पर लिखी थीं
- प्रोजेक्ट कॉन्फिगर में कुछ ऑर्डर दिया जाता है - सभी अपस्ट्रीम सेटिंग्स (ऐप और मेमेचे) को अलग-अलग फाइलों में ले जाया जाता है
- व्यक्तिगत ब्लॉक के लिए, बैकएंड अनुपलब्ध होने पर डमी रिटर्न प्रदान किया जाता है
और फिर पल एक्स तक पूरी साइट का नियमित संचालन आता है, जब निम्नलिखित जोड़तोड़ होता है
- भंडारण से पढ़ने वाली प्रक्रियाओं के पूल को छोड़ दें - CDN में न आने वाले छोटे स्टैटिक्स, कैश_ का उपयोग करके वापस कर दिए जाते हैं
- हम एक गैर-मौजूद स्थानीय बंदरगाह पर अपस्ट्रीम के ऐप को फिर से लिखते हैं और इसे कनेक्शन_ टाइमआउट 5ms में सेट करते हैं, फिर से काम करता है
- हम मेमकेच पतों को फिर से लिखते हैं, यह हिस्सा सामान्य रूप से काम करता है
काम से पहले अभ्यास के दौरान, तकनीकी सहायता ने "उपयोगकर्ताओं से कोई शिकायत नहीं" वाक्यांश के साथ टिकटों को बंद करने की कृपा की। युद्ध मोड में - नौ घंटे की बैटरी जीवन, योजना सभी अपेक्षाओं को पूरा करती है - समाचार पढ़ा गया, वीडियो देखा गया, विज्ञापन कताई थी। हालाँकि यहाँ भी कुछ समस्याएं थीं
- कुछ अनुप्रयोग परिवर्तन आवश्यक थे
- हमारे कुछ प्रोजेक्ट्स नो-कैश करते हैं, उनमें से कुछ कॉन्फ़िगरेशन त्रुटियों के कारण हैं
- सभी स्थानों पर ताज़ा लेखों की उपलब्धता की गारंटी नहीं देता है, उपयोगकर्ताओं ने 404 वें और 502 वें स्थान पर ठोकर खाई
- कम-देखी जाने वाली परियोजनाएं अलग से खड़ी होती हैं, ऐसे काम से पहले उनके कैश को गर्म किया जाना चाहिए
- अभी भी अमान्य कैश डेटा से सुरक्षा नहीं है
एक सुखद बोनस के रूप में, सभी ट्वीक्स के बाद, हमें आवश्यक होने पर किसी भी परियोजना को स्टेटिक मोड में बदलने का अवसर मिला।
3.5
अगले चरण के लिए, मुख्य लक्ष्य "यस" स्थिति में "सब कुछ खत्म हो गया है" कहना सीखना होगा, हमें तत्काल 15/30 मिनट पहले परियोजना को वापस करने की आवश्यकता है, क्या आप इसे कर सकते हैं, और अब हम कारणों को ठीक करेंगे ")
proxy_storeproxy_cache_use_staleproxy_cache_pathMemcache :: सेट