So starten Sie schnell mit VUE3.0: Lernen Sie
die Verwendung der redis
Cluster-Funktion in nodejs
kennen. Ich habe keinen relativ vollständigen und leicht verständlichen Artikel gefunden, daher habe ich während der Entwicklung und beim Debuggen auch viele Umwege gemacht Verfahren.
In diesem Artikel wird detailliert beschrieben , wie ein Redis-Cluster lokal erstellt wird, wie der Cluster auf dem Client verwendet wird. Außerdem werden die während des Erstellungsprozesses aufgetretenen Probleme und Fehler zusammengefasst und erläutert, um beim nächsten Mal Umwege zu vermeiden und die Entwicklungs- und Arbeitseffizienz zu verbessern.
Der Hintergrund der Verwendung des Clusters ist: Im Redis-Singleton-Modus steigt der QPS-Wert mit zunehmender Anzahl von Benutzern und Besuchen stark an. Eine große Anzahl von io
-Vorgängen führt dazu cpu(100%)
Es kann jederzeit zu Ausfallzeiten kommen. Gleichzeitig behandeln Redis und andere Methoden nur die Symptome, nicht jedoch die Grundursache, und können den Engpass der Serverleistung nicht überwinden . Daher ist es zwingend erforderlich, eine Clusterlösung zu verwenden oder Redis-Instanzen hinzuzufügen.
bezieht sich im Allgemeinen auf einen Servercluster, der sich von einem verteilten System unterscheidet. Er versammelt viele Server, um denselben Dienst auszuführen. Aus der Sicht des Clients sieht es so aus, als gäbe es nur einen Server. Ein Cluster kann mehrere Computer für paralleles Rechnen nutzen, um eine hohe Rechengeschwindigkeit zu erreichen. Außerdem können mehrere Computer für Backups verwendet werden, sodass das gesamte System weiterhin normal laufen kann, wenn eine Maschine ausfällt. ( Vor redis3.0 wurde im Allgemeinen der Sentinel-Modus verwendet, aber die Konfiguration des Sentinel ist etwas kompliziert und die Leistung und hohe Verfügbarkeit sind durchschnittlich .)
aufgrund des Abstimmungsfehlertoleranzmechanismus mehr als die Hälfte Knoten glauben, dass ein bestimmter Knoten ausgefallen ist, sodass 2 Knoten keinen Cluster bilden können, sodass der Redis-Cluster mindestens 3 Knoten benötigt.
Um die hohe Verfügbarkeit des Clusters sicherzustellen, muss jeder Knoten über einen Slave-Knoten (dh einen Backup-Knoten) verfügen, sodass Redis
-Cluster mindestens 6 Server benötigt. (Drei Master und drei Slaves, drei Einzahlungen und drei Abrufe, hohe Verfügbarkeit und Sicherung)
Natürlich ist es für uns unmöglich, beim lokalen Debuggen so viele Server zu verwenden, sodass wir die lokale Ausführung von 6 redis
Instanzen simulieren können Redis-Cluster in der Produktionsumgebung Der Build ist grundsätzlich derselbe wie hier.
. Sie können es auf der offiziellen Website installieren oder es mit der benannten Zeile
#install brew install redisinstallieren
#Redis-Server starten #Geben Sie den Redis-Client redis-cli
müssen Sie zuerst den Speicherort der Redis-Konfigurationsdatei finden
brew list redis
# Überprüfen Sie den Speicherort der Redis-Installationscd /opt/homebrew/Cellar/redis/6.2.4
# Geben Sie die Version entsprechend dem Speicherort ein. Der Ordner, in dem sich die Nummer befindet,open .
# Öffnen Sie den OrdnerXcode.app
um homebrew.mxcl.redis.plist
zu öffnen, um den Speicherort von redis.conf
zu finden, wie gezeigt unten:Erstellen Sie sechs Dienstkonfigurationsdateien
cd /opt/homebrew/etc/
(das im vorherigen Schritt gefundene Konfigurationsdateiverzeichnis)
# Muss sich im Pfad /opt/homebrew/etc/ befinden mkdir -p redis/cluster/7000 mkdir -p redis/cluster/7001 mkdir -p redis/cluster/7002 mkdir -p redis/cluster/7003 mkdir -p redis/cluster/7004 mkdir -p redis/cluster/7005
Ändern Sie die Konfigurationsdatei.
Die Konfigurationsdatei unter dem Pfad /opt/homebrew/etc/redis.conf
muss nicht geändert werden. Kopieren Sie sie einfach in das oben erstellte Verzeichnis redis/cluster/7000
Ändern Sie es. Die Schritte sind wie folgt:
cd /opt/homebrew/etc/ # Geben Sie das Konfigurationsdateiverzeichnis cp redis.conf redis/cluster/7000/7000.conf ein Code redis/cluster/7000/7000.conf # Öffnen Sie die Konfigurationsdatei mit einem Editor oder vim, um sie zu ändern.
7000.conf
die folgenden Eigenschaften# Redis-Portnummer (jede Konfigurationsdatei 7000-7005 muss geändert werden). Port 7000 # Cluster-Modus aktivieren und Cluster-fähig ausführen, ja # Pfad der internen Konfigurationsdatei des Clusters, Standardknoten-6379.conf (jede Konfigurationsdatei 7000-7005 muss geändert werden) Cluster-Konfigurationsdatei nodes-7000.conf # Timeout für die Kommunikation zwischen Knoten, Cluster-Node-Timeout 5000 # Datenpersistenz nur anhängen ja
cd /opt/homebrew/etc/redis/cluster # Geben Sie das Konfigurationsdateiverzeichnis ein cp 7000/7000.conf 7001/7001.conf cp 7000/7000.conf 7002/7002.conf cp 7000/7000.conf 7003/7003.conf cp 7000/7000.conf 7004/7004.conf cp 7000/7000.conf 7005/7005.conf
7001.conf-7005.conf
Hinweis: Jede Konfigurationsdatei muss unterschiedliche port和cluster-config-file
konfigurieren. port和cluster-config-file
(andernfalls wird der Cluster nicht wirksam), der durch den Port unterschieden wird.
Das Verzeichnis der Konfigurationsdatei kann über den Befehl find /opt/homebrew -name nodes-7000.conf
gefunden werden.
Da wir 6 Dienste konfiguriert haben, ist es unmöglich, sie einzeln zu starten oder zu stoppen. Sie müssen ein Shell-Skript verwenden, um
das Verzeichnis /opt/homebrew/etc/redis/cluster
aufzurufen und zu erstellen start.sh und stop. .sh-Datei
# start.sh-Datei#!/bin/sh redis-server /opt/homebrew/etc/redis/cluster/7000/7000.conf & redis-server /opt/homebrew/etc/redis/cluster/7001/7001.conf & redis-server /opt/homebrew/etc/redis/cluster/7002/7002.conf & redis-server /opt/homebrew/etc/redis/cluster/7003/7003.conf & redis-server /opt/homebrew/etc/redis/cluster/7004/7004.conf & redis-server /opt/homebrew/etc/redis/cluster/7005/7005.conf & # stop.sh-Datei #!/bin/sh redis-cli -p 7000 Herunterfahren & redis-cli -p 7001 Herunterfahren & redis-cli -p 7002 Herunterfahren & redis-cli -p 7003 Herunterfahren & redis-cli -p 7004 Herunterfahren & redis-cli -p 7005 Shutdown &
Ausführen von ./start.sh
oder ./stop.sh
um den Dienst zu starten und zu stoppen.
Führen Sie ps -ef |grep redis
aus, um den gestarteten Redis-Dienst anzuzeigen.
Hinweis: Es ist erforderlich, ./ auszuführen. start.sh zum ersten Mal. Autorisieren Sie Ausführungsberechtigungen über sudo chmod +x start.sh
redis-cli -p 7000 # Starten Sie einen einzelnen Client redis-server 7000/7000.conf # Starten Sie einen einzelnen Server redis-cli -p 7000 Shutdown # Server herunterfahren sudo chmod +x start.sh # Berechtigung zur Skriptausführung aktivieren # Redis-Master-Slave-Beziehung festlegen (drei Master und drei Slaves) redis-cli --cluster create --cluster-replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 Cluster-Knoten #Cluster-Knotenstatus anzeigen (einen Client zur Ausführung eingeben) Cluster-Info #Cluster-Informationen anzeigen (einen auszuführenden Client eingeben) Alle Schlüsselwerte anzeigen: Schlüssel * Löschen Sie den Wert am angegebenen Index: Entf-Taste Löschen Sie die Daten des gesamten Redis-Servers: Flushall Löschen Sie alle Schlüssel in der aktuellen Bibliothek: Der Flushdb-
. node redis.js
können Sie die Wirkung des Clusters testen. ioredis
// redis.js const Redis = require("ioredis"); const Cluster = new Redis.Cluster([ { Hafen: 7000, Host: „127.0.0.1“, }, { Hafen: 7001, Host: „127.0.0.1“, }, ]); Cluster.set("foo", "bar"); Cluster.get("foo", (err, res) => { // res === 'bar' });
um die Warteschlange von „Bull“ zu importieren. // Eine Redis-Warteschlangeninstanz erstellen const example = new Queue('custom', { Präfix: '{myprefix}', createClient(type) { // Cluster-Cluster-Instanz ist die gleiche wie oben, Rückgabecluster } }) //Daten zur Redis-Warteschlange hinzufügen (Produzent) Instanz.add( 'Anfrage', { ...Parameter }, { removeOnComplete: false } ).catch(e => { console.error(e) }) // Consumer-Callback instance.process('request', 5, async (job, done) => { console.log('Aktuell verbrauchte Daten abrufen:', job.data) //Asynchrone Operation ausführen, auf neues Versprechen warten((resolve)=>resolve()) Erledigt() })
Bei der Verwendung des bull
-Frameworks zum Herstellen einer Verbindung zum ioredis
-Cluster liegt ein Problem vor: Jedes Mal, wenn Daten in die redis
-Warteschlange push
, kann die entsprechende Rückruffunktion mehrmals ausgelöst werden. Derzeit kann nicht festgestellt werden, ob es sich um ein Problem handelt die Verwendung oder ein Problem mit dem Framework selbst (wenn Sie mehr wissen, heißen Sie alle herzlich willkommen. Hinterlassen Sie eine Nachricht, um dies zu informieren).
Alternative zum Clustering: Wenn keine Datensynchronisierung und Datenmigration erforderlich sind, können mehrere redis
-Instanzen auf dem Client verwendet werden, kombiniert mit Math.random()
, um die Daten gleichmäßig auf eine redis
aufzuteilen und so das Problem der Hardware einzelner Instanzen zu lösen ( cpu
usw.) Engpassproblem.
1. Tritt beim Herstellen einer Verbindung zu Redis unter einem Mac-System ein Fehler auf?
Konsolenfehlermeldung: Verbindung zu Redis unter 127.0.0.1:6379 konnte nicht hergestellt werden: Verbindung abgelehnt
Grund: Der Server ist nicht gestartet oder startet nicht.
Lösung: Sie müssen zuerst den Redis-Server starten. Redis-Server-
Referenzlink
https://blog. csdn.net/qq_23347459/article/details/104257529
2. Meldet der Client beim Starten einen Fehler beim Lesen oder Schreiben?
Fehlermeldung: ClusterAllFailedError: Slot-Cache konnte nicht aktualisiert werden.
Grund: Die Cluster-Config-File-Attribute in den Konfigurationsdateien unter jedem Dienst sind konsistent.
Verarbeitung: Auf eindeutigen Attributwert ändern.
Referenzlink 1
https://stackoverflow.com/questions/57350961/ioredis-clusterallfailederror-failed-to-refresh-slots-cache
Referenz 2
https://github.com/luin/ioredis/ issues /711
3. Die Anweisung „create master-slave redis“ konnte nicht ausgeführt werden?
Anweisung ausführen: redis-cli --cluster create --cluster-replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
Eingabeaufforderungsfehler: [ERR] Node 127.0.0.1:7000 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0
: Beim Ausführen der create-Anweisung werden die Daten nicht gelöscht und der Cluster wird nicht zurückgesetzt .
Verarbeitung: Daten löschen und Cluster zurücksetzen, RDB- und AOF-Dateien löschen,
siehe Redis-Daten löschen
https://stackoverflow.com/questions/37206993/redis-server-cluster-not-working
# Nutzen Sie den Dienst von Port 7000 Wiederholen Sie beispielsweise die folgenden Vorgänge für 7001-7005 $redis-cli -p 7000 127.0.0.1:7000> Flushall 127.0.0.1:7000> Cluster-Reset 127.0.0.1:7000>exit # Verwenden Sie find, um die RDB- und AOF-Dateien zu finden (auch im RDB-Verzeichnis). Finden Sie /opt/homebrew -name dump.rdb # Führen Sie die create-Anweisung erneut erfolgreich aus redis-cli --cluster create --cluster-replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1: 7005
Die Verwendung des Redis-Clusters auf dem Client ist sehr einfach, im Vergleich dazu ist die Konfiguration auf dem Server umständlicher.
Die konkrete Verwendung des Clients wird nur kurz erläutert. Bei der Verwendung sollte auf Themen wie die Synchronisierung und Migration von Redis-Daten geachtet werden.
Obwohl die Verwendung eines Clusters die Servicefunktionen verbessern, die Master-Slave-Replikation, den Sentinel-Modus, die Lese-/Schreibtrennung unterstützen und den Druck auf den Server gleichmäßig verteilen kann usw. Es verfügt jedoch nicht über automatische Fehlertoleranz- und Wiederherstellungsfunktionen. Bei einem Ausfall schlagen einige Lese- und Schreibanforderungen fehl, wodurch die Verfügbarkeit des Systems verringert wird. Analysieren Sie bei der Verwendung verschiedene Lösungen und wählen Sie sie basierend auf den Geschäftsbedingungen aus.
Dieser Artikel wurde reproduziert von: https://juejin.cn/post/7079928963107127327
Autor: Tager