Redis ist eine In-Memory-Datenbank mit einer Schlüssel-Werte-Datenstruktur, die für ihre Flexibilität, Leistung, breite Sprachunterstützung und integrierte Funktionen wie Replikation bekannt ist. Replikation besteht aus der Praxis, Daten regelmäßig aus einer Datenbank in eine andere zu kopieren, um über ein Replikat zu verfügen, das immer ein exaktes Duplikat der Primärinstanz bleibt. Ein häufiges Anwendungsgebiet der Redis-Replikation besteht darin, einen bestehenden Redis-Datenspeicher auf einen neuen Server zu migrieren, wie man es ggf. bei der Skalierung von Infrastruktur für bessere Leistung tut.
Dieses Tutorial beschreibt den Prozess zur Verwendung der integrierten Replikationsfunktionen von Redis, um Daten von einem Ubuntu 18.04-Server (die “Quelle”) auf einen anderen Server (das “Ziel”) zu migrieren. Dabei werden für jeden Server einige Konfigurationsänderungen vorgenommen, wobei der Zielserver als Replikat des Quellservers eingerichtet und das Replikat anschließend nach Abschluss der Migration zurück zu einem primären Server hochgestuft wird.
Um diesem Tutorial zu folgen, benötigen Sie:
ufw
eine Firewall eingerichtet werden. Zum Einrichten dieser Umgebung folgen Sie für beide Server unserem Tutorial Ersteinrichtung eines Servers für Ubuntu 18.04.Dieser optionale Schritt beinhaltet das Laden Ihrer Redis-Quellinstanz mit einigen Beispieldaten, damit Sie mit der Migration von Daten zu Ihrer Zielinstanz experimentieren können. Wenn Sie bereits über Daten verfügen, die Sie zu Ihrer Zielinstanz migrieren möchten, können Sie mit Schritt 2 fortfahren, wo es um ihre Sicherung geht.
Stellen Sie zunächst als non-root user eine Verbindung mit dem Ubuntu-Server her, den Sie als Ihre Redis-Quellinstanz verwenden werden:
- ssh sammy@source_server_ip
Führen Sie dann den folgenden Befehl aus, um auf Ihren Redis-Server zuzugreifen:
- redis-cli
Wenn Sie Ihren Redis-Server so konfiguriert haben, dass eine Authentifizierung mit Passwort vorgeschrieben ist, führen Sie den Befehl auth
gefolgt von Ihrem Redis-Kennwort aus:
- auth source_redis_password
Führen Sie als Nächstes folgende Befehle aus. Dadurch werden verschiedene Schlüssel erstellt, die einige Zeichenfolgen, ein Hash, eine Liste und ein Set enthalten:
- mset string1 "Redis" string2 "is" string3 "fun!"
- hmset hash1 field1 "Redis" field2 "is" field3 "fast!"
- rpush list1 "Redis" "is" "feature-rich!"
- sadd set1 "Redis" "is" "free!"
Führen Sie zusätzlich folgende expire
-Befehle aus, um einige dieser Schlüssel mit einem Timeout bereitzustellen. Dadurch werden sie flüchtig, was bedeutet, dass Redis sie nach einer festgelegten Zeit (in diesem Fall nach 7500
Sekunden) löschen wird.
- expire string2 7500
- expire hash1 7500
- expire set1 7500
Somit verfügen Sie über einige Beispieldaten, die Sie in Ihre Redis-Zielinstanz exportieren können. Behalten Sie die Eingabeaufforderung redis-cli
vorerst geöffnet, da wir im nächsten Schritt einige weitere Befehle darüber ausführen, um diese Daten zu sichern.
Jedes Mal, wenn Sie planen, Daten von einem Server auf einen anderen zu verschieben, besteht die Gefahr, dass etwas schiefgeht und Sie dadurch Daten verlieren. Obwohl dieses Risiko gering ist, verwenden wir den Befehl bgsave
von Redis zur Erstellung eines Backups Ihrer Redis-Quelldatenbank, sollte bei der Replikation ein Fehler auftreten.
Wenn Sie sie nicht bereits geöffnet haben, öffnen Sie zunächst die Redis-Befehlszeilenschnittstelle:
- redis-cli
Wenn Sie Ihren Redis-Server so konfiguriert haben, dass eine Authentifizierung mit Passwort vorgeschrieben ist, führen Sie außerdem den Befehl auth
gefolgt von Ihrem Redis-Passwort aus:
- auth password
Führen Sie als Nächstes den Befehl bgsave
aus. Dadurch wird ein Snapshot Ihres aktuellen Datasets erstellt und in eine Dumpdatei exportiert, die im Arbeitsverzeichnis von Redis enthalten ist:
- bgsave
Anmerkung: Sie können mit den Befehlen save
oder bgsave
einen Snapshot Ihrer Redis-Datenbank erstellen. Wir verwenden hier jedoch den Befehl bgsave
, da der Befehl save
synchron ausgeführt wird, d.h. er blockiert alle anderen Clients, die mit der Datenbank verbunden sind. Aus diesem Grund wird in der Dokumentation zum Befehl save
empfohlen, ihn praktisch nie in einer Produktionsumgebung auszuführen.
Stattdessen wird die Verwendung des Befehls bgsave
empfohlen, der asynchron ausgeführt wird. Dadurch wird Redis die Datenbank in zwei Prozesse forken: Der übergeordnete Prozess wird weiterhin Clients bedienen, während der untergeordnete Prozess die Datenbank vor dem Verlassen speichert:
Beachten Sie, dass wenn Clients Daten hinzufügen oder ändern, während die Operation bgsave
ausgeführt wird, die entsprechenden Änderungen nicht im Snapshot erfasst werden.
Danach können Sie die Verbindung zu Ihrer Redis-Instanz schließen, indem Sie den Befehl exit
ausführen:
- exit
Wenn Sie sie in Zukunft brauchen, finden Sie die Datendumpdatei im Arbeitsverzeichnis Ihrer Redis-Instanz. Erinnern Sie sich daran, wie Sie Ihre Redis-Instanz im Tutorial zu den Voraussetzungen einer Redis-Installation so eingerichtet haben, dass sie /var/lib/redis
als ihr Arbeitsverzeichnis verwendet.
Listen Sie die Inhalte Ihres Redis-Arbeitsverzeichnisses auf, um zu bestätigen, dass die Datendumpdatei darin enthalten ist.
- sudo ls /var/lib/redis
Wenn die Dumpdatei richtig exportiert wurde, sehen Sie sie in der Ausgabe dieses Befehls. Standardmäßig trägt diese Datei den Namen dump.rdb
:
Outputdump.rdb
Nachdem Sie bestätigt haben, dass Ihre Daten erfolgreich gesichert wurden, können Sie Ihren Redis-Quellserver so konfigurieren, dass externe Verbindungen akzeptiert werden und Replikation zugelassen wird.
Standardmäßig ist Redis nicht so konfiguriert, dass nach externen Verbindungen gelauscht wird. Das bedeutet, dass jegliche Replikate, die Sie konfigurieren, nicht mit Ihrer Quellinstanz synchronisieren können, es sei denn, Sie aktualisieren Ihre Konfiguration. Hier aktualisieren wir die Konfigurationsdatei der Quellinstanz, um externe Verbindungen zuzulassen und ein Passwort festzusetzen, das die Zielinstanz nach Beginn der Replikation zur Authentifizierung nutzen soll. Danach fügen wir eine Firewall-Regel hinzu, um Verbindungen zu dem Port zuzulassen, an dem Redis ausgeführt wird.
Öffnen Sie die Konfigurationsdatei Ihrer Redis-Quellinstanz mit Ihrem bevorzugten Texteditor. Wir verwenden hier nano
:
- sudo nano /etc/redis/redis.conf
Navigieren Sie zu der Zeile, die mit der Direktive bind
beginnt. Standardmäßig sieht das so aus:
. . .
bind 127.0.0.1
. . .
Diese Direktive bindet Redis an 127.0.0.1
, eine IPv4-Loopbackadresse, die localhost
repräsentiert. Dadurch wird diese Redis-Instanz so konfiguriert, dass nur nach Verbindungen gelauscht wird, die von demselben Server stammen, auf dem die Instanz installiert ist. Um zuzulassen, dass Ihre Quellinstanz alle Verbindungen zu ihrer öffentlichen IP-Adresse akzeptiert (wie z. B. die von Ihrer Zielinstanz), fügen Sie nach 127.0.0.1
die IP-Adresse Ihres Redis-Quellservers hinzu. Beachten Sie, dass Sie nach 127.0.0.1
keine Kommas verwenden dürfen:
. . .
bind 127.0.0.1 source_server_IP
. . .
Wenn Sie es noch nicht getan haben, verwenden Sie die Direktive requirepass
zur Konfiguration eines Passworts, das Benutzer eingeben müssen, bevor sie mit den Daten in der Quellinstanz interagieren können. Heben Sie dazu die Auskommentierung der Direktive auf und legen Sie ein komplexes Passwort oder eine Passphrase fest:
. . .
requirepass source_redis_password
. . .
Vergessen Sie nicht, sich das hier festgelegte Passwort zu notieren, da Sie es bei der Konfiguration des Zielservers benötigen.
Nach dieser Änderung können Sie die Redis-Konfigurationsdatei speichern und schließen. Wenn Sie sie mit nano
bearbeitet haben, drücken Sie dazu STRG+X
, Y
und dann die Eingabetaste
.
Starten Sie dann den Redis-Dienst neu, um die Änderungen in Kraft zu setzen:
- sudo systemctl restart redis
Das ist alles, was Sie zur Konfiguration von Redis tun müssen. Wenn Sie jedoch eine Firewall auf Ihrem Server konfiguriert haben, wird diese weiterhin alle Versuche durch Ihren Zielserver blockieren, sich mit der Quelle zu verbinden. Wenn Sie Ihre Firewall mit ufw
konfiguriert haben, können Sie sie mit dem folgenden Befehl aktualisieren, um Verbindungen zu dem Port zuzulassen, an dem Redis ausgeführt wird. Beachten Sie, dass Redis standardmäßig so konfiguriert ist, dass Port 6379
verwendet wird:
- sudo ufw allow 6379
Nachdem Sie diese letzte Änderung vorgenommen haben, haben Sie Ihren Redis-Quellserver fertig konfiguriert. Fahren Sie fort, indem Sie Ihre Redis-Zielinstanz so konfigurieren, dass sie als Replikat der Quelle dient.
Bisher haben Sie Ihre Redis-Quellinstanz so konfiguriert, dass externe Verbindungen akzeptiert werden. Da Sie jedoch den Zugriff auf die Quelle gesperrt haben, indem Sie die Auskommentierung der Direktive requirepass
aufgehoben haben, wird Ihre Zielinstanz die in der Quelle gespeicherten Daten nicht replizieren können. Hier werden Sie Ihre Redis-Zielinstanz so einrichten, dass sie ihre Verbindung zur Quelle authentifizieren kann. Dadurch wird Replikation möglich.
Verbinden Sie sich zunächst als non-root user mit Ihrem Redis-Zielserver:
- ssh sammy@target_server_ip
Öffnen Sie als Nächstes die Redis-Konfigurationsdatei Ihres Zielservers:
- sudo nano /etc/redis/redis.conf
Wenn Sie es noch nicht getan haben, sollten Sie mit der Direktive requirepass
ein Passwort für Ihre Redis-Zielinstanz einrichten:
. . .
requirepass target_redis_password
. . .
Heben Sie als Nächstes die Auskommentierung der Direktive masterauth
auf und setzen Sie sie auf das Authentifizierungskennwort Ihrer Redis-Quellinstanz. So kann sich Ihr Zielsever bei der Quellinstanz authentifizieren, wenn Sie Replikation aktivieren:
. . .
masterauth source_redis_password
. . .
Wenn Sie über Clients verfügen, die Daten in Ihre Quellinstanz schreiben, wollen Sie sie letztlich so konfigurieren, dass sie Daten auch in Ihre Zielinstanz schreiben. Wenn also ein Client Daten schreibt, nachdem Sie das Ziel wieder zu einer Primärinstanz hochgestuft haben, gehen diese nicht verloren.
Dazu müssen Sie jedoch die Direktive replica-read-only
anpassen. Diese ist standardmäßig auf yes
gesetzt, was bedeutet, dass sie so konfiguriert ist, dass sie zu einem “schreibgeschützten” Replikat wird, in das Clients nicht schreiben können. Setzen Sie diese Direktive auf no
, damit Clients darin schreiben können:
. . .
replica-read-only no
. . .
Das sind alle Änderungen, die Sie an der Konfigurationsdatei des Ziels vornehmen müssen. Sie können die Datei also speichern und schließen.
Starten Sie dann den Redis-Dienst neu, um die Änderungen in Kraft zu setzen:
- sudo systemctl restart redis
Nach dem Neustart des Redis-Diensts ist Ihr Zielserver bereit, zu einem Replikat der Quelle zu werden. Dazu müssen Sie lediglich einen einzelnen Befehl ausführen, was wir gleich tun werden.
Anmerkung: Wenn Sie über Clients verfügen, die Daten in Ihre Redis-Quellinstanz schreiben, wäre jetzt ein guter Zeitpunkt, um sie so zu konfigurieren, dass sie auch Daten in Ihr Ziel schreiben.
Bislang haben Sie Ihre Redis-Quellinstanz so konfiguriert, dass sie Verbindungen von Ihrem Zielserver akzeptiert, und Ihre Redis-Zielinstanz so eingerichtet, dass sie sich bei der Quelle als Replikat authentifizieren kann. Nachdem Sie diese Aufgaben erledigt haben, können Sie nun Ihre Zielinstanz zu einem Replikat der Quelle machen.
Öffnen Sie zunächst auf Ihrem Redis-Server die Redis-Befehlszeilenschnittstelle:
- redis-cli
Führen Sie den Befehl auth
aus, um die Verbindung zu authentifizieren:
- auth password
Verwandeln Sie als Nächstes die Zielinstanz mit dem Befehl replicaof
in ein Replikat der Quelle. Vergessen Sie nicht, source_server_ip
durch die öffentliche IP-Adresse Ihrer Quellinstanz und source_port
durch den Port zu ersetzen, den Redis in Ihrer Quellinstanz verwendet:
- replicaof source_server_ip source_port
Führen Sie in der Eingabeaufforderung folgenden scan
-Befehl aus: Dadurch werden alle Schlüssel zurückgegeben, die derzeit vom Replikat gehalten werden:
- scan 0
Wenn die Replikation wie erwartet funktioniert, sehen Sie alle Schlüssel von Ihrer Quellinstanz, die in der Replikation enthalten sind. Wenn Sie Ihre Quelle mit den Beispieldaten in Schritt 1 geladen haben, sieht die Ausgabe des Befehls scan
folgendermaßen aus:
Output1) "0"
2) 1) "string3"
2) "string1"
3) "set1"
4) "string2"
5) "hash1"
6) "list1"
Anmerkung: Beachten Sie, dass dieser Befehl die Schlüssel möglicherweise in einer anderen Reihenfolge als in diesem Beispiel zurückgibt.
Wenn dieser Befehl jedoch nicht dieselben Schlüssel zurückgibt, die in Ihrer Redis-Quellinstanz gespeichert sind, kann es sein, dass es in einer der Konfigurationsdateien Ihrer Server einen Fehler gibt, der verhindert, dass sich die Zieldatenbank mit der Quelle verbinden kann. Schließen Sie in diesem Fall die Verbindung zu Ihrer Redis-Zielinstanz und überprüfen Sie, ob Sie die Konfigurationsdateien sowohl auf Ihrem Redis-Quell- als auch auf dem Zielserver richtig bearbeitet haben.
Während die Verbindung geöffnet ist, können Sie auch überprüfen, ob die Schlüssel, die Sie auf Ablauf gesetzt haben, noch flüchtig sind. Führen Sie dazu den Befehl ttl
mit einem dieser Schlüssel als Argument aus:
- ttl hash1
Dadurch wird die Zahl von Sekunden zurückgegeben, bevor dieser Schlüssel gelöscht wird:
Output5430
Nachdem Sie sich vergewissert haben, dass die Daten in Ihrer Quellinstanz richtig mit Ihrem Ziel synchronisiert wurden, können Sie das Ziel wieder zu einer Primärinstanz hochstufen, indem Sie den Befehl replicaof
noch einmal ausführen. Lassen Sie dieses Mal jedoch auf replicaof
keine IP-Adresse und keinen Port folgen, sondern no one
. Das führt unmittelbar dazu, dass die Zielinstanz nicht mehr mit der Quelle synchronisiert wird:
- replicaof no one
Um zu überprüfen, ob die von der Quelle replizierten Daten im Ziel persistent sind, führen Sie erneut den zuvor eingegebenen Befehl scan
aus:
scan 0
In der Ausgabe des Befehls sollten dieselben Schlüssel angezeigt werden wie bei der Ausführung des Befehls scan
, als das Ziel die Quelle noch repliziert hat:
Output1) "0"
2) 1) "string3"
2) "string1"
3) "set1"
4) "string2"
5) "hash1"
6) "list1"
Damit haben Sie alle Daten von Ihrer Redis-Quellinstanz erfolgreich in Ihr Ziel migriert. Wenn Sie über Clients verfügen, die noch Daten in die Quellinstanz schreiben, wäre jetzt ein guter Zeitpunkt, um sie so zu konfigurieren, dass sie ausschließlich in das Ziel schreiben.
Neben der Replikation gibt es weitere Methoden, die Sie zum Migrieren von Daten aus einer Redis-Instanz in eine andere verwenden können. Replikation bietet jedoch den Vorteil, dass relativ wenige Konfigurationsänderungen erforderlich sind und Sie nur einen einzigen Befehl zum Initiieren oder Anhalten benötigen.
Wenn Sie mehr über das Arbeiten mit Redis erfahren möchten, sehen Sie sich unsere Tutorialreihe Verwalten einer Redis-Datenbank an. Wenn Sie Ihre Redis-Daten in eine Redis-Instanz verschieben möchten, die von DigitalOcean verwaltet wird, folgen Sie den entsprechenden Anweisungen in unserem Leitfaden.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!