Comment déplacer une base de données Redis d'un serveur à un autre?

179

J'ai actuellement un serveur Redis en direct sur une instance cloud et je souhaite migrer ce serveur Redis vers une nouvelle instance cloud et utiliser cette instance comme nouveau serveur Redis. S'il s'agissait de MySQL, j'exporterais la base de données de l'ancien serveur et l'importerais dans le nouveau serveur. Comment dois-je faire cela avec redis?

PS: Je ne cherche pas à configurer la réplication. Je souhaite migrer complètement le serveur redis vers une nouvelle instance.

ErJab
la source
5
Des années plus tard ... Après avoir traité diverses choses liées aux redis, je suggérerais de suivre l'approche de Tom Clarkson consistant à configurer une instance d'esclave, en la laissant se synchroniser avec le maître, puis en faisant la promotion de l'esclave en maître. Cela entraînera un temps d'arrêt beaucoup plus court par rapport à la réponse que j'ai acceptée, surtout si vous avez affaire à plusieurs Go de données redis. Si vous pouvez ajouter une sentinelle redis dans ce mélange, vous pouvez effectuer une migration de temps d'arrêt presque nulle.
ErJab
J'ai un serveur Redis distant et je souhaite copier ses données sur mon serveur Redis fonctionnant localement ... utiliser dump.rdb pourrait être délicat car je devrais déplacer ces données sur le réseau ..
Alexander Mills

Réponses:

110

Enregistrez un instantané de la base de données dans un fichier dump.rdb en exécutant BGSAVEou à SAVEpartir de la ligne de commande. Cela créera un fichier nommé dump.rdb dans le même dossier que votre serveur redis. Voir une liste de toutes les commandes du serveur .

Copiez ce fichier dump.rdb sur l'autre serveur Redis vers lequel vous souhaitez migrer. Lorsque redis démarre, il recherche ce fichier à partir duquel initialiser la base de données.

Anurag
la source
16
Cela me laisse deviner quelques choses: où la commande SAVE place-t-elle son vidage? Où Redis recherche-t-il un fichier "dump.rdb" pour charger un démarrage? Ma configuration redis a dbfilename défini sur /var/db/redis/redis_state.rdb ... est-ce le nom de fichier que j'utilise à la place de "dump.rdb"?
Mojo
23
Sachez également que vous ne pouvez pas effectuer cet échange pendant que votre serveur est en cours d'exécution, car l'appel de SHUTDOWN sur le serveur en cours d'exécution enregistrera le contenu de sa mémoire dans son fichier de vidage, écrasant ainsi la copie que vous venez d'y placer. Arrêtez d'abord le serveur. Ensuite, écrasez le fichier de vidage. Puis redémarrez le serveur.
Houen
9
Si vous utilisez la journalisation AOF (dans redis.conf, appendonly = yes), définissez-la sur noavant de démarrer le serveur Redis, sinon il ne chargera pas le nouvel ensemble de données. Une fois le jeu de données chargé en mémoire, réactivez-le, à la fois dans la mémoire ( config set appendonly yes) et dans le fichier de configuration.
Matthew Ratzloff
5
Sur Ubuntu, le fichier de configuration Redis est stocké dans /etc/redis/redis.conf, et vous pouvez y effectuer des recherches pour trouver où vos .rdbfichiers sont: cat /etc/redis/redis.conf | grep "rdb". Dans mon cas c'est/var/lib/redis
Herman Schaaf
5
redis-cli config get dirvous donnerait le répertoire dans lequel .rdbest stocké.
Kishor Pawar le
253

Commencez par créer un vidage sur le serveur 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

Cela garantit qu'il dump.rdbest complètement à jour et nous montre où il est stocké ( /var/lib/redis/dump.rdbdans ce cas). dump.rdbest également périodiquement écrit automatiquement sur le disque.

Ensuite, copiez-le sur le serveur B:

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

Arrêtez le serveur Redis sur B, copiez dump.rdb (en vous assurant que les autorisations sont les mêmes qu'auparavant), puis démarrez.

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 version de Redis sur B doit être supérieure ou égale à celle de A, ou vous pouvez rencontrer des problèmes de compatibilité .

Wilfred Hughes
la source
32
Bien mieux que la réponse acceptée, a tous les détails.
btk
1
Cela m'a fait gagner beaucoup de temps en montrant que l'importation dans redis se fait en déposant le vidage dans le dossier
redis
7
sur un mac, la sauvegarde redis est stockée dans / usr / local / var / db / redis /
Donovan Thomson
3
@DonovanThomson Merci. (J'ai utilisé homebrew pour installer redis sur mac) ... Un moyen plus générique de trouver votre chemin consiste à utiliser la commande redis CONFIG GET dir, qui est retournée"/usr/local/var/db/redis"
Julian Soro
Et que fait-on des écritures qui sont allées à A pendant ce processus?
Mike Graf
34

Si vous avez la connectivité entre les serveurs, il est préférable de configurer la réplication (ce qui est trivial, contrairement à SQL) avec la nouvelle instance en tant que nœud esclave - vous pouvez alors passer le nouveau nœud en maître avec une seule commande et faire le déplacement avec aucun temps d'arrêt.

Tom Clarkson
la source
1
J'ai une connectivité. Je peux donc utiliser la configuration slaveof dans le nouveau serveur et la définir sur l'adresse IP de l'ancien serveur. Mais comment savoir quand le transfert de données est terminé entre le maître et l'esclave? Et après cela, comment promouvoir l'esclave au rang de maître?
ErJab
Je pense que la commande INFO vous dira quand elle sera prête. Cependant, cela n'a pas trop d'importance - puisqu'il s'agit d'une réplication plutôt que d'une copie unique, vous pouvez laisser les deux nœuds en place aussi longtemps que vous le souhaitez avant de désactiver l'ancien nœud. SLAVEOF NONE est la commande pour promouvoir le nouveau nœud en maître.
Tom Clarkson
9
Cela semble être une excellente solution - ce serait bien avec quelques exemples de commandes!
knutole
16

Il est également possible de migrer des données à l'aide de la commande SLAVEOF:

SLAVEOF old_instance_name old_instance_port

Vérifiez que vous avez reçu les clés avec KEYS *. Vous pouvez également tester la nouvelle instance de toute autre manière, et lorsque vous avez terminé, activez simplement la réplication de:

SLAVEOF NO ONE
estani
la source
C'est l'approche la plus indolore!
noooooooob
13

De nos jours, vous pouvez également utiliser MIGRATE, disponible depuis 2.6.

J'ai dû l'utiliser car je ne voulais déplacer les données que dans une seule base de données et pas toutes. Les deux instances Redis vivent sur deux machines différentes.

Si vous ne pouvez pas vous connecter directement à Redis-2 depuis Redis-1, utilisez la liaison de port ssh:

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

Un petit script pour boucler toutes les clés en utilisant KEYS et MIGRATE chaque clé. C'est Perl, mais j'espère que vous avez l'idée:

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

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

Voir http://redis.io/commands/migrate pour plus d'informations.

Øyvind Skaar
la source
quel est le redis distant vers lequel vous souhaitez migrer a PASSWORD?
noooooooob
4

Pour vérifier où le dump.rdb doit être placé lors de l'importation de données redis,

démarrer le client

$redis-cli

et

puis

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

Ici / Users / Admin est l'emplacement de dump.rdb qui est lu à partir du serveur et c'est donc le fichier qui doit être remplacé.

Vinay Vemula
la source
2

vous pouvez également utiliser rdd

il peut vider et restaurer un serveur Redis en cours d'exécution et autoriser les clés de vidage de filtre / correspondance / renommer

r043v
la source
2

Les éléments clés d'une migration sans temps d'arrêt sont:

  • réplication ( http://redis.io/commands/SLAVEOF )
  • possibilité d'écrire dans un esclave lors de la commutation d'application ( CONFIG SET slave-read-only no)

En bref:

  1. configurer un redis cible (vide) comme esclave d'un redis source (avec vos données)
  2. attendre la fin de la réplication
  3. autoriser les écritures sur un redis cible (qui est actuellement esclave)
  4. basculer vos applications vers un redis cible
  5. attendre la fin du flux de données du maître à l'esclave
  6. transformer une cible redis de maître en esclave

De plus, les redis ont des options qui permettent de désactiver un redis source pour accepter les écritures juste après le détachement d'une cible:

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

Ce sujet couvert par

Très bonne explication de l'équipe RedisLabs https://redislabs.com/blog/real-time-synchronization-tool-for-redis-migration

Et même leur outil interactif pour migrer: https://github.com/RedisLabs/redis-migrate

x'ES
la source
1

Je veux aussi faire la même chose: migrer une base de données d'une instance redis autonome vers une autre instance redis (redis sentinel).

Parce que les données ne sont pas critiques (données de session), je vais essayer https://github.com/yaauie/redis-copy .

tangxinfa
la source
1

Le moyen simple que j'ai trouvé pour exporter / sauvegarder les données Redis (créer un fichier de vidage) est de démarrer un serveur via la ligne de commande avec le drapeau slaveof et de créer une réplique en direct comme suit (en supposant que la source Redis est 1.2.3.4 sur le port 6379):

/usr/bin/redis-server --port 6399 --dbfilename backup_of_master.rdb --slaveof 1.2.3.4 6379
Maoz Zadok
la source
J'ai un redis fonctionnant sur une machine Linux à laquelle j'ai accès. j'ai un redis sur ma machine Windows. est-il possible de copier des données pour une telle combinaison?
Kamran Shahid
1
Je crois que vous pouvez si les deux sont avec la même version
Maoz Zadok
Oui, je dois également vérifier la version. Mais la version Windows n'est pas au-dessus de 3.0 comme je le sais
Kamran Shahid
0

Je viens de publier un utilitaire d'interface de ligne de commande sur npm et github qui vous permet de copier des clés qui correspondent à un modèle donné (même *) d'une base de données Redis à une autre.

Vous pouvez trouver l'utilitaire ici:

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

Gabriel McAdams
la source
-2

redis-dump a finalement fonctionné pour moi. Sa documentation fournit un exemple comment vider une base de données Redis et insérer les données dans une autre.

JustAC0der
la source