2016-09-27 7 views
10

यदि मैं गलत नहीं हूं, तो क्लस्टर में कम से कम एक नोड्स को जानने के लिए कोई कैसंड्रा क्लस्टर से कनेक्ट हो सकता है, और फिर अन्य लोगों की खोज की जा सकती है।डेटास्टैक्स जावा चालक कनेक्ट नहीं होता है यदि कोई होस्ट गुम हो जाता है

चलें कहते हैं कि मैं तीन नोड्स (1, 2 और 3) है और मैं इस तरह उन नोड्स से कनेक्ट:

Cluster.builder().addContactPoints("1,2,3".split(",")).build();

तो फिर, अगर उदाहरण के लिए नोड 3 नीचे चला जाता है, और आईपी नहीं किया जा सकता के रूप में किए गए दस्तावेज़ों में कहा गया संकल्प लिया, कोड की इस पंक्ति एक IllegalArgumentException फेंक देगा:

@throws IllegalArgumentException if no IP address for at least one of {@code addresses} could be found

क्यों किसी को भी इस व्यवहार चाहेगा? मेरा मतलब है, अगर नोड्स में से एक नीचे है, तो मैं चाहता हूं कि ऐप चलाने में सक्षम हो, क्योंकि कैसंड्रा अभी भी ठीक काम कर रहा है।

मैंने यह Cassandra Java driver: how many contact points is reasonable? चेक किया है लेकिन यह मेरे प्रश्न का उत्तर नहीं देता है क्योंकि यह मेजबानों के बारे में कुछ भी नहीं कहता है, पहुंचने योग्य नहीं हो सकता है।

मुझे इसे कैसे संभालना चाहिए? शायद यह जावा चालक के दूसरे संस्करण में बदल गया है? मैं वर्तमान में cassandra-driver-core-3.0.3

उत्तर

6

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

अपने मामले (मेजबान DNS प्रविष्टियों से हटा दिया गया) में समाधान के रूप में आप बस विधि addContactPoint(String address) स्पष्ट बजाय addContactPoints(String... addresses) का उपयोग कर (जो दृश्य के पीछे बस प्रत्येक प्रदान की पते के लिए addContactPoint(String address) कहते हैं) की कह सकते हैं और अपने आप से अपवाद का प्रबंधन ।

Cluster.Builder builder = Cluster.builder(); 
// Boolean used to check if at least one host could be resolved 
boolean found = false; 
for (String address : "1,2,3".split(",")) { 
    try { 
     builder.addContactPoint(address); 
     // One host could be resolved 
     found = true; 
    } catch (IllegalArgumentException e) { 
     // This host could not be resolved so we log a message and keep going 
     Log.log(
      Level.WARNING, 
      String.format("The host '%s' is unknown so it will be ignored", address) 
     ); 
    } 
} 
if (!found) { 
    // No host could be resolved so we throw an exception 
    throw new IllegalStateException("All provided hosts are unknown"); 
} 
Cluster cluster = builder.build(); 

FYI करें : मैं सिर्फ एक टिकट बना लिया है जावा ड्राइवर https://datastax-oss.atlassian.net/browse/JAVA-1334 में सुधार का प्रस्ताव करने के

कोड कुछ इस तरह हो सकता है।

+1

यह एक अच्छा कामकाज है! टिकट बनाने के लिए भी धन्यवाद! – juan

0

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

+0

हाँ मुझे पता है, मैंने उद्धृत किया है।मैं एक समाधान की तलाश में हूं जिसमें एक नोड पहुंच योग्य नहीं है, कोड काम करता है। –

+0

मैं कह रहा हूं कि यह पहले से ही इसे पूरा करता है। एक अपवाद केवल तभी फेंक दिया जाता है जब निर्दिष्ट संपर्क बिंदुओं के सभी * पहुंच योग्य नहीं हैं। यदि संपर्क बिंदुओं का सबसेट पहुंच योग्य नहीं है तो चीजें अभी भी काम करेंगी। – nickmbailey

+0

नहीं, मुझे लगता है कि आप गलत हैं। पाठ स्पष्ट रूप से "कम से कम एक" कहता है जिसका अर्थ है कि अगर कोई आईपी पता किसी के लिए नहीं मिलता है, तो यह अपवाद फेंकता है। मैंने कोड की जांच की और इसकी तरह। एक और आईपी के रूप में "asdasd" लिखने का भी परीक्षण किया और यह दुर्घटनाग्रस्त हो गया। –

2

जैसा कि निक ने उल्लेख किया है, यह DNS संकल्प पर आधारित है, कैसंड्रा सर्वर स्वास्थ्य नहीं।

यदि आप अपने एप्लिकेशन को पुनः संयोजित करने के बजाय अपने पर्यावरण से मेजबान को हटाते हैं, तो आपको कोड में अपने संपर्क बिंदु को पकाए जाने पर विचार नहीं करना चाहिए, और इसके बजाय, उन्हें किसी अन्य माध्यम (पर्यावरण परिवर्तनीय, आरईएसटी सेवा, एकल DNS नाम जो हमेशा एक जीवित बीज, आदि को हल करता है)।

+0

हमारा पर्यावरण वास्तव में हमारे कोड से अधिक बार बदलता है, हमारे पास एक निजी क्लाउड है और हमारे वीएम गतिशील रूप से बदल सकते हैं। आपके पास एक मुद्दा है कि हम अपने अंत से एक कार्यवाही लागू करने का प्रयास कर सकते हैं, लेकिन मुझे यह भी लगता है कि यह सत्यापन ठीक किया जा सकता है, क्योंकि क्लस्टर अभी भी राज्य पाब्लो में काम करेगा, लेकिन ऐप शुरू नहीं होगा। – juan

+0

यदि आप एक वर्कअराउंड लागू नहीं करना चाहते हैं तो मैं जावा ड्राइवर https://datastax-oss.atlassian.net/projects/JAVA/summary के साथ कोई समस्या दर्ज करने की अनुशंसा करता हूं। मुझे लगता है कि केवल एक होस्टनाम की आवश्यकता को सुलझाने योग्य और चेतावनी के साथ नहीं होने वाले किसी भी व्यक्ति को हटाने का व्यवहार शायद उचित है। किसी भी मामले में मुझे लगता है कि आपके पास अपने प्रश्न का उत्तर है। स्टैक ओवरफ़्लो बाउंटी वास्तव में कोड परिवर्तन प्राप्त करने के लिए नहीं हैं, लेकिन मैं निश्चित रूप से जल्द ही जारी किए गए फ़िक्स को प्राप्त करने के लिए टिकट के साथ एक पैच सबमिट करने की अनुशंसा करता हूं। – nickmbailey

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