我目前有一个在云实例上运行的实时redis服务器,我想将这个redis服务器迁移到新的云实例,并将该实例用作我的新redis服务器。如果是MySQL,我会从旧服务器导出数据库并将其导入新服务器。我应该如何用redis做到这一点?
P.S。:我不打算设置复制。我想将redis服务器完全迁移到新实例。
我发现导出/备份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
我刚刚向npm和github发布了一个命令行界面实用程序,它允许您将匹配给定模式(甚至*)的键从一个Redis数据库复制到另一个。
你可以在这里找到实用程序:
零停机迁移的关键要素是:
CONFIG SET slave-read-only no
)简而言之:
另外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
https://github.com/RedisLabs/redis-migrate终于为我工作了。其文档提供了如何转储Redis数据库并将数据插入另一个数据库的示例。
首先,在服务器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。
如果你有服务器之间的连接,最好设置复制(这与微软不同,与SQL不同),新实例作为从属节点 - 然后你可以用一个命令将新节点切换到主节点并执行移动零停机时间。
不管你相信与否,我只是为它做了一篇文章:
http://redis4you.com/articles.php?id=005&name=Seamless+migration+from+one+Redis+server+to+another
但是,如何知道主站和从站之间的数据传输何时完成?您可以使用INFO命令。
现在你也可以使用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。
也可以使用SLAVEOF命令迁移数据:
SLAVEOF old_instance_name old_instance_port
检查您是否收到了KEYS *
的钥匙。您也可以通过任何其他方式测试新实例,并在完成后转动复制:
SLAVEOF NO ONE
要在导入redis数据时检查dump.rdb的放置位置,
启动客户
$redis-cli
和
然后
redis 127.0.0.1:6379> CONFIG GET *
1) "dir"
2) "/Users/Admin"
这里/ Users / Admin是从服务器读取的dump.rdb的位置,因此这是必须替换的文件。
你也可以使用rdd
它可以转储和恢复正在运行的redis服务器并允许过滤/匹配/重命名转储密钥
我还想做同样的事情:将数据库从独立的redis实例迁移到另一个redis实例(redis sentinel)。
因为数据不重要(会话数据),我会尝试https://github.com/yaauie/redis-copy。