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


179

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

PS:我不是要设置复制。我想将Redis服务器完全迁移到新实例。


5
几年后……在处理了各种与Redis相关的问题之后,我建议您使用Tom Clarkson的方法来设置从属实例,让它与主实例同步,然后将从属提升为主实例。与我接受的答案相比,这将导致停机时间大大缩短,尤其是当您要处理数GB的redis数据时。如果您可以将redis前哨添加到该混合中,则可以进行几乎零停机时间迁移。
2015年

我有一台远程Redis服务器,并想将其数据复制到本地运行的Redis服务器...使用dump.rdb可能很棘手,因为我必须通过网络移动该数据。–
Alexander Mills

Answers:


110

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

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


16
这让我猜测以下几点:SAVE命令将其转储放在何处?Redis在哪里寻找“ dump.rdb”文件来加载启动文件?我的redis配置将dbfilename设置为/var/db/redis/redis_state.rdb ...这是我用来代替“ dump.rdb”的文件名吗?
Mojo 2012年

23
另请注意,在服务器运行时无法进行此交换,因为在运行中的服务器上调用SHUTDOWN会将其内存内容保存到其转储文件中,从而覆盖您刚才放置在其中的副本。首先关闭服务器。然后覆盖转储文件。然后再次启动服务器。
侯恩

9
如果使用AOF日志记录(在redis.conf中,appendonly = yes),请no在启动Redis服务器之前将其设置为,否则它将不会加载新的数据集。数据集加载到内存后,请在内存(config set appendonly yes)和配置文件中将其重新打开。
马修·拉兹洛夫

5
在Ubuntu上,Redis conf文件存储在中/etc/redis/redis.conf,您可以搜索它来查找.rdb文件的位置:cat /etc/redis/redis.conf | grep "rdb"。在我的情况是/var/lib/redis
赫尔曼·沙夫

5
redis-cli config get dir会给您.rdb存储目录。
Kishor Pawar

252

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


32
方式比接受的答案更好,具有所有细节。
btk 2014年

1
通过显示转储到redis文件夹中的导入操作,这节省了我很多时间
RonnyKnoxville 2014年

7
在Mac上,redis备份存储在/ usr / local / var / db / redis /
Donovan Thomson

3
@DonovanThomson谢谢。(我使用homebrew在Mac上安装redis)...一种更通用的查找路径的方法是使用redis命令CONFIG GET dir,该命令返回"/usr/local/var/db/redis"
朱利安·索罗

在此过程中,对A进行的写入有什么作用?
Mike Graf

34

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


1
我确实有连接。因此,我可以在新服务器中使用slaveof配置并将其设置为旧服务器的IP地址。但是我怎么知道主机和从机之间何时完成数据传输?在那之后,我如何提升奴隶成为主人?
ErJab 2011年

我认为INFO命令会告诉您何时准备就绪。但是,这没什么大不了的-因为它是复制而不是一次性副本,所以在关闭旧节点之前,可以将两个节点放置任意长时间。SLAVEOF NONE是将新节点提升为主节点的命令。
汤姆·克拉克森

9
听起来像是一个不错的解决方案-结合一些命令示例可以了!
knutole 2014年

17

信不信由你,我为此写了一篇文章:

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

但是我怎么知道主机和从机之间何时完成数据传输?您可以使用INFO命令。


具有讽刺意味的是,如果我访问该页面,则会收到redis错误ahahaha:Warning: Redis::connect(): connect() failed: Connection refused in /www/sites/redis4you.com/include/config.php on line 16 Server error, try again later
flagg19

16

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

SLAVEOF old_instance_name old_instance_port

使用确认您已收到密钥KEYS *。您也可以通过其他任何方式测试新实例,完成后,只需复制以下内容即可:

SLAVEOF NO ONE

这是最轻松的方法!
noooooooob

13

如今,您还可以使用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


您要迁移到的具有密码的远程Redis是什么?
noooooooob

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服务器,并允许过滤器/匹配/重命名转储密钥


2

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

简而言之:

  1. 将目标Redis(空)设置为源Redis(与您的数据)的从属
  2. 等待复制完成
  3. 允许写入目标Redis(当前为从设备)
  4. 将您的应用切换到目标Redis
  5. 等待从主机到从机的完成数据流
  6. 将目标Redis从主机变为从机

另外,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



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

我有可访问的linux机器上运行的redis。我在Windows机器上有一个Redis。是否可以复制这种组合的数据?
卡姆兰·沙希德

1
我相信你可以的,如果两者都使用相同版本
Maoz说撒督

是的,我还需要检查版本。但我最后一次知道Windows发行版并未高于3.0
Kamran Shahid


-2

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.