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

Come far funzionare Laravel con il cluster Redis su AWS

dopo la ricerca e il debug, ecco cosa ha fatto funzionare:

'redis' => [
    'client' => 'predis',
    'cluster' => true,
    'options' => [
        'cluster' => 'redis',
        'parameters' => [
            'host' => env('REDIS_DEFAULT_HOST', '127.0.01'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_DEFAULT_PORT', 6379),
            'database' => 0,
            ],
        ],
    'clusters' => [
         'default' => [
            'host' => env('REDIS_DEFAULT_HOST', '127.0.01'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_DEFAULT_PORT', 6379),
            'database' => 0,
        ],
        'jobs' => [
            'host' => env('REDIS_JOBS_HOST', '127.0.01'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_JOBS_PORT', 6379),
            'database' => 0,
        ],
        'content' => [
            'host' => env('REDIS_CONTENT_HOST', '127.0.01'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_CONTENT_PORT', 6379),
            'database' => 0,
        ],
        'options' => [
            'cluster' => 'redis'
        ],
    ]
]

nota:un errore evidente nella mia configurazione nella domanda precedente è stato che ho combinato l'host e la porta, che ho corretto qui. ecco come appare il mio file .env:

REDIS_DEFAULT_HOST=127.0.0.1
REDIS_JOBS_HOST=127.0.0.1
REDIS_CONTENT_HOST=127.0.0.1

REDIS_DEFAULT_PORT=7000
REDIS_JOBS_PORT=7001
REDIS_CONTENT_PORT=7002

nota:ho creato il cluster utilizzando le istruzioni qui:https://redis.io/topics/cluster-tutorial#creating-the-cluster

Metodologia di ricerca

A causa del fatto che:1. Manca la documentazione laravel/predis in merito2. La maggior parte delle risposte sull'overflow dello stack seguono queste linee:dopo aver cercato su Google e cercando... questo è quello che ha funzionato per me senza molte spiegazioni su cosa sta succedendo

Ho pensato di poterti aiutare un po' mostrando come Ho trovato la mia risposta a quanto sopra.

1) Risoluzione del problema di errore

Per risolvere questo bug

local.ERROR:Symfony\Component\Debug\Exception\FatalThrowableError:Type error:L'argomento 1 passato aPredis\Connection\Parameters::__construct() deve essere del tipo array,integer dato, chiamato in/Users/Shared/dev/php /toters-api/vendor/predis/predis/src/Connection/Factory.phpon line 164 in/Users/Shared/dev/php/toters-api/vendor/predis/predis/src/Connection/Parameters.php:34Stack trace :

Mi sono reso conto che il mio formato config/database.php era semplicemente sbagliato. Googling dappertutto non mi ha dato un'immagine chiara, quindi ho deciso di usare xdebug e tuffarmi nel codice. Nota:ho stampato la traccia dello stack di errori (mostrata nella domanda sopra) in un documento e l'ho usata come vista a volo d'uccello per guidarmi attraverso i passaggi di debug (es. in un documento separato e confrontandolo con il mio config/database.php come controllo di integrità/bussola di debug).

Dopo aver scavato e stampato, mi sono imbattuto in questo:

[ *Locals ] [ Superglobals ] [ User defined constants ]

- Locals at /Users/Shared/dev/php/toters-api/vendor/predis/predis/src/Client.php:55

 ▾ $options = (array [1])
  \
   ⬦ $options["cluster"] = (string [5]) `redis`
  /
 ▾ $parameters = (array [4])
  \
   ⬦ $parameters[0] = (string [14]) `127.0.0.1:7000`
   |
   ⬦ $parameters[1] = (null)
   |
   ⬦ $parameters[2] = (int) 6379
   |
   ⬦ $parameters[3] = (int) 0
  /
 ▾ $this = (Predis\Client [3])
  \
   ⬦ $this->connection = (null)
   |
   ⬦ $this->options = (null)
   |
   ⬦ $this->profile = (null)
  /

L'ho confrontato con il contenuto del mio file .env:

REDIS_DEFAULT_HOST=127.0.0.1:7000
REDIS_JOBS_HOST=127.0.0.1:7001
REDIS_CONTENT_HOST=127.0.0.1:7002

e mi sono reso conto che il formato era sbagliato, non avrei dovuto mettere l'host E la porta nella stessa variabile env.. quindi l'ho messa così:

REDIS_DEFAULT_HOST=127.0.0.1
REDIS_JOBS_HOST=127.0.0.1
REDIS_CONTENT_HOST=127.0.0.1

REDIS_DEFAULT_PORT=7000
REDIS_JOBS_PORT=7001
REDIS_CONTENT_PORT=7002

e questo ha risolto il mio primo problema.

2) risolvere gli altri problemi

dopo che quanto sopra è stato risolto, ho ottenuto questo

CLUSTERDOWN Slot hash non servito

questo è stato abbastanza semplice, si trattava solo di cercare su Google il messaggio di errore (poiché il messaggio di errore era chiaramente un messaggio di errore redis nativo, piuttosto che un criptico wrapper di libreria come il messaggio di errore predis).. e ho trovato questa risposta.

Il resto è stato facile.