Wie verschiebe ich eine Redis-Datenbank von einem Server auf einen anderen?

179

Ich habe derzeit einen Live-Redis-Server auf einer Cloud-Instanz und möchte diesen Redis-Server auf eine neue Cloud-Instanz migrieren und diese Instanz als meinen neuen Redis-Server verwenden. Wenn es MySQL wäre, würde ich die Datenbank vom alten Server exportieren und auf den neuen Server importieren. Wie soll ich das mit redis machen?

PS: Ich möchte die Replikation nicht einrichten. Ich möchte den Redis-Server vollständig auf eine neue Instanz migrieren.

ErJab
quelle
5
Jahre später ... Nachdem ich mich mit verschiedenen Redis-bezogenen Dingen befasst habe, würde ich vorschlagen, Tom Clarksons Ansatz zu befolgen, eine Slave-Instanz einzurichten, sie mit dem Master synchronisieren zu lassen und dann den Slave zum Master zu befördern. Dies führt zu einer viel kürzeren Ausfallzeit im Vergleich zu der Antwort, die ich akzeptiert habe, insbesondere wenn Sie mit mehreren GB Redis-Daten arbeiten. Wenn Sie einen Redis-Sentinel in diese Mischung einfügen können, können Sie eine Migration ohne Ausfallzeiten durchführen.
ErJab
Ich habe einen Remote-Redis-Server und möchte seine Daten auf meinen lokal ausgeführten Redis-Server kopieren. Die Verwendung von dump.rdb kann schwierig sein, da ich diese Daten über das Netzwerk verschieben müsste.
Alexander Mills

Antworten:

110

Speichern Sie einen Snapshot der Datenbank in einer dump.rdb, indem Sie entweder ausführen BGSAVE oder SAVEüber die Befehlszeile . Dadurch wird eine Datei mit dem Namen dump.rdb im selben Ordner wie Ihr Redis-Server erstellt. Eine Liste aller Serverbefehle anzeigen .

Kopieren Sie diese dump.rdb auf den anderen Redis-Server, auf den Sie migrieren möchten. Wenn redis gestartet wird, sucht es nach dieser Datei, von der aus die Datenbank initialisiert werden kann.

Anurag
quelle
16
Dies lässt mich ein paar Dinge erraten: Wo legt der Befehl SAVE seinen Speicherauszug ab? Wo sucht Redis nach einer "dump.rdb" -Datei, um einen Start zu laden? In meiner Redis-Konfiguration ist der Dateiname auf /var/db/redis/redis_state.rdb gesetzt. Ist dies der Dateiname, den ich anstelle von "dump.rdb" verwende?
Mojo
23
Beachten Sie auch, dass Sie diesen Austausch nicht durchführen können, während Ihr Server ausgeführt wird, da durch Aufrufen von SHUTDOWN auf dem laufenden Server der Speicherinhalt in der Speicherauszugsdatei gespeichert wird und die gerade dort abgelegte Kopie überschrieben wird. Fahren Sie zuerst den Server herunter. Überschreiben Sie dann die Dump-Datei. Starten Sie dann den Server erneut.
Houen
9
Wenn Sie die AOF-Protokollierung (in redis.conf appendonly = yes) verwenden, setzen Sie sie auf, nobevor Sie den Redis-Server starten. Andernfalls wird der neue Datensatz nicht geladen. Sobald der Datensatz in den Speicher geladen wurde, schalten Sie ihn sowohl im Speicher ( config set appendonly yes) als auch in der Konfigurationsdatei wieder ein.
Matthew Ratzloff
5
Unter Ubuntu wird die Redis conf-Datei gespeichert /etc/redis/redis.conf, und Sie können sie durchsuchen, um herauszufinden, wo sich Ihre .rdbDateien befinden : cat /etc/redis/redis.conf | grep "rdb". In meinem Fall ist es/var/lib/redis
Herman Schaaf
5
redis-cli config get dirwürde Ihnen das Verzeichnis geben, in dem .rdbgespeichert ist.
Kishor Pawar
252

Erstellen Sie zunächst einen Speicherauszug auf Server A.

A$ redis-cli
127.0.0.1:6379> CONFIG GET dir
1) "dir"
2) "/var/lib/redis/"
127.0.0.1:6379> SAVE
OK

Dies stellt sicher, dass dump.rdbes vollständig auf dem neuesten Stand ist und zeigt uns, wo es gespeichert ist ( /var/lib/redis/dump.rdbin diesem Fall). dump.rdbwird auch regelmäßig automatisch auf die Festplatte geschrieben.

Kopieren Sie es anschließend auf Server B:

A$ scp /var/lib/redis/dump.rdb myuser@B:/tmp/dump.rdb

Stoppen Sie den Redis-Server auf B, kopieren Sie dump.rdb (stellen Sie sicher, dass die Berechtigungen dieselben sind wie zuvor), und starten Sie dann.

B$ sudo service redis-server stop
B$ sudo cp /tmp/dump.rdb /var/lib/redis/dump.rdb
B$ sudo chown redis: /var/lib/redis/dump.rdb
B$ sudo service redis-server start

Die Version von Redis auf B muss größer oder gleich der von A sein, da sonst Kompatibilitätsprobleme auftreten können .

Wilfred Hughes
quelle
32
Viel besser als akzeptierte Antwort, hat alle Details.
BTK
1
Dies hat mir viel Zeit gespart, indem gezeigt wurde, dass der Import in Redis erfolgt, indem der
Speicherauszug
7
Auf einem Mac wird das Redis-Backup unter / usr / local / var / db / redis /
Donovan Thomson
3
@ DonovanThomson Danke. (Ich habe Homebrew verwendet, um Redis auf einem Mac zu installieren.) ... Eine allgemeinere Methode, um Ihren Pfad zu finden, ist die Verwendung des Befehls CONFIG GET dir"/usr/local/var/db/redis"
Julian Soro
Und was macht man mit den Schreibvorgängen, die während dieses Prozesses an A gingen?
Mike Graf
34

Wenn Sie die Konnektivität zwischen Servern haben, ist es besser, die Replikation (die im Gegensatz zu SQL trivial ist) mit der neuen Instanz als Slave-Knoten einzurichten. Dann können Sie den neuen Knoten mit einem einzigen Befehl auf Master umstellen und den Umzug mit ausführen Keine Ausfallzeit.

Tom Clarkson
quelle
1
Ich habe Konnektivität. So kann ich den Slave der Konfiguration auf dem neuen Server verwenden und ihn auf die IP-Adresse des alten Servers einstellen. Aber woher weiß ich, wann die Datenübertragung zwischen Master und Slave abgeschlossen ist? Und wie befördere ich danach den Sklaven zum Meister?
ErJab
Ich denke, der INFO-Befehl wird Ihnen sagen, wann er fertig ist. Dies spielt jedoch keine große Rolle - da es sich eher um eine Replikation als um eine einmalige Kopie handelt, können Sie beide Knoten so lange an Ort und Stelle lassen, wie Sie möchten, bevor Sie den alten Knoten ausschalten. SLAVEOF NONE ist der Befehl zum Heraufstufen des neuen Knotens zum Master.
Tom Clarkson
9
Klingt nach einer großartigen Lösung - wäre schön mit einigen Befehlsbeispielen!
Knutole
17

Ob Sie es glauben oder nicht, ich habe gerade einen Artikel dafür gemacht:

http://redis4you.com/articles.php?id=005&name=Seamless+migration+from+one+Redis+server+to+another

Aber woher weiß ich, wann die Datenübertragung zwischen Master und Slave abgeschlossen ist? Sie können den Befehl INFO verwenden.

Nick
quelle
Ironischerweise, wenn ich diese Seite besuche, bekomme ich einen Redis-Fehler ahahaha:Warning: Redis::connect(): connect() failed: Connection refused in /www/sites/redis4you.com/include/config.php on line 16 Server error, try again later
flagg19
16

Es ist auch möglich, Daten mit dem Befehl SLAVEOF zu migrieren:

SLAVEOF old_instance_name old_instance_port

Überprüfen Sie, ob Sie die Schlüssel mit erhalten haben KEYS *. Sie können die neue Instanz auch auf andere Weise testen. Wenn Sie fertig sind, aktivieren Sie einfach die Replikation von:

SLAVEOF NO ONE
estani
quelle
Dies ist der schmerzloseste Ansatz!
noooooooob
13

Heutzutage können Sie auch MIGRATE verwenden, das seit 2.6 verfügbar ist.

Ich musste dies verwenden, da ich nur die Daten in eine Datenbank verschieben wollte und nicht alle. Die beiden Redis-Instanzen befinden sich auf zwei verschiedenen Computern.

Wenn Sie von Redis-1 aus keine direkte Verbindung zu Redis-2 herstellen können, verwenden Sie die SSH-Portbindung:

 ssh [email protected] -L 1234:127.0.0.1:6379

Ein kleines Skript zum Schleifen aller Schlüssel mit KEYS und MIGRATE für jeden Schlüssel. Das ist Perl, aber hoffentlich kommt Ihnen die Idee:

 foreach ( $redis_from->keys('*') ) {

    $redis_from->migrate(
        $destination{host},    # localhost in my example
        $destination{port},    # 1234
        $_,                    # The key
        $destination{db},
        $destination{timeout} 
    );
 }

Weitere Informationen finden Sie unter http://redis.io/commands/migrate .

Øyvind Skaar
quelle
Was ist die Remote-Redis, zu der Sie migrieren möchten, mit PASSWORD?
noooooooob
4

Um zu überprüfen, wo die Datei dump.rdb beim Importieren von Redis-Daten abgelegt werden muss,

Client starten

$redis-cli

und

dann

redis 127.0.0.1:6379> CONFIG GET *
 1) "dir"
 2) "/Users/Admin"

Hier ist / Users / Admin der Speicherort von dump.rdb, der vom Server gelesen wird, und daher ist dies die Datei, die ersetzt werden muss.

Vinay Vemula
quelle
2

Sie können auch rdd verwenden

Es kann einen laufenden Redis-Server sichern und wiederherstellen und Dump-Schlüssel zum Filtern / Abgleichen / Umbenennen zulassen

r043v
quelle
1

Ich möchte auch das Gleiche tun: Migrieren Sie eine Datenbank von einer eigenständigen Redis-Instanz zu einer anderen Redis-Instanz (Redis Sentinel).

Da die Daten nicht kritisch sind (Sitzungsdaten), werde ich https://github.com/yaauie/redis-copy ausprobieren.

Tangxinfa
quelle
1

Schlüsselelemente einer Migration ohne Ausfallzeiten sind:

Zusamenfassend:

  1. Richten Sie ein Ziel-Redis (leer) als Slave eines Quell-Redis (mit Ihren Daten) ein.
  2. Warten Sie, bis die Replikation abgeschlossen ist
  3. Erlaubnis schreibt in ein Ziel Redis (das derzeit Slave ist)
  4. Schalten Sie Ihre Apps auf ein Ziel-Redis um
  5. Warten Sie, bis der Datenstrom vom Master zum Slave beendet ist
  6. Schalten Sie ein Ziel von Master zu Slave

Zusätzlich haben Redis Optionen, mit denen ein Quell-Redis deaktiviert werden kann, um Schreibvorgänge direkt nach dem Trennen eines Ziels zu akzeptieren:

  • min-slaves-to-write
  • min-slaves-max-lag

Dieses Thema wird von behandelt

Sehr gute Erklärung vom RedisLabs-Team https://redislabs.com/blog/real-time-synchronization-tool-for-redis-migration

Und sogar ihr interaktives Tool für die Migration: https://github.com/RedisLabs/redis-migrate

x'ES
quelle
1

Die einfache Möglichkeit, Redis-Daten zu exportieren / zu sichern (Dump-Datei erstellen), besteht darin, einen Server über die Befehlszeile mit dem Slaveof-Flag zu starten und ein Live-Replikat wie folgt zu erstellen (vorausgesetzt, die Quelle Redis ist 1.2.3.4 auf Port 6379):

/usr/bin/redis-server --port 6399 --dbfilename backup_of_master.rdb --slaveof 1.2.3.4 6379
Maoz Zadok
quelle
Ich habe ein Redis auf einem Linux-Computer, auf den ich Zugriff habe. Ich habe ein Redis auf meinem Windows-Computer. Ist es möglich, Daten für eine solche Kombination zu kopieren?
Kamran Shahid
1
Ich glaube, Sie können, wenn beide mit der gleichen Version sind
Maoz Zadok
Ja, ich muss auch die Version überprüfen. Aber Windows Release-Version ist nicht über 3.0, wie ich zuletzt wusste
Kamran Shahid
0

Ich habe gerade ein Befehlszeilenschnittstellen-Dienstprogramm für npm und github veröffentlicht, mit dem Sie Schlüssel, die einem bestimmten Muster (sogar *) entsprechen, von einer Redis-Datenbank in eine andere kopieren können.

Das Dienstprogramm finden Sie hier:

https://www.npmjs.com/package/redis-utils-cli

Gabriel McAdams
quelle
-2

redis-dump hat endlich bei mir funktioniert. Die Dokumentation enthält ein Beispiel für das Speichern einer Redis-Datenbank und das Einfügen der Daten in eine andere.

JustAC0der
quelle