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