如何将redis数据库从一台服务器移动到另一台服务器?

时间:2011-05-14 21:31:33

标签: database redis data-migration database-migration

我目前有一个在云实例上运行的实时redis服务器,我想将此redis服务器迁移到新的云实例,并将该实例用作我的新redis服务器。如果是MySQL,我会从旧服务器导出数据库并将其导入新服务器。我应该如何用redis做到这一点?

P.S。:我不打算设置复制。我想将redis服务器完全迁移到新实例。

13 个答案:

答案 0 :(得分:214)

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

这可以确保dump.rdb完全是最新的,并向我们显示它的存储位置(在这种情况下为/var/lib/redis/dump.rdb)。 dump.rdb也会定期自动写入磁盘。

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

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

停止B上的Redis服务器,复制dump.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的版本,或者您可以点击compatibility issues

答案 1 :(得分:97)

通过从命令行运行BGSAVESAVE,将数据库的快照保存到dump.rdb中。这将在与redis服务器相同的文件夹中创建名为dump.rdb的文件。查看所有服务器commands的列表。

将此dump.rdb复制到要迁移到的其他redis服务器。当redis启动时,它会查找此文件以从中初始化数据库。

答案 2 :(得分:33)

如果你有服务器之间的连接,最好设置复制(这与微软不同,与SQL不同),新实例作为从属节点 - 然后你可以用一个命令将新节点切换到主节点零停机时间。

答案 3 :(得分:17)

信不信由你,我刚刚为它做了文章:

http://redis4you.com/articles.php?id=005&name=Seamless+migration+from+one+Redis+server+to+another

  
    
      

但是如何知道主设备和从设备之间的数据传输何时完成?       您可以使用INFO命令。

    
  

答案 4 :(得分:14)

现在您也可以使用MIGRATE,自2.6以来可用。

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

如果无法从Redis-1直接连接到Redis-2,请使用ssh端口绑定:

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

使用KEYS和MIGRATE每个键循环所有键的小​​脚本。这是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

答案 5 :(得分:13)

也可以使用SLAVEOF命令迁移数据:

SLAVEOF old_instance_name old_instance_port

检查您是否收到了KEYS *的密钥。您也可以通过任何其他方式测试新实例,完成后只需转换复制:

SLAVEOF NO ONE

答案 6 :(得分:4)

要在导入redis数据时检查dump.rdb的放置位置,

启动客户端

$redis-cli

然后

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

此处/ Users / Admin是从服务器读取的dump.rdb的位置,因此这是必须替换的文件。

答案 7 :(得分:2)

您也可以使用rdd

它可以转储&恢复正在运行的redis服务器并允许过滤/匹配/重命名转储密钥

答案 8 :(得分:1)

我发现导出/备份Redis数据(创建转储文件)的简单方法是通过带有slaveof标志的命令行启动服务器并创建实时副本,如下所示(假设源Redis在端口6379上为1.2.3.4) :

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

答案 9 :(得分:0)

我也想做同样的事情:将数据库从独立的redis实例迁移到另一个redis实例(redis sentinel)。

由于数据不重要(会话数据),我会尝试https://github.com/yaauie/redis-copy

答案 10 :(得分:0)

我刚刚向npm和github发布了一个命令行界面实用程序,它允许您将匹配给定模式(甚至*)的键从一个Redis数据库复制到另一个。

您可以在此处找到该实用程序:

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

答案 11 :(得分:0)

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

简而言之:

  1. 将目标redis(空)设置为源redis(包含您的数据)的奴隶
  2. 等待复制完成
  3. 允许写入目标redis(当前为slave)
  4. 将您的应用切换为目标redis
  5. 等待从master到slave的完成数据流
  6. 将目标redis从master转为slave
  7. 此外,redis还有一些选项可以在分离目标后立即禁用源redis接受写入:

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

    涵盖了此主题

    RedisLabs团队https://redislabs.com/blog/real-time-synchronization-tool-for-redis-migration

    的非常好的解释

    甚至他们的移植互动工具:https://github.com/RedisLabs/redis-migrate

答案 12 :(得分:-1)

redis-dump终于为我工作了。其文档提供了如何转储Redis数据库并将数据插入另一个数据库的示例。