sql >> Database teknologi >  >> NoSQL >> Redis

Laravel + predis + Redis klynge - FLYTTET / ingen forbindelse til 127.0.0.1:6379

TL;DR:

  • 'cluster' => true skal være sand for at skabe én samlet klient, der håndterer flere noder.
  • 'options' => ['cluster' => 'redis'] skal tilføjes til konfigurationen som en søskende til default (ikke et underordnet) for at bede Predis om at håndtere clustering på serversiden leveret af Azure.
  • hvis du bruger auth med server-side clustering, 'options' => [ 'cluster' => 'redis', 'parameters' => ['password' => env('REDIS_PASSWORD', null)], ] vil være nødvendig for at godkende nyopdagede klynge noder.

Fuld tekst

I redis-konfigurationen kan du konfigurere flere forbindelser til flere redis-forekomster. cluster option fortæller Laravel, hvordan man håndterer disse flere definerede forbindelser.

Hvis cluster er indstillet til false , vil Laravel oprette individuelle \Predis\Client instanser for hver forbindelse. Hver forbindelse kan tilgås individuelt og vil ikke have nogen relation til en anden forbindelse.

Hvis cluster er indstillet til true , vil Laravel oprette en samlet \Predis\Client instans ved hjælp af alle de definerede forbindelser. Uden anden konfiguration er dette en slags "falsk" klynge. Den bruger sharding på klientsiden til at fordele nøglerummet og kan kræve ekstern overvågning og vedligeholdelse for at sikre en korrekt nøglebelastningsbalance.

Det problem, du dog støder på, er, at Azure implementerer (formentlig) en ægte Redis-klynge på serversiden, som håndterer automatisk sharding af nøglerummet. I dette tilfælde kender noderne til hinanden og taler med hinanden og kan gå op og ned. Det er her MOVED og ASK svar kommer fra.

Predis biblioteket kan automatisk håndtere disse svar, men kun når du fortæller det, at det skal. I dette tilfælde skal du fortælle Predis klient, som den skal håndtere klyngedannelse, og dette gøres af Laravel gennem options array på redis konfiguration.

redis konfiguration, options nøglen skal være en søskende til dine forbindelser (dvs. default ), ikke et barn. Derudover skal indstillingerne angives som key => value par.

Så din konfiguration skal se sådan ud:

'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 tasten under redis config vil bede Laravel om at oprette en samlet Predis\Client instans, der kan håndtere flere noder, og cluster tast under options array vil fortælle den instans, at den skal håndtere server-side clustering, ikke klient-side clustering.

Auth

De originale forbindelsesparametre (inklusive godkendelse) deles ikke med forbindelser til nye noder opdaget via -MOVED og -ASK svar. Så alle fejl du tidligere har fået fra -MOVED svar vil nu bare konvertere til NOAUTH fejl. Dog server-side 'cluster' konfiguration tillader en 'parameters' søskende, som definerer en liste over parametre, der skal bruges med nyopdagede noder. Det er her, du kan bruge dine godkendelsesparametre med nye noder.

Jeg tror, ​​det vil se nogenlunde sådan ud:

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

Retfærdig advarsel, dette er al information, jeg lige har fået fra forskning og kodedykning. Mens jeg har brugt Redis med Laravel, har jeg ikke brugt serverside clustering (endnu), så det virker muligvis stadig ikke.

Nogle nyttige oplysninger, jeg stødte på, mens jeg undersøgte dette:

Predis-problem, der diskuterer forbindelse til en redis-cluster:
https://github.com/nrk/predis/issues/259#issuecomment-117339028

Det ser ud til, at du ikke har konfigureret Predis til at bruge redis-cluster, men i stedet bruger du det med den almindelige gamle klientside-sharding-logik (som også er standardadfærden). Du bør konfigurere klientindstillingen for indstillingsklyngen med værdien redis for at lade klienten vide, at den skal spille sammen med redis-cluster. Hurtigt eksempel:

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

Hvis du gør det, vil det gøre det muligt for klienten automatisk at håndtere -MOVED eller -ASK svar, der kommer fra Redis noder.

MS artikel, der diskuterer clustering på redis cache:
https://docs.microsoft.com/en-us/azure/redis-cache/cache-how-to-premium-clustering#how-do-i-connect- to-my-cache-when-clustering-er-enabled

Du kan oprette forbindelse til din cache ved hjælp af de samme endepunkter, porte og nøgler, som du bruger, når du opretter forbindelse til en cache, der ikke har clustering aktiveret. Redis administrerer klyngingen på backend, så du ikke behøver at administrere den fra din klient.

Laravel-kode til oprettelse af Predis\Client forekomster:
https://github.com/laravel/framework/blob/v5.3.28/src/Illuminate/Redis/Database.php#L25-L66



  1. Formater et tal som valuta i SQL

  2. Få en tydelig aggregering af et matrixfelt på tværs af indekser

  3. MongoDB-forespørgsel med en 'eller'-betingelse

  4. Kan du angive en nøgle til $addToSet i Mongo?