我目前有一个live redis服务器运行在一个云实例,我想迁移这个redis服务器到一个新的云实例,并使用该实例作为我的新的redis服务器。如果它是MySQL,我将从旧服务器导出DB并将其导入到新服务器。我该如何用redis做到这一点?
附注:我不指望设置复制。我想完全迁移redis服务器到一个新的实例。
我目前有一个live redis服务器运行在一个云实例,我想迁移这个redis服务器到一个新的云实例,并使用该实例作为我的新的redis服务器。如果它是MySQL,我将从旧服务器导出DB并将其导入到新服务器。我该如何用redis做到这一点?
附注:我不指望设置复制。我想完全迁移redis服务器到一个新的实例。
当前回答
我刚刚发布了一个命令行接口实用程序到npm和github,它允许你从一个Redis数据库复制匹配给定模式(甚至*)的键到另一个。
你可以在这里找到实用工具:
https://www.npmjs.com/package/redis-utils-cli
其他回答
零停机迁移的关键要素是:
复制(http://redis.io/commands/SLAVEOF) 在应用程序切换过程中写入从机的可能性(CONFIG slave-read-only no)
简而言之:
设置一个目标redis(空)作为源redis的从属(与你的数据) 等待复制完成 允许写入目标redis(当前为slave) 将应用程序切换到目标redis 等待数据流从主端转移到从端 将目标redis从主变为从
此外,redis还有一些选项,允许在分离目标后禁用源redis来接受写:
min-slaves-to-write min-slaves-max-lag
本主题由
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
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
我对自己的案子很在行,已经测试过了。
现在,您还可以使用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。
您也可以使用RDD
它可以转储和恢复一个运行的redis服务器,并允许过滤/匹配/重命名转储键
去查查垃圾场在哪。导入redis数据时必须放置RDB,
开始客户端
$ redis-cli
and
then
redis 127.0.0.1:6379> CONFIG GET *
1) "dir"
2) "/Users/Admin"
这里/Users/Admin是转储的位置。从服务器读取的RDB,因此这是必须被替换的文件。