Redis
 sql >> डेटाबेस >  >> NoSQL >> Redis

Laravel + predis + Redis क्लस्टर - MOVED / 127.0.0.1:6379 . से कोई कनेक्शन नहीं

TL;DR:

  • 'cluster' => true एक से अधिक नोड्स को संभालने वाला एक समग्र क्लाइंट बनाने के लिए सही होना चाहिए।
  • 'options' => ['cluster' => 'redis'] कॉन्फ़िगरेशन में default . के सहोदर के रूप में जोड़ने की आवश्यकता है (बच्चा नहीं) ताकि प्रेडिस को Azure द्वारा प्रदान किए गए सर्वर-साइड क्लस्टरिंग को संभालने के लिए कहा जा सके।
  • यदि सर्वर-साइड क्लस्टरिंग के साथ प्रमाणीकरण का उपयोग कर रहे हैं, 'options' => [ 'cluster' => 'redis', 'parameters' => ['password' => env('REDIS_PASSWORD', null)], ] नए खोजे गए क्लस्टर नोड्स को प्रमाणित करने की आवश्यकता होगी।

पूरा लेख

रेडिस कॉन्फ़िगरेशन में, आप कई रेडिस इंस्टेंस के लिए कई कनेक्शन सेट कर सकते हैं। cluster विकल्प लारवेल को बताता है कि उन एकाधिक परिभाषित कनेक्शनों को कैसे संभालना है।

अगर cluster false पर सेट है , Laravel अलग-अलग \Predis\Client . बनाएगा प्रत्येक कनेक्शन के लिए उदाहरण। प्रत्येक कनेक्शन को व्यक्तिगत रूप से एक्सेस किया जा सकता है, और इसका किसी अन्य कनेक्शन से कोई संबंध नहीं होगा।

अगर cluster true . पर सेट है , Laravel एक समग्र \Predis\Client . बनाएगा उदाहरण सभी परिभाषित कनेक्शन का उपयोग कर। कोई अन्य कॉन्फ़िगरेशन नहीं होने के कारण, यह एक "नकली" क्लस्टर की तरह है। यह कीस्पेस वितरित करने के लिए क्लाइंट-साइड शार्डिंग का उपयोग करता है और उचित कुंजी लोड संतुलन सुनिश्चित करने के लिए बाहरी निगरानी और रखरखाव की आवश्यकता हो सकती है।

हालाँकि, आप जिस समस्या का सामना कर रहे हैं, वह यह है कि Azure (संभवतः) एक वास्तविक सर्वर-साइड Redis क्लस्टर लागू करता है, जो कि कीस्पेस के स्वचालित शार्डिंग को संभालता है। इस उदाहरण में, नोड्स एक दूसरे के बारे में जानते हैं और एक दूसरे से बात करते हैं, और ऊपर और नीचे जा सकते हैं। यह वह जगह है जहाँ MOVED और ASK प्रतिक्रियाएं आती हैं।

Predis पुस्तकालय स्वचालित रूप से इन प्रतिक्रियाओं को संभाल सकता है, लेकिन केवल तभी जब आप इसे बताएं कि इसकी आवश्यकता है। इस मामले में, आपको Predis बताना होगा क्लाइंट है कि इसे क्लस्टरिंग को संभालने की आवश्यकता है, और यह लारवेल द्वारा options के माध्यम से किया जाता है redis . पर सरणी विन्यास।

redis . पर कॉन्फ़िगरेशन, options कुंजी आपके कनेक्शन की सहोदर होनी चाहिए (अर्थात default ), बच्चा नहीं। इसके अतिरिक्त, विकल्पों को key => value . के रूप में निर्दिष्ट किया जाना चाहिए जोड़े।

तो, आपका कॉन्फ़िगरेशन इस तरह दिखना चाहिए:

'redis' => [
    'cluster' => true,

    'default' => [
        'host' => env('REDIS_HOST', 'localhost'),
        'password' => env('REDIS_PASSWORD', null),
        'port' => env('REDIS_PORT', 6379),
        'database' => 0,
    ],

    'options' => [
        'cluster' => 'redis',
    ],
],

cluster redis के अंतर्गत कुंजी कॉन्फिग लारवेल को एक समग्र Predis\Client create बनाने के लिए कहेगा उदाहरण जो कई नोड्स को संभाल सकता है, और cluster options के अंतर्गत कुंजी सरणी उस उदाहरण को बताएगी कि उसे सर्वर-साइड क्लस्टरिंग को संभालने की आवश्यकता है, क्लाइंट-साइड क्लस्टरिंग को नहीं।

प्रामाणिक

मूल कनेक्शन पैरामीटर (प्रमाणीकरण सहित) -MOVED के माध्यम से खोजे गए नए नोड्स के कनेक्शन के साथ साझा नहीं किए जाते हैं और -ASK प्रतिक्रियाएँ। इसलिए, -MOVED . से आपको पहले मिली कोई भी त्रुटि प्रतिक्रियाएं अब केवल NOAUTH . में बदल जाएंगी त्रुटियाँ। हालांकि, सर्वर-साइड 'cluster' कॉन्फ़िगरेशन 'parameters' . के लिए अनुमति देता है सिबलिंग जो नए खोजे गए नोड्स के साथ उपयोग करने के लिए मापदंडों की एक सूची को परिभाषित करता है। यह वह जगह है जहां आप नए नोड्स के साथ उपयोग करने के लिए अपने प्रमाणीकरण पैरामीटर डाल सकते हैं।

मुझे विश्वास है कि यह कुछ इस तरह दिखाई देगा:

'redis' => [
    'cluster' => true,

    'default' => [
        'host' => env('REDIS_HOST', 'localhost'),
        'password' => env('REDIS_PASSWORD', null),
        'port' => env('REDIS_PORT', 6379),
        'database' => 0,
    ],

    'options' => [
        'cluster' => 'redis',
        'parameters' => ['password' => env('REDIS_PASSWORD', null)],
    ],
],

उचित चेतावनी, यह वह सारी जानकारी है जो मुझे अभी-अभी शोध और कोड डाइविंग से मिली है। जबकि मैंने Laravel के साथ Redis का उपयोग किया है, मैंने सर्वर साइड क्लस्टरिंग (अभी तक) का उपयोग नहीं किया है, इसलिए यह अभी भी काम नहीं कर सकता है।

इसे देखते समय कुछ उपयोगी जानकारी मुझे मिली:

रेडिस-क्लस्टर से जुड़ने पर चर्चा करते हुए प्रेडिस मुद्दा:
https://github.com/nrk/predis/issues/259#issuecomment-117339028

<ब्लॉकक्वॉट>

ऐसा लगता है कि आपने रेडिस-क्लस्टर का उपयोग करने के लिए प्रीडिस को कॉन्फ़िगर नहीं किया है, बल्कि इसके बजाय आप इसे सादे पुराने क्लाइंट-साइड शार्डिंग लॉजिक (जो कि डिफ़ॉल्ट व्यवहार भी है) के साथ उपयोग कर रहे हैं। आपको क्लाइंट को विकल्प क्लस्टर को रेडिस मान के साथ कॉन्फ़िगर करना चाहिए ताकि क्लाइंट को पता चल सके कि उसे रेडिस-क्लस्टर के साथ खेलना चाहिए। त्वरित उदाहरण:

$client = new Predis\Client([$node1, $node2, ...], ['cluster' => 'redis']);

ऐसा करने से क्लाइंट के लिए रेडिस नोड्स से आने वाली -MOVED या -ASK प्रतिक्रियाओं को स्वचालित रूप से संभालना संभव हो जाएगा।

रेडिस कैश पर क्लस्टरिंग पर चर्चा करने वाला एमएस लेख:
https://docs.microsoft.com/en-us/azure/redis-cache/cache-how-to-premium-clustering#how-do-i-connect- to-my-cache-जब-क्लस्टरिंग-सक्षम है

<ब्लॉकक्वॉट>

आप उन्हीं एंडपॉइंट्स, पोर्ट्स और कुंजियों का उपयोग करके अपने कैश से कनेक्ट कर सकते हैं जिनका उपयोग आप किसी ऐसे कैश से कनेक्ट करते समय करते हैं जिसमें क्लस्टरिंग सक्षम नहीं है। Redis बैकएंड पर क्लस्टरिंग का प्रबंधन करता है ताकि आपको इसे अपने क्लाइंट से प्रबंधित करने की आवश्यकता न पड़े।

Predis\Client creating बनाने के लिए Laravel कोड उदाहरण:
https://github.com/laravel/framework/blob/v5.3.28/src/Illuminate/Redis/Database.php#L25-L66



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. टॉरनेडो में रेडिस कनेक्शन को संभालने का सही तरीका क्या है? (Async - पब/उप)

  2. रेडिस, पबसुब की घटनाओं को सुनना और उन्हें अधिक विश्वसनीय उपभोग के लिए एक स्ट्रीम में बदलना

  3. रेडिस प्रकाशित / सदस्यता लें

  4. रेडिस लेनदेन और लंबे समय तक चलने वाली लुआ स्क्रिप्ट

  5. रेडिस दो सूचियों के बीच भिन्न है?