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 vondefault
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