Skalierung von Redis: Leitfaden zur Einrichtung eines Redis Clusters
Redis, ein leistungsstarker In-Memory-Datenspeicher, wird häufig als Datenbank, Cache und Message Broker eingesetzt. Während eine einzelne Redis-Instanz eine erhebliche Last bewältigen kann, benötigen viele Anwendungen letztendlich eine höhere Verfügbarkeit und die Möglichkeit, horizontal zu skalieren, um wachsende Datenmengen und Traffic zu bewältigen. Redis Cluster bietet eine native Lösung, um beide Ziele zu erreichen.
Dieser Leitfaden führt Sie durch den Prozess der Einrichtung, Konfiguration und Verwaltung eines Redis Clusters. Wir behandeln die grundlegenden Konzepte, stellen Schritt-für-Schritt-Anleitungen für Installation und Konfiguration bereit und besprechen wesentliche Verwaltungsaufgaben, um sicherzustellen, dass Ihr Cluster robust und leistungsfähig bleibt.
Redis Cluster Konzepte verstehen
Bevor Sie sich in die Einrichtung stürzen, ist es entscheidend, die Kernkonzepte zu verstehen, die dem Redis Cluster zugrunde liegen:
- Sharding (Partitionierung): Redis Cluster partitioniert Ihren Datensatz über mehrere Redis-Knoten hinweg. Jeder Knoten ist für eine Teilmenge der Hash-Slots (insgesamt 16384) verantwortlich. Wenn ein Client auf einen Schlüssel zugreifen muss, berechnet die Client-Bibliothek, zu welchem Hash-Slot der Schlüssel gehört, und leitet die Anfrage an den entsprechenden Knoten weiter.
- Replikation: Für hohe Verfügbarkeit kann jeder primäre Knoten im Cluster einen oder mehrere Replika-Knoten haben. Wenn ein primärer Knoten ausfällt, kann eine seiner Replikas befördert werden, um seinen Platz einzunehmen, wodurch Ausfallzeiten minimiert werden.
- Gossip-Protokoll: Redis Cluster-Knoten kommunizieren miteinander über ein Gossip-Protokoll. Dies ermöglicht es den Knoten, sich gegenseitig zu entdecken, Informationen über ihren Zustand auszutauschen und Fehler zu erkennen.
- Konsens: Wenn ein primärer Knoten ausfällt, muss der Cluster unter den verbleibenden primären Knoten einen Konsens erzielen, um einen neuen primären Knoten aus seinen Replikas zu wählen. Dieser Prozess stellt sicher, dass der Cluster betriebsbereit bleibt.
Voraussetzungen
Um einen Redis Cluster einzurichten, benötigen Sie:
- Mehrere Server oder virtuelle Maschinen (mindestens 6 Knoten werden für eine produktionsreife Einrichtung empfohlen: 3 primäre und 3 Replikas).
- Redis auf jedem Server installiert. Stellen Sie sicher, dass Sie Redis Version 3.0 oder höher verwenden.
- Netzwerkkonnektivität zwischen allen Knoten. Knoten müssen in der Lage sein, miteinander über ihren Client-Port und ihren Cluster-Bus-Port (Client-Port + 10000) zu kommunizieren.
redis-cli, die Redis-Befehlszeilenschnittstelle, die das Skriptredis-trib.rbzur Cluster-Erstellung enthält.
Einrichten eines Redis Clusters: Schritt für Schritt
Dieser Abschnitt bietet eine praktische Schritt-für-Schritt-Anleitung zur Erstellung eines grundlegenden Redis Clusters. Der Einfachheit halber gehen wir davon aus, dass Sie einen Cluster auf einer einzelnen Maschine einrichten und dabei verschiedene Ports für jeden Knoten verwenden. In einer Produktionsumgebung würden Sie diese Knoten typischerweise auf verschiedene physische oder virtuelle Maschinen verteilen.
1. Redis installieren
Wenn Redis noch nicht installiert ist, folgen Sie der offiziellen Redis-Installationsanleitung für Ihr Betriebssystem. Zum Beispiel unter Debian/Ubuntu:
sudo apt update
sudo apt install redis-server
2. Redis-Instanzen für den Cluster-Modus konfigurieren
Für jeden Knoten in Ihrem Cluster benötigen Sie eine separate Redis-Konfigurationsdatei. Erstellen Sie Verzeichnisse für jeden Knoten und kopieren Sie die Standarddatei redis.conf.
Nehmen wir an, wir richten für diese Ersteinrichtung einen primären 3-Knoten-Cluster ohne Replikas ein. Wir verwenden die Ports 7000, 7001 und 7002.
# Verzeichnisse für jeden Knoten erstellen
mkdir cluster
cd cluster
mkdir 7000 7001 7002
# redis.conf in jedes Verzeichnis kopieren
cp /etc/redis/redis.conf ./7000/
cp /etc/redis/redis.conf ./7001/
cp /etc/redis/redis.conf ./7002/
Bearbeiten Sie nun die Konfigurationsdatei für jeden Knoten. Nehmen Sie für 7000/redis.conf, 7001/redis.conf und 7002/redis.conf die folgenden Änderungen vor:
port 700X(wobei X 0, 1 oder 2 ist)cluster-enabled yescluster-config-file nodes-700X.conf(Diese Datei wird von Redis selbst verwaltet und sollte nicht manuell bearbeitet werden. Sie speichert den Cluster-Zustand.)cluster-node-timeout 5000(Empfohlenes Timeout in Millisekunden, bis ein Knoten als ausgefallen gilt.)appendonly yes(Empfohlen für Datenbeständigkeit, insbesondere in der Produktion)
Beispiel für 7000/redis.conf:
port 7000
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-node-timeout 5000
appendonly yes
# Stellen Sie sicher, dass bind auf 0.0.0.0 oder die korrekte IP eingestellt ist, wenn Sie auf einer Remote-Maschine laufen
bind 0.0.0.0
Wiederholen Sie diese Änderungen für 7001/redis.conf (Port 7001) und 7002/redis.conf (Port 7002).
3. Redis-Instanzen starten
Starten Sie jede Redis-Instanz mit ihrer spezifischen Konfigurationsdatei:
redis-server ./7000/redis.conf
redis-server ./7001/redis.conf
redis-server ./7002/redis.conf
Wenn Redis als Dienst ausgeführt wird, müssen Sie möglicherweise die Standardinstanz (sudo systemctl stop redis-server) beenden und die Instanzen wie oben gezeigt manuell starten, oder mehrere Dienstdateien konfigurieren.
4. Cluster mit redis-trib.rb erstellen
Das Skript redis-trib.rb ist ein Ruby-Gem, das die automatisierte Erstellung eines Redis Clusters unterstützt. Es ist in den Redis-Distributionen enthalten.
Navigieren Sie zu dem Verzeichnis, in dem sich redis-trib.rb befindet (oft in /usr/share/redis/, oder Sie müssen es in Ihrer Redis-Installation finden). Möglicherweise müssen Sie Ruby installieren, falls es nicht vorhanden ist (sudo apt install ruby-full).
Führen Sie das Skript aus, um einen Cluster mit 3 Master-Knoten zu erstellen:
# Stellen Sie sicher, dass Sie sich im Cluster-Verzeichnis befinden oder geben Sie die vollständigen Pfade an
# ruby /path/to/redis/src/redis-trib.rb create --replicas 0 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002
# Oder wenn redis-trib.rb in Ihrem PATH ist
redis-trib.rb create --replicas 0 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002
Dieser Befehl:
* create: Weist redis-trib.rb an, einen neuen Cluster zu erstellen.
* --replicas 0: Gibt an, dass wir 0 Replikas pro Master wünschen. Für eine Produktionsumgebung würden Sie --replicas 1 (oder mehr) verwenden.
* 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002: Listet die Knoten auf, die am Cluster teilnehmen werden.
Das Skript wird um Bestätigung bitten. Geben Sie yes ein, um fortzufahren. Es wird dann jedem Master-Knoten Hash-Slots zuweisen und den Cluster konfigurieren.
5. Cluster überprüfen
Nachdem redis-trib.rb abgeschlossen ist, können Sie sich mit einem beliebigen Knoten verbinden und den Cluster-Status überprüfen:
redis-cli -c -p 7000
CLUSTER INFO
CLUSTER NODES
Der Befehl CLUSTER INFO sollte cluster_state:ok anzeigen. Der Befehl CLUSTER NODES listet alle Knoten im Cluster, ihre Rollen und ihre zugewiesenen Slots auf.
Tipp: Verwenden Sie das Flag -c mit redis-cli (redis-cli -c), um den Cluster-Modus zu aktivieren. Dies ermöglicht es redis-cli, Befehle automatisch an den richtigen Knoten umzuleiten, wenn eine Hash-Slot-Migration oder Umleitung erforderlich ist.
Replikas zu einem bestehenden Cluster hinzufügen
Für hohe Verfügbarkeit sollten Sie Replikas hinzufügen. Fügen wir eine Replika für den Knoten an Port 7000 (Master) an Port 7003 hinzu.
- Neuen Knoten konfigurieren: Erstellen Sie ein neues Verzeichnis (z.B.
cluster/7003), kopieren Sieredis.confund aktualisieren Sie es für Port 7003, aktivieren Sie den Cluster-Modus und legen Sie diecluster-config-filefest.
ini port 7003 cluster-enabled yes cluster-config-file nodes-7003.conf cluster-node-timeout 5000 appendonly yes bind 0.0.0.0 - Neuen Knoten starten:
redis-server ./7003/redis.conf -
Replika mit
redis-trib.rbhinzufügen: Verbinden Sie sich mit Ihrem bestehenden Cluster überredis-cli -c -p 7000und verwenden Sie den BefehlCLUSTER REPLICATEoderredis-trib.rberneut. Die Verwendung vonredis-trib.rbist für die Ersteinrichtung im Allgemeinen einfacher.```bash
Beispiel für die Verwendung von redis-trib.rb zum Hinzufügen einer Replika für Knoten 7000
Sie benötigen die Knoten-ID des Masters, den Sie replizieren möchten.
Rufen Sie zuerst die Knoten-ID ab: redis-cli -p 7000 CLUSTER NODES
Nehmen wir an, die Master-Knoten-ID ist 'your_master_node_id'
redis-trib.rb --cluster-add-node 127.0.0.1:7003 --cluster-slave --cluster-master-id
127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002
`` *Hinweis*: Der Befehlredis-trib.rbzum Hinzufügen von Knoten kann etwas komplex sein. Ein einfacherer Ansatz zum Hinzufügen von Replikas besteht darin, zuerst die neue Replika-Instanz hochzufahren, sich dann überredis-climit dem Master-Knoten zu verbinden und den BefehlCLUSTER REPLICATE` auszuführen. Alternativ können Sie
redis-trib.rbverwenden, um einen bestehenden Cluster mit Replikas neu zu konfigurieren:```bash
Beispiel zum Hinzufügen von Replikas zu einem bestehenden 3-Master-Cluster
redis-trib.rb replace-node-master --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
```
Dieser Befehl ist komplexer und setzt voraus, dass Sie zusätzliche Knoten (7003, 7004, 7005) als Replikas konfiguriert haben.
6. Cluster verwalten
- Knoten hinzufügen/entfernen: Sie können neue Master-Knoten und Replikas hinzufügen, um den Cluster zu skalieren.
redis-trib.rboder manuelle Befehle können verwendet werden. Das Entfernen von Knoten erfordert zuerst die Migration von Slots von diesem Knoten. - Failover: Redis Cluster behandelt Failover automatisch. Wenn ein Master-Knoten unerreichbar wird, versuchen seine Replikas, befördert zu werden. Sie können Fehler mit
CLUSTER FAILOVER(auf einer Replika) oder durch Stoppen eines Knotens simulieren. - Slots verschieben: Sie können Hash-Slots manuell zwischen Master-Knoten verschieben, indem Sie die Befehle
CLUSTER SETSLOT <slot> IMPORTING/NODEundMIGRATEverwenden. Dies ist nützlich, um den Cluster neu auszugleichen oder einen Knoten zur Entfernung vorzubereiten.
Bewährte Praktiken für Redis Cluster
- Mindestens 6 Knoten verwenden: Ein produktionsreifer Cluster sollte für Fehlertoleranz mindestens 3 Master und 3 Replikas (eine Replika pro Master) haben.
- Knoten über Verfügbarkeitszonen verteilen: Bei Cloud-Bereitstellungen sollten Knoten in verschiedenen Verfügbarkeitszonen platziert werden, um sich vor Zonen-weiten Ausfällen zu schützen.
- Cluster überwachen: Verwenden Sie die Überwachungstools von Redis und externe Überwachungssysteme, um Leistung, Speichernutzung und Knotenzustand zu verfolgen.
protected-mode nokonfigurieren: Wenn Sie Redis Cluster in einem Netzwerk betreiben, stellen Sie sicher, dassprotected-mode noin Ihrerredis.confeingestellt ist und verwenden Sie eine Firewall, um den Zugriff zu beschränken.appendonly yesverwenden: Für Datenbeständigkeit stellen Sie sicher, dass die Append-Only-Datei-Persistenz aktiviert ist.- Unterstützung der Client-Bibliothek: Stellen Sie sicher, dass Ihre Redis-Client-Bibliothek Redis Cluster unterstützt und Umleitungen korrekt verarbeitet.
Fazit
Die Einrichtung eines Redis Clusters ist ein entscheidender Schritt für Anwendungen, die hohe Verfügbarkeit und horizontale Skalierbarkeit erfordern. Indem Sie die Kernkonzepte von Sharding, Replikation und Cluster-Kommunikation verstehen, können Sie einen robusten Redis Cluster erfolgreich bereitstellen und verwalten. Denken Sie daran, Ihre Cluster-Topologie zu planen, deren Zustand zu überwachen und bewährte Praktiken zu befolgen, um optimale Leistung und Zuverlässigkeit zu gewährleisten.