2013-11-24 5 views
9

मेरे पास पाइथन Kazoo लाइब्रेरी के साथ एक बहुत ही अजीब मामला है। मैं अपने नीचे दिए गए कोड में क्या कर रहा हूं -घड़ियां और क्षणिक नोड काम नहीं करता है जब ज़ूकीपर की स्थिति स्वचालित रूप से बदल जाती है?

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

सब कुछ मेरे लिए बिल्कुल ठीक काम कर रहा है, अल्पकालिक नोड निर्भर है,

कभी कभी घड़ी मेरी znode भी ठीक काम कर रहा है पर ..., मैं क्योंकि कनेक्शन रुकावट की बहुत अजीब व्यवहार देख रहा हूँ या ड्रॉप। जैसा कि मैंने ऊपर बताया है, मैंने ज़ूकीपर को श्रोता जोड़ा है जो राज्य की निगरानी करेगा और मेरे पास एक प्रिंट स्टेटमेंट भी है .. मैं हमेशा देखता हूं, उन प्रिंट स्टेटमेंट को Lost, Suspended, Connected के रूप में मुद्रित किया जा रहा है, मुझे विश्वास है कि कनेक्शन बाधाओं के कारण और उसके बाद मेरे क्षणिक नोड्स मर जाते हैं और ज़ोनोड पर मेरी घड़ी भी काम नहीं करती है।

#!/usr/bin/python 

from kazoo.client import KazooClient 
from kazoo.client import KazooState 
from kazoo.protocol.states import EventType 


def watch_host(event): 
    print event 


def my_listener(state): 
    if state == KazooState.LOST: 
    # Register somewhere that the session was lost 
     print "Lost" 
    elif state == KazooState.SUSPENDED: 
    # Handle being disconnected from Zookeeper 
     print "Suspended" 
    else: 
    # Handle being connected/reconnected to Zookeeper 
    # what are we supposed to do here? 
    print "Being Connected/Reconnected" 


zk = KazooClient(hosts='127.0.0.1:2181') 
zk.start() 

zk.add_listener(my_listener) 

# start an ephemeral node 
zk.create("/my/example/h0", b"some value", None, True) 

# put a watch on my znode 
children = zk.get_children("/my/example/test1", watch=watch_host) 


while True: 
    time.sleep(5) 

वहाँ किसी भी तरह से इस समस्या को दूर करने के लिए है -

नीचे मेरी कोड है जो हमेशा के लिए चलाता है? मैं चाहता हूं कि जब भी मेरा जुकीपर राज्य Lost या Suspended या Connected में बदल जाता है। मैं इसे फिर से बनाकर अपना क्षणिक नोड बनाना चाहता हूं (यदि यह सही दृष्टिकोण है) और ज़ोनोड पर मेरी घड़ी भी हमेशा काम कर रही है।

क्योंकि मैं हमेशा के लिए अपना प्रोग्राम चला रहा हूं, इसलिए यदि किसी भी कारण से जुकीपर राज्य कनेक्शन बाधाओं के कारण बदलता है और यह स्वचालित रूप से फिर से कनेक्ट हो जाता है, तो मुझे यह सुनिश्चित करना होगा कि मेरा क्षणिक नोड भी ऊपर हो और मेरी घड़ियों znode भी स्वतः ही काम शुरू ..

वर्तमान में मेरे अल्पकालिक अप मर जाता है और यह भी देखता है तो राज्य स्वचालित रूप से बदल रहा है काम नहीं करता है ..

किसी भी विचार कैसे इस समस्या को दूर करने के लिए?

+0

यह अजीब है लेकिन 'खोया' -> 'निलंबित' संक्रमण अमान्य प्रतीत होता है। क्या यह सही संक्रमण अनुक्रम है जिसे आप 'खोया' -> 'निलंबित' -> 'कनेक्ट किया गया' देखते हैं? – twil

+0

क्या आप 'my_listener' की शाखा में क्षणिक नोड नहीं बना सकते हैं, जहां आप जानते हैं कि आप कनेक्ट हैं या फिर से कनेक्ट हैं? ऐसा लगता है जैसे आप तात्कालिक नोड * हर बार * बनाना चाहते हैं * आप केवल प्रारंभिक कनेक्शन पर कनेक्ट नहीं होते हैं, फिर से कनेक्ट होते हैं - लेकिन आपका कोड केवल बाद वाला होता है। –

उत्तर

4

मैं अजगर बारे में कुछ पता नहीं है, लेकिन मुझे लगता है कि मैं ZNodes
Znodes बारे में कुछ बुनियादी अंक पर प्रकाश डाला जाएगा दो प्रकार के होते हैं: ephemeral या persistent

  • एक ephemeral znode बनाने के रूप में चिड़ियाघर संचालक द्वारा हटा दिया जाता है जैसे ही ग्राहक का सत्र समाप्त होता है।
    एक बार बनाया गया persistent znode केवल क्लाइंट द्वारा स्पष्ट रूप से हटाए जाने पर हटा दिया जाता है (जरूरी नहीं कि इसे बनाया गया हो)।
  • एक ephemeral znode में कभी भी ephemeral वाले से जुड़े कोई भी बच्चे नहीं होंगे। नोड पर
  • पहरेदार, (जावा एपीआई संस्करण में) केवल एक बार ट्रिगर कर रहे हैं ताकि आप ताकि आप नोड्स

जावा संस्करण (जावा एपीआई) में पर भावी अपडेट के लिए ट्रिगर मिल घटना पुन: पंजीकृत करने की जरूरत है यदि क्लाइंट अधिक से अधिक सर्वर से कनेक्ट होता है, और यदि यह कनेक्टेड सर्वर से डिस्कनेक्ट हो जाता है तो हमें KeeperState.Disconnected के साथ ट्रिगर किया जाता है लेकिन यह इस समय ephemeral znode के बीच किसी अन्य सर्वर, को दोबारा जोड़ता है और कनेक्ट करता है और सभी घड़ियों को बरकरार रखा जाता हैवे को नष्ट नहीं कर रहे हैं, लेकिन एक बार ईवेंट KeeperState.Expired के साथ होता है (जब ग्राहक निर्दिष्ट समय में किसी भी सर्वर के साथ कनेक्शन स्थापित करने में असमर्थ होता है) तो ephemeral znode नष्ट हो जाता है और हमें एक नया क्लाइंट कनेक्शन बनाना होगा (एक नया ZooKeeper उदाहरण तत्काल करें) अगर हम ensemble तक पहुंच चाहते हैं और फिर सब कुछ फिर से स्थापित नोड निर्माण और घड़ियों जोड़ने।

तो मैं अपने मामले में लगता है कि यह भी इस लागू हो सकता है, के रूप में Understanding Kazoo States Section

में उल्लेख खो से कनेक्शन संक्रमण, किसी भी अल्पकालिक नोड्स नहीं बनाई गई है Zookeeper से निकाल दिया जाएगा है। यह उन सभी व्यंजनों को प्रभावित करता है जो तात्कालिक नोड्स बनाते हैं, जैसे लॉक रेसिपी। राज्य संक्रमणों को फिर से कनेक्ट करने के बाद लॉक की फिर से अधिग्रहण की आवश्यकता होगी। यह संक्रमण तब होता है जब कोई सत्र समाप्त हो जाता है या जब आप क्लाइंट कनेक्शन को रोकते हैं।

आशा है कि यह जानकारी आपको विभिन्न राज्यों को समझने में मदद करेगी और फिर सब कुछ फिर से कॉन्फ़िगर करें।

5

यह बात है, जब कनेक्शन में कोई राज्य परिवर्तन होता है, तो आपका वॉचर भी ट्रिगर हो जाएगा। एक घटना है जो वॉचर को दी गई है। यह कुछ नहीं हो सकता है जैसे nodeDataChanged या nodeChildrenChanged। हालांकि, चूंकि आपका सत्र समाप्त होने पर आपकी रुचि रखने वाली किसी घटना के बारे में अधिसूचित होना असंभव होगा या कोई कनेक्शन समस्या है, इसलिए आपके वॉचर को इन सत्र समस्याओं के बारे में सूचित किया जाएगा। मेरा मानना ​​है कि इसके लिए इवेंट प्रकार "कोई नहीं है।"

से http://zookeeper.apache.org/doc/trunk/zookeeperProgrammers.html#ch_zkWatches

हालात घड़ियाँ के बारे में याद करने के लिए

  • घड़ियाँ एक बार चलाता है कर रहे हैं; यदि आपको घड़ी की घटना मिलती है और आप भविष्य में परिवर्तनों को सूचित करने के लिए चाहते हैं, तो आपको एक और घड़ी सेट करनी होगी।
  • क्योंकि घड़ियों एक बार ट्रिगर होते हैं और के बीच विलंब होता है और घड़ी प्राप्त करने के लिए एक नया अनुरोध भेजते हैं, तो आप विश्वसनीय रूप से ज़ूकीपर में नोड के साथ होने वाले प्रत्येक परिवर्तन को देख सकते हैं। उस मामले को संभालने के लिए तैयार किया गया है जहां ज़ोनोड ईवेंट को प्राप्त करने और घड़ी को फिर से सेट करने के बीच कई बार बदलता है। (आप देखभाल नहीं कर सकते हैं, लेकिन कम से कम यह महसूस हो सकता है।)
  • एक घड़ी ऑब्जेक्ट, या फ़ंक्शन/संदर्भ जोड़ी, किसी दिए गए अधिसूचना के लिए केवल पर ट्रिगर किया जाएगा। उदाहरण के लिए, यदि एक ही घड़ी ऑब्जेक्ट मौजूद है और एक ही फ़ाइल के लिए GetData कॉल और है कि फ़ाइल को हटा दिया गया है, तो घड़ी ऑब्जेक्ट को फ़ाइल के लिए हटाने की अधिसूचना के साथ केवल लागू किया जाएगा।
  • जब आप किसी सर्वर से डिस्कनेक्ट करते हैं (उदाहरण के लिए, जब सर्वर विफल रहता है), तो कनेक्शन को पुनर्निर्मित होने तक आपको कोई घड़ी नहीं मिलेगी। इस कारण से सत्र घटनाएं सभी बकाया घड़ी हैंडलर को भेजी जाती हैं। सुरक्षित मोड में जाने के लिए सत्र ईवेंट का उपयोग करें: डिस्कनेक्ट होने पर आपको ईवेंट प्राप्त नहीं होंगे, इसलिए आपकी प्रक्रिया को उस मोड में रूढ़िवादी रूप से कार्य करना चाहिए।

तो, लंबी कहानी छोटी, आपके वॉचर को यह देखने के लिए घटना को खोलना चाहिए कि यह किस तरह का है और किसी प्रकार के फेलओवर मोड में जाकर किसी भी प्रकार के उचित तरीके से प्रतिक्रिया नहीं देनी चाहिए।

मैं आमतौर पर जो करता हूं वह है मेरे वॉचर ऑब्जेक्ट्स श्रोताओं भी हैं। जब पुन: कनेक्शन होता है, तो मैं अपनी घड़ियों को रीसेट करके प्रतिक्रिया देता हूं, यह सुनिश्चित करना सुनिश्चित करता हूं कि उपयुक्त ज़ोनोड मौजूद हैं और आवश्यक होने पर उन्हें बनाते हैं।

संबंधित मुद्दे