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

Laravel + predis + cluster Redis - SPOSTATO / nessuna connessione a 127.0.0.1:6379

TL;DR:

  • 'cluster' => true dovrebbe essere true per creare un client aggregato che gestisce più nodi.
  • 'options' => ['cluster' => 'redis'] deve essere aggiunto alla configurazione come fratello di default (non un figlio) per dire a Predis di gestire il clustering lato server fornito da Azure.
  • se si utilizza auth con il clustering lato server, 'options' => [ 'cluster' => 'redis', 'parameters' => ['password' => env('REDIS_PASSWORD', null)], ] sarà necessario per autenticare i nodi del cluster appena scoperti.

Testo intero

Nella configurazione redis, puoi configurare più connessioni a più istanze redis. Il cluster opzione dice a Laravel come gestire quelle connessioni multiple definite.

Se cluster è impostato su false , Laravel creerà \Predis\Client individuali istanze per ogni connessione. Ogni connessione è accessibile individualmente e non avrà alcuna relazione con un'altra connessione.

Se cluster è impostato su true , Laravel creerà un aggregato \Predis\Client istanza utilizzando tutte le connessioni definite. Senza altra configurazione, questo è una specie di cluster "falso". Utilizza lo sharding lato client per distribuire lo spazio delle chiavi e potrebbe richiedere monitoraggio e manutenzione esterni per garantire un corretto bilanciamento del carico delle chiavi.

Il problema che stai riscontrando, tuttavia, è che Azure implementa (presumibilmente) un vero cluster Redis lato server, che gestisce il partizionamento orizzontale automatico dello spazio delle chiavi. In questo caso, i nodi si conoscono e parlano tra loro e possono salire e scendere. Qui è dove MOVED e ASK le risposte provengono da.

Il Predis la libreria può gestire automaticamente queste risposte, ma solo quando gli dici che è necessario. In questo caso, devi comunicare a Predis client di cui ha bisogno per gestire il clustering, e questo viene fatto da Laravel tramite le options array su redis configurazione.

Sul redis configurazione, le options chiave dovrebbe essere un fratello delle tue connessioni (ad esempio default ), non un bambino. Inoltre, le opzioni devono essere specificate come key => value coppie.

Quindi, la tua configurazione dovrebbe essere simile a:

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

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

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

Il cluster chiave sotto il redis config dirà a Laravel di creare un Predis\Client aggregato istanza che può gestire più nodi e il cluster chiave sotto le options array dirà a quell'istanza che deve gestire il clustering lato server, non il clustering lato client.

Aut

I parametri di connessione originali (inclusa l'autenticazione) non sono condivisi con le connessioni a nuovi nodi scoperti tramite -MOVED e -ASK risposte. Quindi, tutti gli errori che hai ricevuto in precedenza da -MOVED le risposte ora verranno semplicemente convertite in NOAUTH errori. Tuttavia, il 'cluster' lato server la configurazione consente un 'parameters' fratello che definisce un elenco di parametri da utilizzare con i nodi appena scoperti. Qui è dove puoi inserire i tuoi parametri di autenticazione da usare con i nuovi nodi.

Credo che questo assomiglierà a:

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

Giusto avviso, queste sono tutte le informazioni che ho appena ricevuto dalla ricerca e dal codice di immersione. Anche se ho usato Redis con Laravel, non ho ancora utilizzato il clustering lato server, quindi potrebbe non funzionare ancora.

Alcune informazioni utili che mi sono imbattuto durante l'analisi di questo:

Problema Predis relativo alla connessione a un cluster redis:
https://github.com/nrk/predis/issues/259#issuecomment-117339028

Sembra che tu non abbia configurato Predis per utilizzare il cluster redis, ma invece lo stai usando con la semplice logica di partizionamento orizzontale lato client (che è anche il comportamento predefinito). È necessario configurare il client impostando il cluster di opzioni con il valore redis per far sapere al client che deve giocare insieme a redis-cluster. Esempio veloce:

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

Ciò consentirà al client di gestire automaticamente le risposte -MOVED o -ASK provenienti dai nodi Redis.

Articolo di MS che discute il clustering nella cache Redis:
https://docs.microsoft.com/en-us/azure/redis-cache/cache-how-to-premium-clustering#how-do-i-connect- alla-mia-cache-quando-il-clustering-è-abilitato

Puoi connetterti alla tua cache usando gli stessi endpoint, porte e chiavi che usi quando ti connetti a una cache in cui non è abilitato il clustering. Redis gestisce il clustering sul backend in modo da non doverlo gestire dal tuo client.

Codice Laravel per la creazione di Predis\Client istanze:
https://github.com/laravel/framework/blob/v5.3.28/src/Illuminate/Redis/Database.php#L25-L66