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