Redis
 sql >> Base de données >  >> NoSQL >> Redis

Comment faire fonctionner Laravel avec le cluster Redis sur AWS

après recherche et débogage, voici ce qui l'a fait fonctionner :

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

note:une erreur évidente dans ma configuration dans la question ci-dessus était que j'ai combiné l'hôte et le port, que j'ai corrigé ici. voici à quoi ressemble mon fichier .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

note :j'ai créé le cluster en suivant les instructions ici :https://redis.io/topics/cluster-tutorial#creating-the-cluster

Méthodologie de la recherche

En raison du fait que :1. La documentation laravel/predis à ce sujet fait défaut2. La plupart des réponses sur le débordement de pile vont dans ce sens :après avoir cherché sur Google et cherché... c'est ce qui a fonctionné pour moi sans beaucoup d'explications sur ce qui se passe

J'ai pensé que je pouvais aider un peu en montrant comment J'ai trouvé ma réponse à ce qui précède.

1) Résoudre le problème d'erreur

Pour résoudre ce bug

local.ERROR:Symfony\Component\Debug\Exception\FatalThrowableError:Type error :Argument 1 passé à Predis\Connection\Parameters::__construct() doit être du type array,integer donné, appelé dans/Users/Shared/dev/php /toters-api/vendor/predis/predis/src/Connection/Factory.phpsur la ligne 164 dans/Users/Shared/dev/php/toters-api/vendor/predis/predis/src/Connection/Parameters.php:34Stack trace :

J'ai réalisé que mon format config/database.php était tout simplement faux. Googler partout ne m'a pas donné d'image claire, j'ai donc décidé d'utiliser xdebug et de plonger dans le code. Remarque:j'ai fait imprimer la trace de la pile d'erreurs (indiquée dans la question ci-dessus) dans un document, et je l'ai utilisée comme vue d'ensemble pour me guider à travers les étapes de débogage (c'est-à-dire passer par-dessus/dans/sortir, etc. tout en imprimant toujours les sorties dans un document séparé et en le comparant avec mon fichier config/database.php comme boussole de vérification/débogage).

Après avoir creusé et imprimé, je suis tombé sur ceci :

[ *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)
  /

J'ai comparé cela avec le contenu de mon fichier .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

et je me suis rendu compte que le format était faux, je ne devais pas mettre l'hôte ET le port dans la même variable env.. donc je l'ai mis comme ça à la place :

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

et cela a résolu mon premier problème.

2) résoudre les autres problèmes

après que ce qui précède a été corrigé, j'ai obtenu ceci

CLUSTERDOWN Emplacement de hachage non servi

c'était assez facile, c'était juste une question de googler le message d'erreur (puisque le message d'erreur était clairement un message d'erreur redis natif, plutôt qu'un wrapper de bibliothèque cryptique comme le message d'erreur predis) .. et j'ai trouvé cette réponse.

Le reste était facile.