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

Laravel + Predis + Redis-Cluster – VERSCHIEBEN / keine Verbindung zu 127.0.0.1:6379

TL;DR:

  • 'cluster' => true sollte wahr sein, um einen aggregierten Client zu erstellen, der mehrere Knoten verwaltet.
  • 'options' => ['cluster' => 'redis'] muss der Konfiguration als gleichgeordnetes Element von default hinzugefügt werden (kein Kind), um Predis anzuweisen, das von Azure bereitgestellte serverseitige Clustering zu handhaben.
  • bei Verwendung von auth mit serverseitigem Clustering, 'options' => [ 'cluster' => 'redis', 'parameters' => ['password' => env('REDIS_PASSWORD', null)], ] wird benötigt, um neu entdeckte Cluster-Knoten zu authentifizieren.

Volltext

In der Redis-Konfiguration können Sie mehrere Verbindungen zu mehreren Redis-Instanzen einrichten. Der cluster Option teilt Laravel mit, wie es mit diesen mehrfach definierten Verbindungen umgehen soll.

Wenn cluster auf false gesetzt ist , Laravel erstellt individuelle \Predis\Client Instanzen für jede Verbindung. Auf jede Verbindung kann einzeln zugegriffen werden und sie hat keine Beziehung zu einer anderen Verbindung.

Wenn cluster auf true gesetzt ist , erstellt Laravel ein Aggregat \Predis\Client Instanz mit allen definierten Verbindungen. Ohne andere Konfiguration ist dies eine Art "falscher" Cluster. Es verwendet clientseitiges Sharding, um den Schlüsselraum zu verteilen, und erfordert möglicherweise eine externe Überwachung und Wartung, um einen angemessenen Schlüssellastausgleich sicherzustellen.

Das Problem, auf das Sie stoßen, ist jedoch, dass Azure (vermutlich) einen echten serverseitigen Redis-Cluster implementiert, der das automatische Sharding des Schlüsselraums übernimmt. In diesem Fall wissen die Knoten voneinander und sprechen miteinander und können auf und ab gehen. Hier ist MOVED und ASK Antworten kommen von.

Die Predis Die Bibliothek kann diese Antworten automatisch verarbeiten, aber nur, wenn Sie ihr mitteilen, dass dies erforderlich ist. In diesem Fall müssen Sie Predis mitteilen Client, den er für das Clustering benötigt, und dies wird von Laravel über die options erledigt -Array auf dem redis Konfiguration.

Auf der redis Konfiguration, die options Schlüssel sollte ein Geschwisterteil Ihrer Verbindungen sein (d.h. default ), kein Kind. Zusätzlich sollten die Optionen als key => value angegeben werden Paare.

Ihre Konfiguration sollte also folgendermaßen aussehen:

'redis' => [
    'cluster' => true,

    'default' => [
        'host' => env('REDIS_HOST', 'localhost'),
        'password' => env('REDIS_PASSWORD', null),
        'port' => env('REDIS_PORT', 6379),
        'database' => 0,
    ],

    'options' => [
        'cluster' => 'redis',
    ],
],

Der cluster Schlüssel unter redis config weist Laravel an, ein Aggregat Predis\Client zu erstellen Instanz, die mehrere Knoten handhaben kann, und der cluster Schlüssel unter den options array teilt dieser Instanz mit, dass sie serverseitiges Clustering verarbeiten muss, nicht clientseitiges Clustering.

Auth

Die ursprünglichen Verbindungsparameter (einschließlich Authentifizierung) werden nicht mit Verbindungen zu neuen Knoten geteilt, die über -MOVED entdeckt werden und -ASK Antworten. Also alle Fehler, die Sie zuvor von -MOVED erhalten haben Antworten werden jetzt einfach in NOAUTH umgewandelt Fehler. Allerdings der serverseitige 'cluster' Konfiguration erlaubt einen 'parameters' Geschwister, das eine Liste von Parametern definiert, die mit neu entdeckten Knoten verwendet werden sollen. Hier können Sie Ihre Authentifizierungsparameter zur Verwendung mit neuen Knoten eingeben.

Ich glaube, das wird in etwa so aussehen:

'redis' => [
    'cluster' => true,

    'default' => [
        'host' => env('REDIS_HOST', 'localhost'),
        'password' => env('REDIS_PASSWORD', null),
        'port' => env('REDIS_PORT', 6379),
        'database' => 0,
    ],

    'options' => [
        'cluster' => 'redis',
        'parameters' => ['password' => env('REDIS_PASSWORD', null)],
    ],
],

Faire Warnung, das sind alles Informationen, die ich gerade aus Recherchen und Code-Diving erhalten habe. Obwohl ich Redis mit Laravel verwendet habe, habe ich (noch) kein serverseitiges Clustering verwendet, daher funktioniert dies möglicherweise immer noch nicht.

Einige nützliche Informationen, auf die ich gestoßen bin, als ich mich damit befasst habe:

Predis-Problem bezüglich der Verbindung zu einem Redis-Cluster:
https://github.com/nrk/predis/issues/259#issuecomment-117339028

Es sieht so aus, als hätten Sie Predis nicht für die Verwendung von Redis-Cluster konfiguriert, sondern Sie verwenden es stattdessen mit der einfachen alten clientseitigen Sharding-Logik (was auch das Standardverhalten ist). Sie sollten den Client so konfigurieren, dass er die Option cluster mit dem Wert redis einstellt, damit der Client weiß, dass er redis-cluster mitspielen muss. Kurzes Beispiel:

$client = new Predis\Client([$node1, $node2, ...], ['cluster' => 'redis']);

Dadurch kann der Client automatisch -MOVED- oder -ASK-Antworten verarbeiten, die von Redis-Knoten kommen.

MS-Artikel über Clustering auf Redis-Cache:
https://docs.microsoft.com/en-us/azure/redis-cache/cache-how-to-premium-clustering#how-do-i-connect- zu-meinem-cache-wenn-clustering-aktiviert ist

Sie können mit denselben Endpunkten, Ports und Schlüsseln eine Verbindung zu Ihrem Cache herstellen, die Sie verwenden, wenn Sie eine Verbindung zu einem Cache herstellen, für den Clustering nicht aktiviert ist. Redis verwaltet das Clustering im Back-End, sodass Sie es nicht von Ihrem Client aus verwalten müssen.

Laravel-Code zum Erstellen von Predis\Client Instanzen:
https://github.com/laravel/framework/blob/v5.3.28/src/Illuminate/Redis/Database.php#L25-L66