जटिल प्रणालियों में मजबूतता: एक शैक्षिक लेख सारांश

Unsplash पर व्लादिमीर कुडिनोव द्वारा फोटो

आज, हम स्टीवन डी। ग्रिबबल द्वारा 2001 में प्रकाशित "कांपलेक्स सिस्टम में रोबस्टनेस" शीर्षक के पेपर को देखने जा रहे हैं। सभी पुल उद्धरण और आंकड़े कागज से हैं।

इस पत्र का तर्क है कि सिस्टम के लिए एक सामान्य डिजाइन प्रतिमान मौलिक रूप से त्रुटिपूर्ण है, जिसके परिणामस्वरूप सिस्टम की जटिलता बढ़ने पर अस्थिर, अप्रत्याशित व्यवहार होता है।

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

उनके स्वभाव से, बड़े सिस्टम कई घटकों के जटिल इंटरैक्शन के माध्यम से संचालित होते हैं। यह इंटरैक्शन सिस्टम के तत्वों के एक व्यापक युग्मन की ओर जाता है; यह युग्मन मज़बूत हो सकता है (जैसे, किसी नेटवर्क में आसन्न राउटर के बीच भेजे गए पैकेट) या सूक्ष्म (जैसे, विस्तृत क्षेत्र नेटवर्क में रूटिंग विज्ञापनों के सिंक्रनाइज़ेशन)।

एक सामान्य विशेषता यह है कि इस तरह की बड़ी प्रणालियों का प्रदर्शन बटरफ्लाई प्रभाव के रूप में जाना जाता है। यह प्रणाली में एक छोटे से अप्रत्याशित गड़बड़ी को संदर्भित करता है जिसके परिणामस्वरूप विभिन्न घटकों की जटिल बातचीत होती है जो व्यापक परिवर्तन का कारण बनती है।

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

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

DDS: एक केस स्टडी

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

इस प्रणाली को एक भविष्य कहनेवाला डिजाइन दर्शन का उपयोग करके बनाया गया था जैसा कि ऊपर वर्णित है।

इस तरह के सिस्टम के साथ व्यापक अनुभव के आधार पर, हमने सिस्टम के सॉफ्टवेयर घटकों, एल्गोरिदम, प्रोटोकॉल और हार्डवेयर तत्वों के व्यवहार के बारे में तर्क करने का प्रयास किया, साथ ही साथ इसे प्राप्त होने वाले कार्यभार भी।

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

आगे, हम ऐसी कई विसंगतियों के बारे में बात करते हैं।

कचरा संग्रह थ्रेशिंग और बाउंडेड सिंक्रोनाइज़

सिस्टम डिजाइनरों ने सिस्टम में घटकों की विफलता का पता लगाने के लिए टाइमआउट का उपयोग किया। यदि किसी विशेष घटक ने निर्दिष्ट समय के भीतर जवाब नहीं दिया, तो उसे मृत मान लिया गया। उन्होंने व्यवस्था में बंधी हुई समकालिकता को मान लिया।

डीडीएस को जावा में लागू किया गया था, और इसलिए कचरा संग्रह का उपयोग किया गया था। हमारे जेवीएम में कचरा कलेक्टर एक निशान-और-सफाई कलेक्टर था; परिणामस्वरूप, जेवीएम के ढेर में अधिक सक्रिय वस्तुएं निवास करती थीं, एक निश्चित मात्रा में पुनः प्राप्त करने के लिए कचरा कलेक्टर को चलाने की अवधि बढ़ जाएगी।

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

इसलिए, कचरा संग्रह ने बंधी हुई समकालिकता की धारणा का उल्लंघन किया जब यह संतृप्ति बिंदु के निकट या उससे परे था।

स्लो लीक्स और को-रिलेटेड फेल्योर

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

हालांकि, इस धारणा का उल्लंघन किया गया था जब उन्हें अपने कोड में एक दौड़ की स्थिति का सामना करना पड़ा जिसने शुद्धता को प्रभावित किए बिना एक स्मृति रिसाव का कारण बना।

जब भी हमने अपना सिस्टम लॉन्च किया, हम एक ही समय में सभी ईंटों को लॉन्च करना चाहते थे। सिस्टम में मोटे तौर पर संतुलित भार को देखते हुए, सभी ईंटें लगभग एक ही समय में, एक ही समय में लॉन्च होने के कई दिनों बाद बाहर निकल जाएंगी। हमने यह भी अनुमान लगाया कि हमारे स्वचालित फेलओवर तंत्र ने एक सहकर्मी के असफल होने के बाद प्रतिकृति पर भार बढ़ाकर इस स्थिति को बढ़ा दिया है, जिस दर से प्रतिकृति लीक हो गई है।

चूंकि सभी प्रतिकृतियों को प्रदर्शन में गिरावट और अन्य मुद्दों को ध्यान में रखे बिना एक समान भार के अधीन किया गया था, इसने प्रतिकृतियों के बीच एक युग्मन बनाया ...

… जब एक धीमी मेमोरी लीक के साथ, हमारी स्वतंत्र विफलताओं की धारणा का उल्लंघन होता है, जिसके कारण हमारी प्रणाली अनुपलब्धता और आंशिक डेटा हानि का अनुभव करती है

अनियंत्रित निर्भरता और विफलता-रोक

इस धारणा के आधार पर कि यदि कोई घटक समाप्त हो गया है, तो यह विफल हो गया है, डिजाइनरों ने "असफल-रोक" विफलताओं को भी मान लिया है, यह एक ऐसा घटक है जो विफल हो गया है थोड़ी देर बाद कार्य करना फिर से शुरू नहीं करेगा। सिस्टम में ईंटों ने एक अतुल्यकालिक तरीके से सभी लंबे-विलंबता कार्य (डिस्क I / O) का प्रदर्शन किया।

हालांकि, वे यह नोटिस करने में विफल रहे कि उनके कोड के कुछ हिस्सों ने ब्लॉकिंग फ़ंक्शन कॉल का उपयोग किया है। इससे मुख्य घटना-हैंडलिंग धागा बेतरतीब ढंग से उधार लिया जाता है जिससे ईंटें कुछ मिनटों के लिए बेवजह जब्त हो जाती हैं और पोस्ट फिर से शुरू हो जाती हैं।

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

रोबस्ट सिस्टम्स की ओर

.. एक जटिल, युग्मित प्रणाली में परिवर्तन से बड़े पैमाने पर व्यवहार में अप्रत्याशित परिवर्तन हो सकते हैं, संभवतः अपने डिजाइनरों के अपेक्षित संचालन शासन के बाहर प्रणाली को ले जा सकते हैं।

कुछ समाधान जो हमें अधिक मजबूत सिस्टम बनाने में मदद कर सकते हैं:

व्यवस्थित ओवर-प्रोविजनिंग

जब संतृप्ति बिंदु के करीब पहुंचते हैं, तो सिस्टम अप्रत्याशित व्यवहार को समायोजित करने की कोशिश करते समय नाजुक हो जाते हैं। इसका मुकाबला करने का एक तरीका सिस्टम को जानबूझकर ओवर-प्रोविजन करना है।

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

प्रवेश नियंत्रण का उपयोग करें

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

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

सिस्टम में आत्मनिरीक्षण का निर्माण करें

एक आत्मनिरीक्षण प्रणाली वह है जिसमें सिस्टम की निगरानी करने की क्षमता शुरू से ही डिज़ाइन की गई है।

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

नियंत्रण लूप को बंद करके अनुकूलता का परिचय दें

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

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

असफलता की योजना

कॉम्प्लेक्स सिस्टम को असफलता की उम्मीद करनी चाहिए और उसके अनुसार योजना बनानी चाहिए।

ऐसा करने के लिए तकनीकों का एक जोड़ा:

  1. स्थानीय रूप से विफलताओं को समाहित करने के लिए घटकों का डिकॉप्लिंग
  2. लेनदेन जैसे मजबूत अमूर्त का उपयोग करके क्षति को कम करें
  3. विफलता की स्थिति में समय की मात्रा कम करें (तेजी से ठीक होने के लिए चेकपॉइंटिंग का उपयोग करके)

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

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