Come posso spostare un database redis da un server a un altro?


179

Al momento ho un server redis live in esecuzione su un'istanza cloud e desidero migrare questo server redis su una nuova istanza cloud e utilizzare quell'istanza come nuovo server redis. Se fosse MySQL, esporterei il DB dal vecchio server e lo importerei nel nuovo server. Come dovrei farlo con Redis?

PS: Non sto cercando di impostare la replica. Voglio migrare completamente il server redis in una nuova istanza.


5
Anni dopo ... Dopo aver affrontato varie cose relative al Redis, suggerirei di seguire l'approccio di Tom Clarkson di impostare un'istanza di slave, lasciandolo sincronizzare con il master e quindi promuovere lo slave come master. Ciò causerà tempi di inattività molto più brevi rispetto alla risposta che ho accettato, soprattutto se hai a che fare con diversi GB di dati redis. Se riesci a inserire una sentinella redis in questo mix, puoi eseguire una migrazione dei tempi di inattività quasi zero.
ErJab,

Ho un server Redis remoto e voglio copiare i suoi dati sul mio server Redis localmente in esecuzione ... l'uso di dump.rdb potrebbe essere complicato perché dovrei spostare quei dati sulla rete ..
Alexander Mills

Risposte:


110

Salvare un'istantanea del database in un dump.rdb eseguendo BGSAVEo SAVEdalla riga di comando. Questo creerà un file chiamato dump.rdb nella stessa cartella del tuo server redis. Visualizza un elenco di tutti i comandi del server .

Copia questo dump.rdb sull'altro server redis su cui vuoi migrare. All'avvio di redis, cerca questo file da cui inizializzare il database.


16
Questo mi lascia indovinare un paio di cose: dove inserisce il comando SAVE il suo dump? Dove Redis cerca un file "dump.rdb" per caricare un avvio? La mia configurazione redis ha dbfilename impostato su /var/db/redis/redis_state.rdb ... è questo il nome del file che uso al posto di "dump.rdb"?
Mojo,

23
Inoltre, tieni presente che non puoi eseguire questo scambio mentre il tuo server è in esecuzione, poiché chiamando SHUTDOWN sul server in esecuzione salverà il contenuto della sua memoria nel suo file di dump, sovrascrivendo così la copia che hai appena inserito. Prima spegni il server. Quindi sovrascrivere il file di dump. Quindi riavviare il server.
Houen,

9
Se si utilizza la registrazione AOF (in redis.conf, appendonly = yes), impostarlo su noprima di avviare il server Redis, altrimenti non caricherà il nuovo set di dati. Una volta che il set di dati è stato caricato in memoria, riaccenderlo, sia in memory ( config set appendonly yes) che nel file di configurazione.
Matthew Ratzloff l'

5
Su Ubuntu, il file conf Redis è memorizzato in /etc/redis/redis.conf, e si può cercare attraverso di essa per trovare dove i .rdbfile sono: cat /etc/redis/redis.conf | grep "rdb". Nel mio caso è/var/lib/redis
Herman Schaaf,

5
redis-cli config get dirti darebbe la directory in cui .rdbè memorizzato.
Kishor Pawar,

253

Innanzitutto, crea un dump sul 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

Ciò garantisce che dump.rdbsia completamente aggiornato e che ci mostri dove è archiviato ( /var/lib/redis/dump.rdbin questo caso). dump.rdbinoltre viene periodicamente scritto automaticamente su disco.

Quindi, copiarlo sul server B:

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

Arrestare il server Redis su B, copiare dump.rdb (accertandosi che le autorizzazioni siano le stesse di prima), quindi avviare.

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

La versione di Redis su B deve essere maggiore o uguale a quella di A, altrimenti potresti riscontrare problemi di compatibilità .


32
Molto meglio della risposta accettata, ha tutti i dettagli.
proposito

1
Questo mi ha fatto risparmiare un sacco di tempo, dimostrando che l'importazione in redis viene eseguita facendo cadere il dump nella cartella
redis

7
su un mac il backup di redis è archiviato in / usr / local / var / db / redis /
Donovan Thomson

3
@DonovanThomson Grazie. (Ho usato homebrew per installare redis su mac) ... Un modo più generico per trovare il tuo percorso è usare il comando redis CONFIG GET dir, che è tornato"/usr/local/var/db/redis"
Julian Soro,

E cosa si fa delle scritture che sono state inviate ad A durante questo processo?
Mike Graf,

34

Se hai la connettività tra i server, è meglio impostare la replica (che è banale, a differenza di SQL) con la nuova istanza come nodo slave - quindi puoi passare il nuovo nodo a master con un singolo comando e fare lo spostamento con zero tempi di inattività.


1
Ho connettività. Quindi posso usare la configurazione slaveof nel nuovo server e impostarla sull'indirizzo IP del vecchio server. Ma come faccio a sapere quando il trasferimento dei dati è completo tra il master e lo slave? E dopo, come promuovo lo schiavo a padroneggiare?
ErJab,

Penso che il comando INFO ti dirà quando è pronto. Tuttavia, non importa troppo: poiché si tratta della replica piuttosto che di una copia precedente, è possibile lasciare entrambi i nodi in posizione per tutto il tempo che si desidera prima di spegnere il vecchio nodo. SLAVEOF NONE è il comando per promuovere il nuovo nodo da padroneggiare.
Tom Clarkson,

9
Sembra un'ottima soluzione - sarebbe bello con alcuni esempi di comandi!
Knutole,

16

È anche possibile migrare i dati usando il comando SLAVEOF:

SLAVEOF old_instance_name old_instance_port

Verifica di aver ricevuto le chiavi con KEYS *. Potresti testare la nuova istanza anche in qualsiasi altro modo e quando hai finito basta girare la replica di:

SLAVEOF NO ONE

Questo è l'approccio più indolore!
noooooooob,

13

Oggi puoi anche usare MIGRATE, disponibile dalla 2.6.

Ho dovuto usare questo dato che volevo solo spostare i dati in un database e non tutti. Le due istanze Redis vivono su due macchine diverse.

Se non riesci a connetterti direttamente a Redis-2 da Redis-1, usa l'associazione della porta ssh:

 ssh user@redis-2.foo.com -L 1234:127.0.0.1:6379

Un piccolo script per eseguire il ciclo di tutti i tasti usando KEYS e MIGRATE ogni tasto. Questo è Perl, ma spero che tu abbia l'idea:

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

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

Vedi http://redis.io/commands/migrate per maggiori informazioni.


qual è il redis remoto che vuoi migrare ha PASSWORD?
noooooooob,

4

Per verificare dove deve essere posizionato dump.rdb durante l'importazione dei dati redis,

avviare il client

$redis-cli

e

poi

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

Qui / Users / Admin è il percorso di dump.rdb che viene letto dal server e quindi questo è il file che deve essere sostituito.


2

puoi anche usare rdd

può eseguire il dump e il ripristino di un server redis in esecuzione e consentire le chiavi di dump di filtro / corrispondenza / ridenominazione


2

Gli elementi chiave di una migrazione a zero downtime sono:

In breve:

  1. imposta un redis di destinazione (vuoto) come slave di un redis di origine (con i tuoi dati)
  2. attendere il completamento della replica
  3. permesso scrive su un redis target (che è attualmente slave)
  4. passa le tue app a un redis target
  5. attendere il completamento del flusso di dati dal master allo slave
  6. trasforma un bersaglio redis da maestro a schiavo

Inoltre i redis hanno opzioni che consentono di disabilitare un redis di origine per accettare le scritture subito dopo aver staccato un target:

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

Questo argomento è stato trattato da

Ottima spiegazione dal team di RedisLabs https://redislabs.com/blog/real-time-synchronization-tool-for-redis-migration

E anche il loro strumento interattivo per la migrazione: https://github.com/RedisLabs/redis-migrate



1

Il modo semplice che ho trovato per esportare / eseguire il backup dei dati Redis (creare un file di dump) è avviare un server tramite riga di comando con flag slaveof e creare una replica live come segue (supponendo che il Redis di origine sia 1.2.3.4 sulla porta 6379):

/usr/bin/redis-server --port 6399 --dbfilename backup_of_master.rdb --slaveof 1.2.3.4 6379

Ho un redis in esecuzione su una macchina Linux a cui ho accesso. ho un redis sul mio computer Windows. è possibile copiare i dati per tale combinazione?
Kamran Shahid,

1
Credo che puoi farlo se entrambi sono con la stessa versione
Maoz Zadok,

Sì, ho bisogno di controllare anche la versione. Ma la versione di Windows non è al di sopra della 3.0, per quanto ne so per ultima
Kamran Shahid,


-2

redis-dump ha finalmente funzionato per me. La sua documentazione fornisce un esempio su come scaricare un database Redis e inserire i dati in un altro.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.