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

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

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

141025 次浏览

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

复制这个转储。RDB到您想要迁移到的另一个redis服务器。当redis启动时,它会寻找这个文件来初始化数据库。

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

你也可以使用抽样

它可以转储&恢复一个运行中的redis服务器,允许过滤/匹配/重命名转储键

现在,您还可以使用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

首先,在服务器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服务器,复制转储。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上的版本,否则你可能会击中兼容性问题

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

SLAVEOF old_instance_name old_instance_port

检查你是否收到了KEYS *的密钥。你也可以用任何其他方法测试这个新实例,当你完成时,只需打开replication of:

SLAVEOF NO ONE

由于Redis 5.0推荐使用REPLICAOF,因为SLAVEOF已弃用- 参见手册

去查查垃圾场在哪。导入redis数据时必须放置RDB,

开始客户端

$redis-cli

而且

然后

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

这里/Users/Admin是转储的位置。从服务器读取的RDB,因此这是必须被替换的文件。

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

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

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

你可以在这里找到实用工具:

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

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

简而言之:

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

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

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

本主题由

  • < a href = " http://redis。Io /topics/admin#upgrading-or-restart -a-redis-instance-without-downtime" rel="nofollow noreferrer">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

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

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

/usr/bin/redis-server --port 6399 --dbfilename backup_of_master.rdb --slaveof 1.2.3.4 6379
source_host=xxx
source_port=6379
source_db=10
source_auth=xxx


target_host=yyyyy
target_port=6379
target_db=12
target_auth=yyyyy




redis-cli -a $source_auth -h $source_host -p $source_port -n $source_db keys \* | while read key; do
echo "redis-cli -h $source_host -p $source_port -a $source_auth -n $source_db MIGRATE $target_host $target_port "" $target_db 5000 COPY AUTH $target_auth KEYS $key"
redis-cli -h $source_host -p $source_port -a $source_auth -n $source_db MIGRATE $target_host $target_port "" $target_db 5000 COPY AUTH $target_auth KEYS $key
done

我对自己的案子很在行,已经测试过了。