2011-01-17 12 views
10

परिकल्पित सवाल - अगर मैं इस तरह कई memcached सर्वर है:एकाधिक memcached सर्वर

//PHP 
$MEMCACHE_SERVERS = array(
    "10.1.1.1", //web1 
    "10.1.1.2", //web2 
    "10.1.1.3", //web3 
); 
$memcache = new Memcache(); 
foreach($MEMCACHE_SERVERS as $server){ 
    $memcache->addServer ($server); 
} 

और फिर मैं इस तरह डेटा सेट:

$huge_data_for_frong_page = 'some data blah blah blah'; 
$memcache->set("huge_data_for_frong_page", $huge_data_for_frong_page); 

और फिर मैं डेटा पुनः प्राप्त इस तरह:

$huge_data_for_frong_page = $memcache->get("huge_data_for_frong_page"); 

जब मैं memcached सर्वर से यह डेटा पुनर्प्राप्त करना चाहता हूं - php memcached क्लाइंट कैसे पता करेगा कि इस डेटा के लिए कौन सा सर्वर क्वेरी करना है? या मेमकैड क्लाइंट सभी memcached सर्वर से पूछताछ करने जा रहा है?

+0

यह पूछने के लिए धन्यवाद। तो सब कुछ, ऐसा लगता है कि पूरे उद्देश्य में लिखना/पढ़ना उद्देश्य और अनावश्यकता नहीं है? मैं अनावश्यकता की तलाश में हूं और कम से कम पुष्टि करता हूं कि मैंने क्या सोचा था। – Till

+0

[यह प्रश्न] (http://stackoverflow.com/questions/4038094/using-multiple-memcache-servers-in-a-pool/4038108#4038108) बिल्कुल वही नहीं है, लेकिन मेरे उत्तर में आपको जवाब देना चाहिए सवाल भी। –

+0

धन्यवाद ... क्या आप जानते हैं कि memcached क्लाइंट शेष स्वचालित रूप से अनुरोध लिखते हैं? या जब तक यह भर जाता है तब तक यह पहले सर्वर पर जाता है और फिर दूसरे तक एक दूसरे तक भर जाता है और तीसरा एक इत्यादि। – Stann

उत्तर

13

ठीक है आप इसके बारे में किताबें लिख सकते हैं लेकिन मूल सिद्धांत यह है कि कुछ अलग दृष्टिकोण हैं।

कैशिंग के लिए सबसे आम और समझदार दृष्टिकोण sharding है। जिसका अर्थ है कि डेटा केवल एक सर्वर पर ही लगाया जाता है और यह निर्धारित करने के लिए कुछ विधि का उपयोग किया जाता है कि यह कौन सा सर्वर है। तो इसे इस सर्वर से लाया जा सकता है और केवल एक सर्वर शामिल है।

यह स्पष्ट रूप से कुंजी/मूल्य वातावरण में memcached के रूप में अच्छी तरह से काम करता है।

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

यह प्रक्रिया कम या ज्यादा समान संतुलन पैदा करती है।

यह वास्तव में memcached में कैसे किया गया है, लेकिन निश्चित रूप से कुछ प्रकार के हैश।

लेकिन सावधान रहें कि यह teqnique अत्यधिक उपलब्ध नहीं है। तो अगर एक सर्वर विफल रहता है तो प्रविष्टियां चली जाती हैं। तो आप स्पष्ट रूप से केवल कैशिंग उद्देश्यों के लिए इसका उपयोग कर सकते हैं।

अन्य teqniques, उदाहरण के लिए संसाधनों की उच्च उपलब्धता आवश्यक है, जो गणना करने में लंबा समय लगता है और स्वचालित रूप से पृष्ठभूमि में स्वचालित रूप से गर्म हो जाता है, प्रतिकृति शामिल है।

कैशिंग वातावरण में सबसे आम रूप नवीनतम-टाइमस्टैम्प संघर्ष समाधान के साथ मास्टर-मास्टर प्रतिकृति है। जिसका मूल रूप से मतलब है कि प्रत्येक सर्वर को हर सर्वर से डेटा मिलता है जो अभी तक स्थानीय सर्वर पर नहीं है (यह प्रतिकृति लॉग और बाइट ऑफ़सेट का उपयोग करके किया जाता है)। यदि कोई संघर्ष होता है तो नवीनतम संस्करण का उपयोग किया जाता है (सर्वर के बीच थोड़ी देर ऑफसेट को नजरअंदाज कर दिया जाता है)।

लेकिन अन्य वातावरण में जहां केवल बहुत ही कम लिखा जाता है लेकिन बहुत कुछ पढ़ा जाता है, अक्सर एक कैस्केड होता है जहां केवल एक या कुछ मास्टर सर्वर शामिल होते हैं और शेष केवल शुद्ध पढ़ने की प्रतिकृति होती है।

लेकिन थीस सेटअप बहुत दुर्लभ हैं क्योंकि वर्णित बोव के रूप में शेडिंग सर्वश्रेष्ठ प्रदर्शन प्रदान करती है और कैशिंग वातावरण में डेटा हानि अधिकतर सहनशील होती है। इसलिए यह memcached के लिए भी डिफ़ॉल्ट है।

+0

मैं थोड़ी देर के लिए इस प्रश्न का उत्तर ढूंढ रहा हूं। इस तरह के एक महान प्रतिक्रिया के लिए धन्यवाद। मेरी सभी चिंताओं का जवाब दिया। –

0

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

यदि आप अपने सर्वर की संख्या को ऊपर या डाउनस्केल करेंगे, तो कैश को फ़्लश करते समय यह वही परिदृश्य हो सकता है। अधिकांश हैंश को एक और सर्वर मिलता है और इसलिए पहले अनुरोध के लिए कैश का नतीजा नहीं होगा।

ऐसे परिदृश्यों के लिए उपयोग करने का सबसे अच्छा समाधान लगातार हैशिंग है। लगातार हैशिंग के साथ, हर सर्वर को एक निश्चित हैशरेंज मिलता है। तो यदि आप अब सर्वर की संख्या को ऊपर या डाउनस्केल करते हैं, तो केवल इस विशेष हैशेंज में हैंश को दूसरे सर्वर पर स्विच किया जाएगा। अन्य सभी हैंश सर्वर पर बने रहते हैं और केवल एक छोटा सा हिस्सा पुन: उत्पन्न किया जाएगा।

PHP के लिए 'flexihash' नामक एक लाइब्रेरी है जो आपके लिए लगातार हैशिंग करता है।

हमारे Blog में, आप एक उदाहरण पा सकते हैं कि इसे अपने कैश-क्लाइंट के साथ कैसे उपयोग करें। लेख जर्मन में है लेकिन स्रोत कोड को सेल्फ़क्सप्लेन्ड किया जाना चाहिए।

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