Tutorial

Migrieren von Redis-Daten mit Replikation unter Ubuntu 18.04

RedisUbuntu 18.04

Einführung

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.

Voraussetzungen

Um diesem Tutorial zu folgen, benötigen Sie:

Schritt 1 – (optional) Laden Ihrer Redis-Quellinstanz mit Beispieldaten

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.

Schritt 2 — Sichern Ihrer Redis-Quellinstanz

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:

Output
dump.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.

Schritt 3 — Konfigurieren Ihrer Redis-Quellinstanz

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:

/etc/redis/redis.conf
. . .
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:

/etc/redis/redis.conf
. . .
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:

/etc/redis/redis.conf
. . .
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.

Schritt 3 — Konfigurieren Ihrer Redis-Zielinstanz

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:

/etc/redis/redis.conf
. . .
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:

/etc/redis/redis.conf
. . .
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:

/etc/redis/redis.conf
. . .
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.

Schritt 5 — Starten und Verifizieren von Replikation

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:

Output
1) "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:

Output
5430

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:

Output
1) "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.

Zusammenfassung

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.

Creative Commons License