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

问题描述 投票:163回答:13

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

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

database redis data-migration database-migration
13个回答
103
投票

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

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


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

0
投票

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

你可以在这里找到实用程序:

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


0
投票

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

简而言之:

  1. 设置目标redis(空)作为源redis的slave(包含您的数据)
  2. 等待复制完成
  3. 允许写入目标redis(当前是slave)
  4. 将您的应用切换到目标redis
  5. 等待从master到slave的完成数据流
  6. 将目标redis从master转为slave

另外redis有一些选项允许在分离目标后立即禁用源redis接受写入:

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

本主题涵盖

Redis Labs团队qazxsw poi的非常好的解释

甚至他们的移植互动工具:https://redislabs.com/blog/real-time-synchronization-tool-for-redis-migration


-1
投票

https://github.com/RedisLabs/redis-migrate终于为我工作了。其文档提供了如何转储Redis数据库并将数据插入另一个数据库的示例。


222
投票

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


33
投票

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


17
投票

不管你相信与否,我只是为它做了一篇文章:

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

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


14
投票

现在你也可以使用MIGRATE,从2.6开始提供。

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

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

 ssh [email protected] -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


13
投票

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

SLAVEOF old_instance_name old_instance_port

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

SLAVEOF NO ONE

4
投票

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

启动客户

$redis-cli

然后

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

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


2
投票

你也可以使用rdd

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


1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.