239

I currently have a live redis server running on a cloud instance and I want to migrate this redis server to a new cloud instance and use that instance as my new redis server. If it were MySQL, I would export the DB from the old server and import it into the new server. How should I do this with redis?

P.S.: I'm not looking to set-up replication. I want to completely migrate the redis server to a new instance.

2
  • 7
    Years later... After dealing with various redis related things, I'd suggest going with Tom Clarkson's approach of setting up a slave instance, letting it sync with master and then promoting the slave to master. This will cause a much shorter downtime compared to the answer I accepted, especially if you're dealing with several GBs of redis data. If you can throw in a redis sentinel into this mix, you can do an almost zero downtime migration. Commented Jun 29, 2015 at 5:01
  • I have a remote Redis server and want to copy its data to my locally running Redis server...using dump.rdb might be tricky because I would have to move that data over the network.. Commented Dec 15, 2015 at 23:20

14 Answers 14

343

First, create a dump on 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 

This ensures dump.rdb is completely up-to-date, and shows us where it is stored (/var/lib/redis/dump.rdb in this case). dump.rdb is also periodically written to disk automatically.

Next, copy it to server B:

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

Stop the Redis server on B, copy dump.rdb (ensuring permissions are the same as before), then start.

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 

The version of Redis on B must be greater or equal than that of A, or you may hit compatibility issues.

Sign up to request clarification or add additional context in comments.

8 Comments

Way better than accepted answer, has all the details.
This saved me a lot of time by showing that importing into redis is done by dropping the dump into the redis folder
on a mac the redis backup is stored at /usr/local/var/db/redis/
@DonovanThomson Thanks. (I used homebrew to install redis on mac)... A more generic way to find your path is to use redis command CONFIG GET dir, which returned "/usr/local/var/db/redis"
And what does one do about the writes that went to A during this process?
|
115

Save a snapshot of the database into a dump.rdb by either running BGSAVE or SAVE from the command line. This will create a file named dump.rdb in the same folder as your redis server. See a list of all server commands.

Copy this dump.rdb to the other redis server you want to migrate to. When redis starts up, it looks for this file to initialize the database from.

9 Comments

This leaves me guessing at a couple of things: Where does the SAVE command put its dump? Where does Redis look for a "dump.rdb" file to load a start up? My redis config has dbfilename set to /var/db/redis/redis_state.rdb ... is this the filename I use in place of "dump.rdb"?
Also be aware that you cannot do this swap while your server is running, as calling SHUTDOWN on the running server will save its memory contents to its dump file, thus overwriting the copy you just placed there. First shutdown the server. Then overwrite the dump file. Then start the server again.
If you use AOF logging (in redis.conf, appendonly = yes), set it to no before starting the Redis server--otherwise it will not load the new data set. Once the data set is loaded into memory, turn it back on, both in memory (config set appendonly yes) and in the config file.
On Ubuntu, the Redis conf file is stored in /etc/redis/redis.conf, and you can search through it to find where your .rdb files are: cat /etc/redis/redis.conf | grep "rdb". In my case it's /var/lib/redis
redis-cli config get dir would give you the directory in which .rdb is stored.
|
37

If you have the connectivity between servers it is better to set up replication (which is trivial, unlike with SQL) with the new instance as a slave node - then you can switch the new node to master with a single command and do the move with zero downtime.

3 Comments

I do have connectivity. So I can use the slaveof configuration in the new server and set it to the old server's IP address. But how do I know when the data transfer is complete between the master and the slave? And after that, how do I promote the slave to master?
I think the INFO command will tell you when it is ready. However, that doesn't matter too much - since it is replication rather than a onetime copy, you can leave both nodes in place for as long as you want before switching off the old node. SLAVEOF NONE is the command to promote the new node to master.
Sounds like a great solution — would be nice with some command examples!
25

It is also possible to migrate data using the SLAVEOF command:

SLAVEOF old_instance_name old_instance_port 

Check that you have receive the keys with KEYS *. You could test the new instance by any other way too, and when you are done just turn replication of:

SLAVEOF NO ONE 

Since Redis 5.0 is recommended to use REPLICAOF as SLAVEOF is deprecated - see manual

3 Comments

This is the most painless approach!
Since Redis 5.0, SLAVEOF command got replaced with REPLICAOF
@ThomasLecavelier thanks for the heads up, I've updated the answer. According to the manual it is still valid, though not encouraged, so I updated it accordingly
14

Nowadays you can also use MIGRATE, available since 2.6.

I had to use this since I only wanted to move the data in one database and not all of them. The two Redis instances live on two different machines.

If you can't connect directly to Redis-2 from Redis-1, use ssh port binding:

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

A small script to loop all the keys using KEYS and MIGRATE each key. This is Perl, but hopefully you get the idea:

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

See http://redis.io/commands/migrate for more info.

1 Comment

what is the remote redis you want to migrate to has PASSWORD?
8

Key elements of a zero-downtime migration is:

In short:

  1. setup a target redis (empty) as slave of a source redis (with your data)
  2. wait for replication finish
  3. permit writes to a target redis (which is currently slave)
  4. switch your apps to a target redis
  5. wait for finish datastream from master to slave
  6. turn a target redis from master to slave

Additionally redis have options which allows to disable a source redis to accept writes right after detaching a target:

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

This topic covered by

Very good explanation from RedisLabs team https://redislabs.com/blog/real-time-synchronization-tool-for-redis-migration (use web.archive.org)

And even their interactive tool for migrate: https://github.com/RedisLabs/redis-migrate

Comments

4
source_host=xxx source_port=6379 source_db=10 source_auth=xxx target_host=yyyyy target_port=6379 target_db=12 target_auth=yyyyy redis-cli -a $source_auth -h $source_host -p $source_port -n $source_db keys \* | while read key; do echo "redis-cli -h $source_host -p $source_port -a $source_auth -n $source_db MIGRATE $target_host $target_port "" $target_db 5000 COPY AUTH $target_auth KEYS $key" redis-cli -h $source_host -p $source_port -a $source_auth -n $source_db MIGRATE $target_host $target_port "" $target_db 5000 COPY AUTH $target_auth KEYS $key done 

I's pretty good with my case, tested it.

Comments

4

To check where the dump.rdb has to be placed when importing redis data,

start client

$ redis-cli 

and

then

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

Here /Users/Admin is the location of dump.rdb that is read from server and therefore this is the file that has to be replaced.

Comments

1

you can also use rdd

it can dump & restore a running redis server and allow filter/match/rename dumps keys

Comments

1

I also want to do the same thing: migrate a db from a standalone redis instance to a another redis instances(redis sentinel).

Because the data is not critical(session data), i will give https://github.com/yaauie/redis-copy a try.

Comments

1

The simple way I found to export / Backup Redis data (create dump file ) is to start up a server via command line with slaveof flag and create live replica as follow (assuming the source Redis is 1.2.3.4 on port 6379):

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

3 Comments

I have a redis running on linux machine which i have access. i have a redis on my windows machine. is it possible to copy data for such combination?
I believe you can if both are with the same version
Yes i need to check version also. But windows release version is not above 3.0 as last i know
0

I just published a command line interface utility to npm and github that allows you to copy keys that match a given pattern (even *) from one Redis database to another.

You can find the utility here:

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

Comments

0

Problem: Redis in Cloud, or local, data migration from server1 to server2, using dump.rdb file not working

My Solution:

Step 1. create the dump file, dump.rdb:

Run the create dump command in redis-cli: BGSAVE

Identify the dump dir, command in redis-cli: config get dir response e.g: /data

Step 2. Copy the dump.rdf file from the source to the destination redis server (k8s container with redis or local redis server, use config get dir to identify the folder path)

Step 3. Disable AOF(append only file). Redis uses 2 systems for storing data. One that uses a file to keep records (dump.rdb), or an event sourcing system, style called AOF. AOF is used by default. For migration using a dump file, we need to disable the AOF system. For this, create a text file: redis.config and add a single line:

appendonly no

Step 4. Start the redis server with the config file as command argument. In order to specify a config file run the server with the config file:

redis-server /path/to/redis.conf

Step 5. Validation- Redis will automatically load the dump file. Connect to redis and query for keys, or check the logs for the number of imported entries (e.g keys loaded: 6513):

 1:M 23 May 2024 05:56:20.243 * RDB age 4002 seconds 1:M 23 May 2024 05:56:20.243 * RDB memory usage when created 7.22 Mb 1:M 23 May 2024 05:56:20.629 * Done loading RDB, keys loaded: 6513, keys expired: 0. 

PS: also a good article: https://www.digitalocean.com/community/tutorials/how-to-back-up-and-restore-your-redis-data-on-ubuntu-14-04

Good Luck !

Comments

-3

redis-dump finally worked for me. Its documentation provides an example how to dump a Redis database and insert the data into another one.

1 Comment

This package is not maintained and does not work

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.