sql >> Base de Datos >  >> NoSQL >> Redis

Cómo hacer que Laravel funcione con el clúster de Redis en AWS

después de buscar y depurar, esto es lo que hizo que funcionara:

'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 error obvio en mi configuración en la pregunta anterior fue que combiné el host y el puerto, que arreglé aquí. así es como se ve mi archivo .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:creé el clúster usando las instrucciones aquí:https://redis.io/topics/cluster-tutorial#creating-the-cluster

Metodología de investigación

Por el hecho de que:1. Falta la documentación de laravel/predis sobre esto2. La mayoría de las respuestas sobre el desbordamiento de la pila están en estas líneas:después de googlear y buscar... esto es lo que funcionó para mí sin mucha explicación de lo que está pasando

Pensé que puedo ayudar un poco mostrando cómo Encontré mi respuesta a lo anterior.

1) Resolviendo el problema del error

Para solucionar este error

local.ERROR:Symfony\Component\Debug\Exception\FatalThrowableError:Error de tipo:Argumento 1 pasado aPredis\Connection\Parameters::__construct() debe ser del tipo matriz, entero dado, invocado en/Users/Shared/dev/php /toters-api/vendor/predis/predis/src/Connection/Factory.php en la línea 164 en/Users/Shared/dev/php/toters-api/vendor/predis/predis/src/Connection/Parameters.php:34Stack trace :

Me di cuenta de que mi formato config/database.php era simplemente incorrecto. Buscar en Google no me dio una imagen clara, así que decidí usar xdebug y sumergirme en el código. Nota:Tenía el seguimiento de la pila de errores (que se muestra en la pregunta anterior) impreso en un documento, y lo usé como una vista panorámica para guiarme a través de los pasos de depuración (es decir, pasar por encima/dentro/fuera, etc. mientras imprimía siempre los resultados). en un documento separado y comparándolo con mi config/database.php como una brújula de verificación/depuración de cordura).

Después de excavar e imprimir, me encontré con esto:

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

Comparé esto con el contenido de mi archivo .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

y me di cuenta de que el formato era incorrecto, no debería poner el host Y el puerto en la misma variable env... así que lo puse así:

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

y eso resolvió mi primer problema.

2) resolver los otros problemas

después de que se solucionó lo anterior, obtuve esto

Ranura de hash CLUSTERDOWN no ​​atendida

esto fue bastante fácil, solo fue cuestión de buscar en Google el mensaje de error (ya que el mensaje de error era claramente un mensaje de error nativo de redis, en lugar de un envoltorio de biblioteca críptico como el mensaje de error de predis) y encontré esta respuesta.

El resto fue fácil.