我目前有一个live redis服务器运行在一个云实例,我想迁移这个redis服务器到一个新的云实例,并使用该实例作为我的新的redis服务器。如果它是MySQL,我将从旧服务器导出DB并将其导入到新服务器。我该如何用redis做到这一点?

附注:我不指望设置复制。我想完全迁移redis服务器到一个新的实例。


当前回答

首先,在服务器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

这确保了转储。RDB是最新的,并显示了它的存储位置(/var/lib/redis/dump)。在本例中是RDB)。转储。RDB还会定期自动写入磁盘。

接下来,将其复制到服务器B:

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

在B上停止Redis服务器,复制转储。RDB(确保权限与以前相同),然后启动。

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

B上的Redis版本必须大于或等于A上的版本,否则可能会遇到兼容性问题。

其他回答

零停机迁移的关键要素是:

复制(http://redis.io/commands/SLAVEOF) 在应用程序切换过程中写入从机的可能性(CONFIG slave-read-only no)

简而言之:

设置一个目标redis(空)作为源redis的从属(与你的数据) 等待复制完成 允许写入目标redis(当前为slave) 将应用程序切换到目标redis 等待数据流从主端转移到从端 将目标redis从主变为从

此外,redis还有一些选项,允许在分离目标后禁用源redis来接受写:

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

本主题由

http://redis.io/topics/admin#upgrading-or-restarting-a-redis-instance-without-downtime

reddislabs团队非常好的解释https://redislabs.com/blog/real-time-synchronization-tool-for-redis-migration(使用web.archive.org)

甚至还有他们的交互式迁移工具:https://github.com/RedisLabs/redis-migrate

首先,在服务器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

这确保了转储。RDB是最新的,并显示了它的存储位置(/var/lib/redis/dump)。在本例中是RDB)。转储。RDB还会定期自动写入磁盘。

接下来,将其复制到服务器B:

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

在B上停止Redis服务器,复制转储。RDB(确保权限与以前相同),然后启动。

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

B上的Redis版本必须大于或等于A上的版本,否则可能会遇到兼容性问题。

如果您在服务器之间有连接,最好将新实例作为从节点设置复制(与SQL不同,这很简单),然后您可以用一个命令将新节点切换到主节点,并且无需停机时间。

现在,您还可以使用MIGRATE,从2.6开始提供。

我必须使用这个,因为我只想移动一个数据库中的数据,而不是所有数据库中的数据。这两个Redis实例位于两台不同的机器上。

如果你不能从Redis-1直接连接到Redis-2,使用ssh端口绑定:

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

一个小脚本,使用keys循环所有键并迁移每个键。这是Perl,但希望您能理解:

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

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

更多信息请参见http://redis.io/commands/migrate。

我还想做同样的事情:将一个db从一个独立的redis实例迁移到另一个redis实例(redis哨兵)。

因为数据不是关键(会话数据),我将尝试https://github.com/yaauie/redis-copy。