Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Como fazer o Laravel funcionar com o cluster Redis na AWS


depois de pesquisar e depurar, foi isso que fez funcionar:
'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:um erro óbvio na minha configuração na pergunta acima foi que eu combinei o host e a porta, que consertei aqui. é assim que meu arquivo .env se parece:
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:eu criei o cluster usando as instruções aqui:https://redis.io/topics/cluster-tutorial#creating-the-cluster

Metodologia de Pesquisa


Pelo fato de:1. A documentação laravel/predis sobre isso está faltando2. A maioria das respostas sobre estouro de pilha é assim:depois de pesquisar e pesquisar no google.. foi o que funcionou para mim sem muita explicação do que está acontecendo

Achei que poderia ajudar um pouco mostrando como Encontrei minha resposta acima.

1) Resolvendo o problema de erro


Para resolver este bug

local.ERROR:Symfony\Component\Debug\Exception\FatalThrowableError:Type error:Argument 1 passado toPredis\Connection\Parameters::__construct() deve ser do tipo array,integer fornecido, chamado em/Users/Shared/dev/php /toters-api/vendor/predis/predis/src/Connection/Factory.phpon linha 164 in/Users/Shared/dev/php/toters-api/vendor/predis/predis/src/Connection/Parameters.php:34Rastreamento de pilha :

Percebi que meu formato config/database.php estava simplesmente errado. Pesquisando tudo no Google não me deu nenhuma imagem clara, então decidi usar o xdebug e mergulhar no código. Nota:Eu tinha o rastreamento de pilha de erros (mostrado na pergunta acima) impresso em um documento, e usei isso como uma visão panorâmica para me guiar pelas etapas de depuração (ou seja, passar por cima/entrar/sair etc enquanto sempre imprime as saídas em um documento separado e comparando-o com meu config/database.php como uma verificação de sanidade/bússola de depuração).

Depois de cavar e imprimir, me deparei com isso:
[ *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)
  /

Eu comparei isso com o conteúdo do meu arquivo .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 percebi que o formato estava errado, não deveria colocar o host AND port na mesma variável env .. então coloquei assim:
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 isso resolveu meu primeiro problema.

2) resolvendo os outros problemas


depois que o acima foi corrigido eu consegui isso

Espaço de hash CLUSTERDOWN não veiculado

isso foi muito fácil, era apenas uma questão de pesquisar no Google a mensagem de erro (já que a mensagem de erro era claramente uma mensagem de erro redis nativa, em vez de algum wrapper de biblioteca enigmática como mensagem de erro predis) .. e encontrei esta resposta.

O resto foi fácil.