J'ai actuellement un serveur Redis actif sur une instance de cloud et je souhaite migrer ce serveur Redis vers une nouvelle instance de cloud et utiliser cette instance comme mon 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?
P.S .: Je ne cherche pas à configurer la réplication. Je souhaite migrer complètement le serveur Redis vers une nouvelle instance.
Enregistrez un instantané de la base de données dans un fichier dump.rdb en exécutant la commande BGSAVE
ou SAVE
à partir 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 tous les serveurs commandes .
Copiez ce fichier dump.rdb sur l’autre serveur Redis vers lequel vous souhaitez migrer. Lorsque redis démarre, il recherche ce fichier pour initialiser la base de données.
Commencez par créer un cliché 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 dump.rdb
est complètement à jour et nous montre où il est stocké (/var/lib/redis/dump.rdb
dans ce cas). dump.rdb
est également écrit périodiquement sur le disque automatiquement.
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'avant), 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, sinon vous pourrez frapper problèmes de compatibilité .
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 basculer le nouveau nœud en maître avec une seule commande et effectuer le déplacement avec zéro temps d'arrêt.
crois ou pas, je viens de faire un article pour cela:
http://redis4you.com/articles.php?id=005&name=Seamless+migration+from+one+Redis+server+to+another
Mais comment savoir quand le transfert de données entre le maître et l'esclave est terminé? Vous pouvez utiliser la commande INFO.
De nos jours, vous pouvez également utiliser MIGRATE, disponible depuis la version 2.6.
Je devais l'utiliser car je ne voulais déplacer les données que dans une seule base de données. Les deux instances Redis résident sur deux machines différentes.
Si vous ne pouvez pas vous connecter directement à Redis-2 à partir de 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.
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é, il vous suffit de réactiver la réplication de:
SLAVEOF NO ONE
Pour vérifier où le fichier dump.rdb doit être placé lors de l’importation de données Redis,
démarrer client
$redis-cli
et
ensuite
redis 127.0.0.1:6379> CONFIG GET *
1) "dir"
2) "/Users/Admin"
Ici/Utilisateurs/Admin correspond à l'emplacement de dump.rdb qui est lu à partir du serveur. Il s'agit donc du fichier à remplacer.
vous pouvez aussi utiliser rdd
il peut dumper et restaurer un serveur redis en cours d'exécution et autoriser les clés de dumps de filtrage/correspondance/renommer
Je souhaite également 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 donner https://github.com/yaauie/redis-copy à essayer.
Le moyen simple que j'ai trouvé pour exporter/sauvegarder des données Redis (créer un fichier de vidage) est de démarrer un serveur via une ligne de commande avec le drapeau slaveof et de créer une réplique dynamique 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
Je viens de publier un utilitaire d'interface de ligne de commande pour npm et github qui vous permet de copier des clés correspondant à un modèle donné (même *) d'une base de données Redis à une autre.
Vous pouvez trouver l'utilitaire ici:
Les éléments clés d’une migration sans interruption de service sont les suivants:
CONFIG SET slave-read-only no
)En bref:
De plus, redis a des options qui permettent de désactiver une source pour accepter les écritures juste après avoir détaché une cible:
min-slaves-to-write
min-slaves-max-lag
Ce sujet est couvert par
Très bonne explication de la part 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