कुबेरनेट्स में भंडारण: ओपनईबीएस बनाम रूक (सेफ) बनाम रैंचर लॉन्गहॉर्न बनाम स्टोरेजओएस बनाम रॉबिन बनाम पोर्टवर्क्स बनाम लिनस्टोर

कुबेरनेट्स में भंडारण: ओपनईबीएस बनाम रूक (सेफ) बनाम रैंचर लॉन्गहॉर्न बनाम स्टोरेजओएस बनाम रॉबिन बनाम पोर्टवर्क्स बनाम लिनस्टोर

अद्यतन!. टिप्पणियों में, पाठकों में से एक ने प्रयास करने का सुझाव दिया लिनस्टोर (हो सकता है कि वह स्वयं इस पर काम कर रहा हो) इसलिए मैंने इस समाधान के बारे में एक अनुभाग जोड़ा है। मैंने भी लिखा इसे कैसे स्थापित करें, इस पर पोस्ट करें, क्योंकि यह प्रक्रिया बाकियों से बहुत अलग है।

ईमानदारी से कहूं तो मैंने हार मान ली और हार मान ली Kubernetes (कम से कम अभी के लिए)। मैं इस्तेमाल करूँगा Heroku. क्यों? भंडारण के कारण! किसने सोचा होगा कि मैं कुबेरनेट्स की तुलना में भंडारण के साथ अधिक छेड़छाड़ करूंगा। मैं उपयोग करता हूं हेट्ज़नर बादलक्योंकि यह सस्ता है और प्रदर्शन अच्छा है और शुरू से ही मैं इसका उपयोग करके क्लस्टर तैनात कर रहा हूं क्षेत्र लगानेवाला. मैंने Google/Amazon/Microsoft/DigitalOcean इत्यादि से प्रबंधित Kubernetes सेवाओं का प्रयास नहीं किया, क्योंकि मैं स्वयं सब कुछ सीखना चाहता था। मैं भी मितव्ययी हूं.

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

मैंने 6-7 भंडारण समाधानों का परीक्षण किया:

ओपनईबीएस

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

संक्षेप में, जीवा थोड़ा तेज़ है, और लोकलपीवी आम तौर पर तेज़ है, सीधे तौर पर डिस्क बेंचमार्क से भी बदतर नहीं है। लोकलपीवी के साथ समस्या यह है कि वॉल्यूम को केवल उसी नोड पर एक्सेस किया जा सकता है जहां इसे तैयार किया गया था, और इसमें कोई प्रतिकृति नहीं है। मुझे इसके माध्यम से बैकअप पुनर्स्थापित करने में कुछ समस्याएँ हुईं सेलबोट एक नए क्लस्टर पर क्योंकि नोड नाम अलग थे। अगर हम बैकअप की बात करें तो cStor के पास है वेलेरो के लिए प्लगइन, जिसके साथ आप एक समय में स्नैपशॉट का ऑफ-साइट बैकअप बना सकते हैं, जो वेलेरो-रेस्टिक के साथ फ़ाइल-स्तरीय बैकअप की तुलना में अधिक सुविधाजनक है। मैंने लिखा कई स्क्रिप्ट, इस प्लगइन के साथ बैकअप और रिस्टोर को प्रबंधित करना आसान बनाने के लिए। कुल मिलाकर, मुझे वास्तव में OpenEBS पसंद है, लेकिन इसका प्रदर्शन...

कौआ

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

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

रंचर लॉन्गहॉर्न

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

भंडारण

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

रोबिन

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

पोर्टवर्क्स

मेरे पास यहाँ कहने के लिए बहुत कुछ नहीं है। यह एक सशुल्क उत्पाद है, उतना ही बढ़िया और महंगा भी। प्रदर्शन बिल्कुल अद्भुत है. यह अब तक का सबसे अच्छा संकेतक है. स्लैक ने मुझे बताया कि मूल्य निर्धारण $205 प्रति माह प्रति नोड से शुरू होता है, जैसा कि Google के GKE मार्केटप्लेस में सूचीबद्ध है। मुझे नहीं पता कि अगर आप सीधे खरीदेंगे तो यह सस्ता होगा या नहीं। मैं वैसे भी इसे बर्दाश्त नहीं कर सकता, इसलिए मुझे बहुत निराशा हुई कि डेवलपर लाइसेंस (1 टीबी और 3 नोड्स तक) कुबेरनेट्स के साथ व्यावहारिक रूप से बेकार है जब तक कि आप स्थिर प्रावधान से संतुष्ट नहीं होते। मैं उम्मीद कर रहा था कि परीक्षण अवधि के अंत में वॉल्यूम लाइसेंस स्वचालित रूप से डेवलपर के लिए डाउनग्रेड हो जाएगा, लेकिन ऐसा नहीं हुआ। डेवलपर लाइसेंस का उपयोग केवल सीधे डॉकर के साथ किया जा सकता है, और कुबेरनेट्स में कॉन्फ़िगरेशन बहुत बोझिल और सीमित है। बेशक, मैं ओपन सोर्स पसंद करता हूं, लेकिन अगर मेरे पास पैसा होता, तो मैं निश्चित रूप से पोर्टवर्क्स चुनता। अब तक, इसके प्रदर्शन की तुलना अन्य विकल्पों से नहीं की जा सकती है।

लिनस्टोर

मैंने यह अनुभाग पोस्ट के प्रकाशन के बाद जोड़ा, जब एक पाठक ने लिनस्टोर को आज़माने का सुझाव दिया। मैंने इसे आज़माया और मुझे यह पसंद आया! लेकिन हमें अभी भी और गहराई में जाने की जरूरत है। अब मैं कह सकता हूं कि प्रदर्शन खराब नहीं है (मैंने नीचे बेंचमार्क परिणाम जोड़े हैं)। मूलतः, मुझे बिना किसी ओवरहेड के, सीधे डिस्क के समान ही प्रदर्शन मिला। (सीधे यह न पूछें कि पोर्टवर्क्स के पास ड्राइव बेंचमार्क से बेहतर संख्याएँ क्यों हैं। मुझे कोई अंदाज़ा नहीं है। जादू, मुझे लगता है।) इसलिए लिनस्टोर अब तक बहुत प्रभावी लगता है। इसे स्थापित करना उतना कठिन नहीं है, लेकिन यह अन्य विकल्पों जितना आसान नहीं है। सबसे पहले मुझे लिनस्टोर (कर्नेल मॉड्यूल और उपकरण/सेवाएं) स्थापित करना था और सीधे होस्ट पर कुबेरनेट्स के बाहर पतली प्रावधान और स्नैपशॉट समर्थन के लिए एलवीएम कॉन्फ़िगर करना था, और फिर कुबेरनेट्स से स्टोरेज का उपयोग करने के लिए आवश्यक संसाधन बनाना था। मुझे यह पसंद नहीं आया कि यह CentOS पर काम नहीं करता और मुझे Ubuntu का उपयोग करना पड़ा। बेशक, भयानक नहीं है, लेकिन थोड़ा परेशान करने वाला है, क्योंकि दस्तावेज़ (जो वैसे, उत्कृष्ट है) कई पैकेजों का उल्लेख करता है जो निर्दिष्ट एपेल रिपॉजिटरी में नहीं पाए जा सकते हैं। लिनस्टोर में स्नैपशॉट हैं, लेकिन ऑफ-साइट बैकअप नहीं हैं, इसलिए यहां फिर से मुझे बैकअप वॉल्यूम के लिए रेस्टिक के साथ वेलेरो का उपयोग करना पड़ा। मैं फ़ाइल-स्तरीय बैकअप के बजाय स्नैपशॉट को प्राथमिकता दूंगा, लेकिन यदि समाधान निष्पादन योग्य और विश्वसनीय है तो इसे सहन किया जा सकता है। लिनस्टोर खुला स्रोत है लेकिन उसने समर्थन का भुगतान किया है। अगर मैं सही ढंग से समझता हूं, तो इसका उपयोग बिना किसी प्रतिबंध के किया जा सकता है, भले ही आपके पास कोई समर्थन अनुबंध न हो, लेकिन इसे स्पष्ट करने की आवश्यकता है। मुझे नहीं पता कि कुबेरनेट्स के लिए लिनस्टोर का कितना परीक्षण किया गया है, लेकिन भंडारण परत स्वयं कुबेरनेट्स के बाहर है और, जाहिर है, समाधान कल दिखाई नहीं दिया, इसलिए संभवतः वास्तविक परिस्थितियों में इसका परीक्षण पहले ही किया जा चुका है। क्या यहां कोई समाधान है जो मुझे अपना मन बदलने और कुबेरनेट्स पर वापस जाने पर मजबूर कर देगा? मुझे नहीं पता। हमें अभी भी गहराई तक जाने और प्रतिकृति का अध्ययन करने की आवश्यकता है। चलो देखते हैं। लेकिन पहला प्रभाव अच्छा है. अधिक स्वतंत्रता पाने और नई चीजें सीखने के लिए मैं निश्चित रूप से हेरोकू के बजाय अपने स्वयं के कुबेरनेट क्लस्टर का उपयोग करना पसंद करूंगा। चूंकि लिनस्टोर को स्थापित करना दूसरों की तरह आसान नहीं है, इसलिए मैं जल्द ही इसके बारे में एक पोस्ट लिखूंगा।

मानक

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

वॉल्यूम बेंचमार्क के लिए मैंने इस मेनिफेस्ट का उपयोग किया:

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: dbench
spec:
  storageClassName: ...
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
---
apiVersion: batch/v1
kind: Job
metadata:
  name: dbench
spec:
  template:
    spec:
      containers:
      - name: dbench
        image: sotoaster/dbench:latest
        imagePullPolicy: IfNotPresent
        env:
          - name: DBENCH_MOUNTPOINT
            value: /data
          - name: FIO_SIZE
            value: 1G
        volumeMounts:
        - name: dbench-pv
          mountPath: /data
      restartPolicy: Never
      volumes:
      - name: dbench-pv
        persistentVolumeClaim:
          claimName: dbench
  backoffLimit: 4

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

कुबेरनेट्स में भंडारण: ओपनईबीएस बनाम रूक (सेफ) बनाम रैंचर लॉन्गहॉर्न बनाम स्टोरेजओएस बनाम रॉबिन बनाम पोर्टवर्क्स बनाम लिनस्टोर

मैंने प्रत्येक मीट्रिक के लिए सर्वोत्तम मान को हरे रंग में और सबसे खराब को लाल रंग में हाइलाइट किया है।

निष्कर्ष

जैसा कि आप देख सकते हैं, ज्यादातर मामलों में पोर्टवर्क्स ने दूसरों की तुलना में बेहतर प्रदर्शन किया। लेकिन मेरे लिए यह महंगा है. मुझे नहीं पता कि रॉबिन की लागत कितनी है, लेकिन उनके पास एक बेहतरीन मुफ़्त संस्करण है, इसलिए यदि आप एक सशुल्क उत्पाद चाहते हैं, तो आप इसे आज़मा सकते हैं (उम्मीद है कि वे जल्द ही पुनर्स्थापना और बैकअप के साथ समस्या को ठीक कर देंगे)। तीन मुफ़्त में से, मुझे OpenEBS के साथ सबसे कम समस्याएँ हुईं, लेकिन इसका प्रदर्शन निराशाजनक है। यह अफ़सोस की बात है कि मैंने अधिक परिणाम सहेजे नहीं, लेकिन मुझे उम्मीद है कि संख्याएँ और मेरी टिप्पणियाँ आपकी मदद करेंगी।

स्रोत: www.habr.com

एक टिप्पणी जोड़ें