sql >> Databasteknik >  >> NoSQL >> Redis

Laravel + predis + Redis-kluster - FLYTTAT / ingen anslutning till 127.0.0.1:6379

TL;DR:

  • 'cluster' => true bör vara sant för att skapa en samlad klient som hanterar flera noder.
  • 'options' => ['cluster' => 'redis'] måste läggas till i konfigurationen som ett syskon till default (inte ett underordnat) för att berätta för Predis att hantera klustringen på serversidan som tillhandahålls av Azure.
  • om du använder auth med klustring på serversidan, 'options' => [ 'cluster' => 'redis', 'parameters' => ['password' => env('REDIS_PASSWORD', null)], ] kommer att behövas för att autentisera nyupptäckta klusternoder.

Fulltext

I redis-konfigurationen kan du ställa in flera anslutningar till flera redis-instanser. cluster alternativet berättar för Laravel hur man hanterar dessa flera definierade anslutningar.

Om cluster är inställd på false , kommer Laravel att skapa individuella \Predis\Client instanser för varje anslutning. Varje anslutning kan nås individuellt och kommer inte att ha någon relation till en annan anslutning.

Om cluster är inställd på true , kommer Laravel att skapa en samlad \Predis\Client instans med alla definierade anslutningar. Utan någon annan konfiguration är detta ett slags "falskt" kluster. Den använder sönderdelning på klientsidan för att distribuera tangentutrymmet och kan kräva extern övervakning och underhåll för att säkerställa en korrekt nyckelbelastningsbalans.

Problemet du stöter på är dock att Azure implementerar (förmodligen) ett riktigt Redis-kluster på serversidan, som hanterar automatisk sönderdelning av nyckelutrymmet. I det här fallet känner noderna till varandra och pratar med varandra och kan gå upp och ner. Det är hit MOVED och ASK svar kommer från.

Predis biblioteket kan automatiskt hantera dessa svar, men bara när du säger till det att det behöver det. I det här fallet måste du berätta för Predis klient som den behöver för att hantera klustring, och detta görs av Laravel genom options array på redis konfiguration.

redis konfiguration, options nyckeln ska vara ett syskon till dina anslutningar (dvs default ), inte ett barn. Dessutom bör alternativen anges som key => value par.

Så din konfiguration bör se ut så här:

'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 under redis config kommer att berätta för Laravel att skapa en samlad Predis\Client instans som kan hantera flera noder och cluster under options array kommer att berätta för den instansen att den behöver hantera klustring på serversidan, inte klustring på klientsidan.

Auth

De ursprungliga anslutningsparametrarna (inklusive autentisering) delas inte med anslutningar till nya noder som upptäckts via -MOVED och -ASK svar. Så alla fel du tidigare fick från -MOVED svar kommer nu bara att konverteras till NOAUTH fel. Men serversidans 'cluster' konfigurationen tillåter en 'parameters' syskon som definierar en lista över parametrar som ska användas med nyupptäckta noder. Det är här du kan använda dina autentiseringsparametrar med nya noder.

Jag tror att det här kommer att se ut ungefär så här:

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

Rättvis varning, det här är all information jag precis fått från forskning och koddykning. Medan jag har använt Redis med Laravel, har jag inte använt klustring på serversidan (ännu), så det kanske fortfarande inte fungerar.

En del användbar information jag stötte på när jag tittade på detta:

Predis-problem som diskuterar anslutning till ett redis-kluster:
https://github.com/nrk/predis/issues/259#issuecomment-117339028

Det ser ut som att du inte har konfigurerat Predis för att använda redis-kluster utan istället använder du det med den vanliga gamla sönderdelningslogiken på klientsidan (vilket också är standardbeteendet). Du bör konfigurera klientinställningen för alternativklustret med värdet redis för att låta klienten veta att den måste spela tillsammans med redis-cluster. Snabbexempel:

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

Om du gör det kommer det att göra det möjligt för klienten att automatiskt hantera -MOVED- eller -FRÅGA-svar som kommer från Redis-noder.

MS-artikel som diskuterar klustring på redis cache:
https://docs.microsoft.com/en-us/azure/redis-cache/cache-how-to-premium-clustering#how-do-i-connect- till-min-cache-när-klustring-är-aktiverad

Du kan ansluta till din cache med samma slutpunkter, portar och nycklar som du använder när du ansluter till en cache som inte har klustring aktiverat. Redis hanterar klustringen på backend så att du inte behöver hantera det från din klient.

Laravel-kod för att skapa Predis\Client instanser:
https://github.com/laravel/framework/blob/v5.3.28/src/Illuminate/Redis/Database.php#L25-L66



  1. Vad är HBase Compactions?

  2. Hur man läser flera uppsättningar lagrade på Redis med hjälp av något kommando eller LUA-skript

  3. Öka automatiskt i MongoDB för att lagra sekvens av unikt användar-ID

  4. Hur gör jag en NOT IN-fråga i Mongo?