Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Wie man Laravel mit dem Redis-Cluster auf AWS zum Laufen bringt

Nach dem Suchen und Debuggen hat es folgendes funktioniert:

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

Hinweis:Ein offensichtlicher Fehler in meiner Konfiguration in der obigen Frage war, dass ich Host und Port kombiniert habe, was ich hier behoben habe. So sieht meine .env-Datei aus:

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

Hinweis:Ich habe den Cluster anhand der Anweisungen hier erstellt:https://redis.io/topics/cluster-tutorial#creating-the-cluster

Forschungsmethodik

Aufgrund dessen:1. Die Laravel/Predis-Dokumentation dazu fehlt2. Die meisten Antworten zum Stapelüberlauf gehen in diese Richtung:nachdem ich gegoogelt und gesucht habe ... das hat für mich geklappt ohne viel Erklärung dessen, was vor sich geht

Ich dachte mir, ich kann ein bisschen helfen, indem ich wie zeige Ich habe meine Antwort auf die obige Frage gefunden.

1) Lösung des Fehlerproblems

Um diesen Fehler zu beheben

local.ERROR:Symfony\Component\Debug\Exception\FatalThrowableError:Type error:Argument 1 übergeben an Predis\Connection\Parameters::__construct() muss vom Typ Array sein, ganze Zahl angegeben, aufgerufen in/Users/Shared/dev/php /toters-api/vendor/predis/predis/src/Connection/Factory.php in Zeile 164 in/Users/Shared/dev/php/toters-api/vendor/predis/predis/src/Connection/Parameters.php:34Stack-Trace :

Mir wurde klar, dass mein config/database.php-Format einfach falsch war. Überall zu googeln gab mir kein klares Bild, also entschied ich mich, xdebug zu verwenden und in den Code einzutauchen. Hinweis:Ich hatte den Fehler-Stack-Trace (in der obigen Frage gezeigt) in einem Dokument gedruckt, und ich habe das als Vogelperspektive verwendet, um mich durch die Debug-Schritte zu führen (dh Über-/Ein-/Aussteigen usw., während immer die Ausgaben gedruckt werden). in einem separaten Dokument und vergleiche es mit meiner config/database.php als Plausibilitätsprüfung/Debug-Kompass).

Nach dem Graben und Drucken bin ich auf Folgendes gestoßen:

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

Ich habe dies mit dem Inhalt meiner .env-Datei verglichen:

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

und mir wurde klar, dass das Format falsch war, ich sollte den Host UND den Port nicht in dieselbe env-Variable setzen. Also habe ich es stattdessen so gesetzt:

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

und das löste mein erstes Problem.

2) Lösen der anderen Probleme

nachdem das obige behoben wurde, habe ich das bekommen

CLUSTERDOWN Hash-Slot nicht bereitgestellt

Das war ziemlich einfach, es war nur eine Frage des Googelns der Fehlermeldung (da die Fehlermeldung eindeutig eine native Redis-Fehlermeldung war und keine kryptische Bibliotheks-Wrapper wie Predis-Fehlermeldung). und ich fand diese Antwort.

Der Rest war einfach.