199

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

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

4

12 回答 12

290

首先,在服务器 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 的版本,否则可能会遇到兼容性问题

于 2014-02-25T19:31:05.750 回答
112

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

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

于 2011-05-14T22:40:14.443 回答
34

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

于 2011-05-15T01:34:07.717 回答
20

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

SLAVEOF old_instance_name old_instance_port

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

SLAVEOF NO ONE

REPLICAOF由于不推荐使用 Redis 5.0 SLAVEOF-请参阅手册

于 2014-09-22T11:27:19.183 回答
13

现在你也可以使用 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

于 2014-02-07T15:35:00.947 回答
5

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

简而言之:

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

此外,redis 具有允许在分离目标后立即禁用源 redis 以接受写入的选项:

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

本主题涵盖

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

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

于 2016-09-08T20:50:52.187 回答
4

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

启动客户端

$redis-cli

然后

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

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

于 2014-12-31T07:29:18.817 回答
1

你也可以使用rdd

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

于 2012-09-19T18:56:17.453 回答
1

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

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

于 2016-01-21T02:44:12.090 回答
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
于 2017-11-30T11:32:40.147 回答
0

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

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

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

于 2016-02-24T23:45:36.127 回答
-3

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

于 2017-06-16T12:32:49.837 回答