Redis
 sql >> база данни >  >> NoSQL >> Redis

Laravel + predis + Redis клъстер - ПРЕМЕСТЕН ​​/ няма връзка към 127.0.0.1:6379

TL;DR:

  • 'cluster' => true трябва да е истина, за да създадете един обобщен клиент, който обработва множество възли.
  • 'options' => ['cluster' => 'redis'] трябва да се добави към конфигурацията като брат или сестра на default (не е дете), за да каже на Predis да се справи с клъстерирането от страна на сървъра, предоставено от Azure.
  • ако използвате auth с клъстериране от страна на сървъра, 'options' => [ 'cluster' => 'redis', 'parameters' => ['password' => env('REDIS_PASSWORD', null)], ] ще е необходимо за удостоверяване на новооткрити клъстерни възли.

Пълен текст

В конфигурацията на redis можете да настроите множество връзки към множество екземпляри на redis. cluster опцията казва на Laravel как да обработва тези множество дефинирани връзки.

Ако cluster е настроен на false , Laravel ще създаде индивидуален \Predis\Client екземпляри за всяка връзка. Всяка връзка може да бъде достъпна поотделно и няма да има никаква връзка с друга връзка.

Ако cluster е настроен на true , Laravel ще създаде агрегат \Predis\Client инстанция, използваща всички дефинирани връзки. Без друга конфигурация, това е един вид "фалшив" клъстер. Той използва разделяне от страна на клиента за разпределение на ключовото пространство и може да изисква външен мониторинг и поддръжка, за да осигури правилен баланс на натоварването на ключовете.

Проблемът, с който се сблъсквате обаче, е, че Azure внедрява (вероятно) истински Redis клъстер от страна на сървъра, който обработва автоматично разделяне на ключовото пространство. В този случай възлите знаят един за друг и говорят помежду си и могат да вървят нагоре и надолу. Това е мястото, където MOVED и ASK отговорите идват от.

Predis библиотеката може автоматично да обработва тези отговори, но само когато й кажете, че трябва. В този случай трябва да кажете на Predis клиент, който трябва да се справи с клъстерирането и това се прави от Laravel чрез 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 config ще каже на Laravel да създаде агрегиран Predis\Client екземпляр, който може да обработва множество възли, и cluster под options масивът ще каже на този екземпляр, че трябва да обработва клъстериране от страна на сървъра, а не клъстериране от страна на клиента.

Удостоверение

Оригиналните параметри на връзката (включително удостоверяване) не се споделят с връзки към нови възли, открити чрез -MOVED и -ASK отговори. И така, всички грешки, които сте получили преди от -MOVED отговорите вече просто ще се преобразуват в NOAUTH грешки. Въпреки това, 'cluster' от страна на сървъра конфигурацията позволява 'parameters' sibling, който дефинира списък с параметри, които да се използват с новооткрити възли. Тук можете да поставите вашите параметри за удостоверяване, които да използвате с нови възли.

Вярвам, че това ще изглежда нещо като:

'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)],
    ],
],

Справедливо предупреждение, това е цялата информация, която току-що получих от изследвания и гмуркане с код. Докато използвах Redis с Laravel, не съм използвал клъстериране от страна на сървъра (все още), така че това все още може да не работи.

Някои полезна информация, на която попаднах, докато разглеждах това:

Проблем с Predis, обсъждащ свързване към redis-cluster:
https://github.com/nrk/predis/issues/259#issuecomment-117339028

Изглежда, че не сте конфигурирали Predis да използва redis-cluster, но вместо това го използвате с обикновената стара логика за разделяне от страна на клиента (което също е поведението по подразбиране). Трябва да конфигурирате клиента, задавайки клъстера с опции със стойността redis, за да уведомите клиента, че трябва да играе заедно с redis-cluster. Бърз пример:

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

Това ще даде възможност на клиента автоматично да обработва -MOVED или -ASK отговори, идващи от Redis възли.

MS статия, обсъждаща клъстерирането в кеша на redis:
https://docs.microsoft.com/en-us/azure/redis-cache/cache-how-to-premium-clustering#how-do-i-connect- to-my-cache-when-clustering-is-enabled

Можете да се свържете с кеша си, като използвате същите крайни точки, портове и ключове, които използвате, когато се свързвате с кеш, за който не е активирано групирането. Redis управлява клъстерирането в бекенда, така че не е нужно да го управлявате от вашия клиент.

Laravel код за създаване на Predis\Client екземпляри:
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. Laravel и redis сканиране

  2. Redis се опитва да се свърже с локален хост на Heroku вместо REDIS_URL

  3. Мащабиране на Socket.IO до множество Node.js процеси с помощта на клъстер

  4. django:redis:CommandError:Не сте задали ASGI_APPLICATION, която е необходима за стартиране на сървъра

  5. ServiceStack Redis, как да върнете таблицата Lua като списък