2012-09-22 13 views
6

लागू करें उबंटू पर चल रहा है। कार्यक्रम सी ++ में है। मेरे पास अलग-अलग मेजबानों पर 2 प्रक्रिया चल रही है, जब कोई मास्टर होता है और एक दास होता है (उनके बीच कोई प्राथमिकता नहीं है, केवल एक ही संभाल अनुरोध है।)। केवल एक प्रक्रिया मास्टर और हैंडल अनुरोध हो सकती है। दो प्रक्रिया हमेशा ऊपर होती है और यदि वे दुर्घटनाग्रस्त हो जाते हैं तो वहां एक घड़ी वाला कुत्ता होता है जो उन्हें पुनरारंभ करता है।मास्टर-गुलाम

मेजबान नेटवर्क केबल से जुड़े हुए हैं।

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

कैसे एक ही समय में ज्ञान होना आवश्यक दोनों से रोकने के लिए:

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

क्या आपको लगता है कि जीवित रहने या जिंदा रखने के लिए पूछना बेहतर होगा? (मेरी राय के लिए धक्का से ज़िंदा रहने के लिए पूछना बेहतर है)

कोई अन्य अच्छी सलाह और नुकसान स्वागत से अधिक होगा।

उत्तर

4

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

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

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

+1

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

+0

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

+0

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

1

हो सकता था इस समस्या को हल करने का सामान्य तरीका चुनाव आयोजित करना है। सिस्टम में हर कोई डेटा साझा करता है जिसे वे एल्गोरिदम में इनपुट के रूप में उपयोग करेंगे ताकि सभी एक ही निष्कर्ष पर आ सकें।

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

क्षणिक कनेक्टिविटी दोषों के बारे में समस्या के लिए, Byzantine Generals देखें।

यह भी देखें:

+0

बहुत बहुत धन्यवाद। मुझे समस्याओं का नाम देना अच्छा लगता है। क्या आप 2 नोड्स के बीच सरल चयन उपयोग के लिए एक उदाहरण दे सकते हैं? मैं कनेक्टिविटी से एक ही समय में स्टार्टअप के बारे में चिंता कर रहा हूं। –

+0

चुनाव के उदाहरण जोड़े गए। –