2013-04-24 7 views
5

मैं Astyanax क्लाइंट का उपयोग कैसेंड्रा डेटाबेस से डेटा पढ़ रहा हूँ।Astyanax क्लाइंट अधिकतम नोड प्रति कनेक्शन?

मैं एक कैसेंड्रा डेटाबेस में लगभग एक लाख अनन्य पंक्तियां है। मेरे पास चार नोड्स वाला एक क्रॉस colocation centre क्लस्टर है।

ये मेरी चार नोड्स हैं:

node1:9160 
    node2:9160 
    node3:9160 
    node4:9160 

मैं KeyCaching सक्षम किया है और SizeTieredCompaction रणनीति के रूप में अच्छी तरह से सक्षम है।

मैं एक क्लाइंट प्रोग्राम जो बहु कि Astyanax ग्राहक और जो मैं 20 धागे के साथ चल रहा का उपयोग कर कैसेंड्रा डेटाबेस से डेटा पढ़ा जाएगा है। यदि मैं अपने क्लाइंट प्रोग्राम को 20 थ्रेड के साथ चला रहा हूं, तो कैसंड्रा डेटाबेस से डेटा पढ़ने का प्रदर्शन घटता है।

तो पहली बात यह है कि मेरे दिमाग में कूदता है कि वहाँ कैसेंड्रा के लिए कनेक्शन पर विवाद हो सकता है (, वे एक पूल का उपयोग करते हैं तो कितने कनेक्शन बनाए रखा जा रहा रहे हैं)? मैं Astyanax क्लाइंट का उपयोग कर कनेक्शन बनाने के लिए नीचे दिए गए कोड का उपयोग कर रहा हूँ।

private CassandraAstyanaxConnection() { 
    context = new AstyanaxContext.Builder() 
    .forCluster(ModelConstants.CLUSTER) 
    .forKeyspace(ModelConstants.KEYSPACE) 
    .withAstyanaxConfiguration(new AstyanaxConfigurationImpl() 
     .setDiscoveryType(NodeDiscoveryType.RING_DESCRIBE) 
    ) 
    .withConnectionPoolConfiguration(new ConnectionPoolConfigurationImpl("MyConnectionPool") 
     .setPort(9160) 
     .setMaxConnsPerHost(1) 
     .setSeeds("nod1:9160,node2:9160,node3:9160,node4:9160") 
    ) 
    .withAstyanaxConfiguration(new AstyanaxConfigurationImpl() 
     .setCqlVersion("3.0.0") 
     .setTargetCassandraVersion("1.2")) 
    .withConnectionPoolMonitor(new CountingConnectionPoolMonitor()) 
    .buildKeyspace(ThriftFamilyFactory.getInstance()); 

    context.start(); 
    keyspace = context.getEntity(); 

    emp_cf = ColumnFamily.newColumnFamily(
     ModelConstants.COLUMN_FAMILY, 
     StringSerializer.get(), 
     StringSerializer.get()); 
} 

क्या मुझे प्रदर्शन में सुधार के लिए उपरोक्त कोड में किसी प्रकार के बदलाव करने की आवश्यकता है?

इस विधि क्या करता है?

setMaxConnsPerHost(1) 

क्या मुझे प्रदर्शन में सुधार करने के लिए इसे बढ़ाने की आवश्यकता है? मेरे पास चार नोड्स हैं, इसलिए मुझे इसे 4 में बदलना चाहिए?

और होगा setMaxConns (20) विधि कॉल? क्या मुझे प्रदर्शन को बेहतर बनाने के लिए इसे जोड़ने की ज़रूरत है? जैसा कि मैं अपने कार्यक्रम को कई धागे के साथ चलाऊंगा।

उत्तर

9

maxConnsPerHost/maxConns पर विवरण आप इस जवाब की जांच कर सकते के लिए: setMaxConns and setMaxConnsPerHost in Astyanax client

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

मुझे नहीं लगता कि प्रयोगों और सिमुलेशन के बिना भारी लोड क्लस्टर के लिए इष्टतम प्रदर्शन प्राप्त करना संभव है।

कैसेंड्रा पर मध्यम भार के साथ कार्यों के लिए मैं आमतौर पर एक सामान्य नियम के उपयोग करें:

maxConnsPerHost ~= <Number of cores per host>/<Replication factor> + 1 

यही है, प्रतिकृति कारक 3 के साथ 8 कोर बक्से के एक समूह के लिए, maxConnsPerHost आसपास 4. यह मान होना चाहिए भारी लोड परिदृश्यों में प्रयोगों के लिए भी एक अच्छा प्रारंभिक बिंदु है।

प्रेरणा: N नोड्स का एक समूह C कोर प्रत्येक N * C कोर कुल है। प्रतिकृति कारक R, R कोर (विभिन्न नोड्स के) के साथ अनुरोध को संसाधित करने के लिए आवश्यक है। तो, हर पल पर क्लस्टर N * C/R अनुरोधों तक संसाधित कर सकता है। इस नंबर के आसपास समवर्ती कनेक्शन की मात्रा रखना एक अच्छा विचार है। प्रति मेजबान कनेक्शन की संख्या की गणना करने के लिए N द्वारा इसे विभाजित करें। नेटवर्क विलंबता आदि के लिए प्रति होस्ट 1 अतिरिक्त कनेक्शन जोड़ें, यह है।

अद्यतन: सरल ग्राहक प्रदर्शन ट्यूनिंग:

  • कुछ maxConnsPerHost मूल्य
  • अनुकरण भार के साथ प्रारंभ और निरीक्षण CPU उपयोग और org.apache.cassandra.request->***Stage->pendingTasks JXM तेजी से बढ़ाने के लिए जिम्मेदार बताते हैं
  • बढ़ाएँ maxConnsPerHostpendingTasks तक शुरू होता है। यह शायद इष्टतम मूल्य है।
  • क्लस्टर नोड्स पर सीपीयू लोड लगभग 50-70% होना चाहिए। यदि यह बहुत कम है - सर्वर कॉन्फ़िगरेशन के साथ शायद कुछ गलत है।
+0

धन्यवाद सुझाव के लिए वाइल्डफायर। आपकी मदद की सराहना की। और setMaxConns के बारे में क्या? इसके लिए हमें क्या मूल्य निर्धारित करना चाहिए? यह तय करने के लिए हम किस प्रकार का तर्क करते हैं। –

+0

@ फ़ारहानजमाल: सेटमैक्सकॉन का उपयोग केवल कनेक्शनपूलटाइप.बीएजी के साथ किया जाता है, इसे अन्य कार्यान्वयन में आसानी से अनदेखा किया जाता है। यदि आप बीएजी कनेक्शन पूल का उपयोग करते हैं, तो आप इस विशेषता को थ्रेड की अधिकतम संख्या में सेट कर सकते हैं जो एक साथ कैसंद्रा को अनुरोध भेज सकता है। – Wildfire

+0

सुझाव के लिए धन्यवाद। आम तौर पर मुझे किस कनेक्शन पूल का उपयोग करना चाहिए? मतलब है कि कनेक्शन पूलिंग मुझे तेजी से पढ़ने के प्रदर्शन की अनुमति देगा। वर्तमान में, मेरे उपर्युक्त उदाहरण में, मैं 'कनेक्शन पुल कॉन्फ़िगरेशन आईएमएलएल' का उपयोग कर रहा हूं। क्या आपके पास इसके लिए कोई सिफारिश भी है? –

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